java中的常量池技术.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
java中的常量池技术

java常量池技术 java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。   String类也是java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术。   测试代码如下:   public class Test{   public static void main(String[] args){   //s1,s2分别位于堆中不同空间   String s1=new String(hello);   String s2=new String(hello);   System.out.println(s1==s2);//输出false   //s3,s4位于池中同一空间   String s3=hello String s4=hello;   System.out.println(s3==s4);//输出true   }   }   用new String()创建的字符串不是常量,不能在编译期就确定,所以new String()创建的字符串不放入常量池中,他们有自己的地址空间。   String 对象(内存)的不变性机制会使修改String字符串时,产生大量的对象,因为每次改变字符串,都会生成一个新的String。 java 为了更有效的使用内存,常量池在编译期遇见String 字符串时,它会检查该池内是否已经存在相同的String 字符串,如果找到,就把新变量的引用指向现有的字符串对象,不创建任何新的String 常量对象,没找到再创建新的。所以对一个字符串对象的任何修改,都会产生一个新的字符串对象,原来的依然存在,等待垃圾回收。   代码:   String a = “test”;   String b = “test”;   String b = b+java;   a,b同时指向常量池中的常量值text,b=b+java之后,b原先指向一个常量,内容为test”,通过对b进行+java 操作后,b之前所指向的那个值没有改变,但此时b不指向原来那个变量值了,而指向了另一个String变量,内容为”text java“。原来那个变量还存在于内存之中,只是b这个变量不再指向它了。   八种基本类型的包装类和对象池 java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。 一些对应的测试代码:   public class Test{ public static void main(String[] args){   //5种整形的包装类Byte,Short,Integer,Long,Character的对象,   //在值小于127时可以使用常量池   Integer i1=127;   Integer i2=127;   System.out.println(i1==i2); //输出true   //值大于127时,不会从常量池中取对象   Integer i3=128;   Integer i4=128;   System.out.println(i3==i4); //输出false   //Boolean类也实现了常量池技术   Boolean bool1=true;   Boolean bool2=true;   System.out.println(bool1==bool2); //输出true   //浮点类型的包装类没有实现常量池技术   Double d1=1.0;   Double d2=1.0;   System.out.println(d1==d2); //输出false   }   }   对Integer对象的代码补充   public static Integer valueOf(int i) {   final int offset = 128;   if (i = -128 i = 127) {   return IntegerCache.cache[i + offset];   }   return new Integer(i);   }   当你直接给一个Integ

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档