Java 中关于常量池与缓存类的一点理解
来源:互联网 发布:凤凰金融 以大数据 编辑:程序博客网 时间:2024/05/17 04:21
先来看这么一段代码
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 咯。
最后谢谢论坛大佬们的帮助。
0 0
- Java 中关于常量池与缓存类的一点理解
- Java常量池的一点理解
- java中关于栈、堆、常量池介绍和关于String类的理解
- 关于java中String的一点理解
- 关于java中多线程的一点理解
- 关于java中,类、内部类的一点理解
- java中栈.堆.常量池和关于String类的理解
- 关于Java常量定义的一点思考
- 关于Java常量定义的一点思考
- c++中枚举常量与宏常量的一点区别
- 关于Java中static方法的一点理解
- 常量池与缓存类
- 关于SDWebImage内存缓存的一点简单理解-King
- java常量池的理解
- 关于openlayers中namespace的一点理解
- 关于java数组的一点理解
- JAVA中变量和常量的理解
- Java常量池理解与总结
- 14.布局
- C++构造函数初始化列表
- org.hibernate.MappingException: entity class not found
- VS 2013控制台应用程序DLL生成与调用
- 欢迎使用CSDN-markdown编辑器
- Java 中关于常量池与缓存类的一点理解
- Codeforces Round #382 (Div. 1) B. Taxes
- Android中WebView最常用的属性
- OpenCV中imread失败cvLoadImage成功
- css3轮播图
- java \\u \u 转换
- css阴影效果实现方法
- 知识库--The HttpProcessor Class
- PHP中“简单工厂模式”实例讲解