java中的常量池技术

java中的常量池技术

ID:27780819

大小:53.00 KB

页数:4页

时间:2018-12-06

java中的常量池技术_第1页
java中的常量池技术_第2页
java中的常量池技术_第3页
java中的常量池技术_第4页
资源描述:

《java中的常量池技术》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、java常量池技术java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,不同于使用关键字创建的对象所在的堆空间。String类也是java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术。测试代码如下:publicclassTest{publicstaticvoidmain(String[]args){//sl,s2分别位于堆中不同空间Stringsl=n

2、ewString(〃hello〃);Strings2=newString(〃hello〃);System,out.printIn(sl==s2);//输出false//s3,s4位于池中同一空间StringsS’hello"Strings4=,/hello”;System,out.printIn(s3==s4);//输出true用newString()创建的字符串不是常量,不能在编译期就确定,所以newString()创建的字符串不放入常量池中,他们有自己的地址空间。String对象(内存)的不变性机制会使修改String

3、字符串时,产生大量的对象,因为每次改变字符串,都会生成一个新的String。java为了更有效的使用内存,常量池在编译期遇见String字符串时,它会检奔该池内是否已经存在相同的String字符串,如果找到,就把新变量的引用指向现有的字符串对象,不创建任何新的String常量对象,没找到再创建新的。所以对一个字符串对象的任何修改,都会产生一个新的字符串对象,原来的依然存在,等待垃圾回收。代码:Stringa=“test”;Stringb=“test”;Stringb=b+〃java〃;a,b同时指向常量池中的常量值"tex

4、t",b=b+"java"之后,b原先指向一个常量,内容为"tost”,通过对b进行+"java〃操作后,b之前所指向的那个值没有改变,但此时b不指向原来那个变量值了,而指向了男一个String变量,内容为”textjava“。原来那个变量还存在于内存之中,只是b这个变量不再指向它了。八种基本类型的包装类和对象池java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另夕卜Byte,Short,I

5、nteger,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。一些对应的测试代码:publicclassTest{publicstaticvoidmain(String[]args){//5种整形的包装类Byte,Short,Integer,Long,Character的对象,//在值小于127时可以使用常量池Integeri1=127;Integeri2=127;System,out.printIn(il==i2);//输出tr

6、ue//值大于127时,不会从常量池中取对象Integeri3=128;Integeri4=128;System,out.printIn(i3==i4);//输出false//Boolean类也实现了常量池技术Booleanbooll=truc;Booleanbool2=truc;System,out.printIn(booll==bool2);//输出true//浮点类型的包装类没有实现常量池技术Doubledl=l.0;Doubled2=l.0;System,out.printIn(dl==d2);//输出false}

7、}对Integer对象的代码补充publicstaticIntegervalucOf(inti){finalintoffset=128;if(i>=-128&&i<=127){returnIntcgcrCachc.cache[i+offset];}returnnewInteger(i);}当你直接给一个Integer对象一个int值的时候,其实它调用了valueOf方法,然后你赋的这个值很特别,是128,那么没有进行cache方法,相当于new了两个新对象。所以问题中定义a、b的两句代码就类似于:Integera=newI

8、nteger(128);Integerb=newInteger(128);这个时候再问你,输出结果是什么?你就知道是false了。如果把这个数换成127,再执行:Integera=127;Integerb=127;System,out.println(a==b);结果就是:true进行对象比较时最好还是

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。