字符串常量池及byte数据常量池
来源:互联网 发布:js 用法 编辑:程序博客网 时间:2024/06/06 12:59
Byte型数据缓冲池
Demo1
public class BufferPoolDemo { public static void main(String[] args) { Integer i1=127; Integer i2=127; System.out.println(i1==i2); System.out.println("------------"); Integer i3=128; Integer i4=128; System.out.println(i3==i4); System.out.println("------------"); }}
运行结果
问题
为什么一个为true,一个为false呢?为何不是true,true,或false,false呢?
分析
- Integer在定义一个数据对象时,在直接赋值这种情况下(Integer i1=127;而不是new出来的),当赋值数据在byte数据取值范围内时,会先去方法区中的Byte常量池中去找有没有127这个值,如果有,直接将这个值得引用赋值给i1,如果没有的话就分配一个内存空间,然后再把引用赋值给i1。当然这里常量池中没有127这个值,那么久直接给127分配一个空间,然后将其引用赋值给i1;同理,Integer i2=127;时会在缓冲池中找到这个值,那么直接将这个值得引用给i2,所以i1和i2的地址值都是相同的,所以输出为true。
- 由于128没在byte数据取值范围内,Integer i3=128;Integer i4=128;等同于Integer i3=new Integer(128);Integer i4=new Integer(128);那么先去堆中各自开辟一个空间,并分别将其引用赋值给i3,i4,同时也会去常量池中找是否有128这个值,若有,直接将其引用赋值他们在堆中开辟的空间,若没有,则在常量池中开一个空间,并将其引用赋值给其在堆中开的空间,由于他们在堆中的地址是不同的,输出即为false。
字符串缓冲池
Demo2
public class BufferPoolDemo { public static void main(String[] args) { String s1="hello"; String s2="hello"; System.out.println(s1==s2); }}
运行结果
问题
为什么运行结果是true?引用类型(基本数据包装类对象)比较的是值地址,按理说这里应该是false!
分析
创建字符串的时候先查找字符串常量池中有没有相同的对象,如果有相同的对象就直接返回该对象的引用,如果没有相同的对象就在常量池中创建该对象,然后将该对象的引用返回。对于String s1=”hello”;这一步而言,常量池中没有hello这个字符串对象,所以首先创建一个字符串对象,然后将对象引用返回给s1。对于String s2=”hello”;这一步而言,缓冲池中有hello这个字符串对象,直接返回这个对象的引用给s2,此时,s1与s2公用一个字符串对象“hello”,所以s1与s2的内存地址是相同的,所以输出true。
Demo3
“`
public class BufferPoolDemo {
public static void main(String[] args) {
String s1=”hello”;
String s2=new String(“hello”);
s2=s2.intern();
System.out.println(s1==s2);
}
}
运行结果
true
分析
先来说说intern()这个方法的作用吧,这个方法的作用是返回在字符串缓冲池中的对象的引用,所以s2指向的也是字符串缓冲池中的地址,和s1是相等的。
总结
- Integer在定义一个数据对象时,在直接赋值这种情况下(Integer i1=127;而不是new出来的),当赋值数据在byte数据取值范围内时,会先去方法区中的Byte常量池中去找有没有127这个值,如果有,直接将这个值得引用赋值给i1,如果没有的话就分配一个内存空间,然后再把引用赋值给i1。
- 若在new这种情况下,创建字符串的时候先查找字符串缓冲池中有没有相同的对象,如果有相同的对象就直接返回该对象的引用,如果没有相同的对象就在常量池中创建该对象,然后将该对象的引用用返回给其在堆中分配的空间,并将其在堆中的地址赋值给他自己,若是直接赋值这种情况,则不需要去堆中分配空间存放常量池中对象的引用,只需直接把其引用赋值给他自己。
- intern()这个方法的作用吧,这个方法的作用是返回在字符串缓冲池中的对象的引用。
参考资料
http://www.2cto.com/kf/201507/417691.html
String s=new String(“hello”)与String s=”hello”的区别?参考:
http://blog.csdn.net/zhouhuocleverset/article/details/61935578
- 字符串常量池及byte数据常量池
- 字符串及字符串常量池
- 字符串及字符串常量池
- JVM常量池及字符串
- 字符串常量。全局常量池
- JVM常量池和八种基本数据及字符串
- JVM常量池和八种基本数据及字符串
- JVM常量池和八种基本数据及字符串
- JVM常量池和八种基本数据及字符串
- JAVA 字符串常量池
- 字符串常量池
- 什么是字符串常量池?
- 什么是字符串常量池?
- 什么是字符串常量池?
- 字符串常量池
- 什么是字符串常量池
- 什么是字符串常量池?
- java字符串常量池
- nio的
- webstorm快捷键大全-webstorm常用快捷键
- C语言之预处理
- ajax回调json数组对象,jquery中$.each()循环解析
- SQL语句LIKE
- 字符串常量池及byte数据常量池
- 推荐大家使用的CSS书写规范、顺序
- CSS的浮动(一)
- 轮胎充气
- 函数实现判断素数并调用函数输出100以内所有素数
- 如何使用python进行社交网络分析
- 《JAVA与模式》之责任链模式
- Consul 服务注册与服务发现
- CSS初体验