Java 中关于常量池与缓存类的一点理解

先来看这么一段代码

String str1 = "123";  
String str2 = "123";  
System.out.println(str1 == str2);  
String str3 = new String("123");  
System.out.println(str1 == str3);  
str3 = str3.intern();  
System.out.println(str1 == str3);     

输出的是true,false,true。

当使用String str = "abc" 的形式创建对象的时候,会首先在字符串池中寻找是否存在abc,如果存在则返回它的引用;如果没有,则将abc添加到字符串池中,然后返回引用。

但当用new创建对象的时候则是直接创建新的对象,不去检查字符串池,所以str1与str3两者指向内存地址不同。

如果要主动扩充字符串池,可以使用String.intern(),该方法会在字符串池中查找与调用该方法的字符串有相同Unicode码的字符串,如果有,则返回其引用;如果没有,则将该字符串添加到字符串池中,并返回其引用。代码中的最后两行就是将str3添加到字符串常量中,并赋给str3,所以str1与str3又指向相同对象了。

再来看下面代码

Integer a = 12;  
Integer b = a;  
a= 3;  
System.out.println(a);  
System.out.println(b);  

最后输出的是 3,12。

执行完 b = a ,是将a的引用传给了b。我原本以为当执行了 a = 3 后,b中的值也会发生改变,但并不是如此。

在这里,有一个IntegerCache缓存类,它提前缓存好了-127 到 128,所以当你 Integer a = 12; 其实在这之前就已经存在12的实例了,只是将它的引用赋给了 a,所以下面一句 a = 3 只是改变了a 的引用,所当然不会影响到 b 咯。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转自http://blog.csdn.net/dmk877/article/details/49420141 无论...
    我是陈君本阅读 4,001评论 2 2
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,430评论 0 3
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 5,157评论 0 4
  • 狐狸是世道的愚弄者,在它嘴里,黑白颠倒,是非不分,偏偏人们只看到它表面的能言善辩,而忘了它真正的的思想——愚弄大众...
    我没尴尬过阅读 2,454评论 0 0
  • 用户列表文件:/etc/passwd用户组列表文件:/etc/group 查看系统中有哪些用户:cut -d : ...
    一指弹风阅读 1,810评论 0 0

友情链接更多精彩内容