字符串常量和new的字符串对象的区别 | 您所在的位置:网站首页 › 字符常量与字符串常量区别是什么 › 字符串常量和new的字符串对象的区别 |
面试题:
String str1=“abc”; String str2 = new String(“abc”); 创建了几个对象? 答案: String str1=“abc”;在常量池(位于方法区中)中创建了一个对象。将常量池中对象的引用赋给str1。 String str2 = new String(“abc”);首先要看常量池里是否有“abc”这个字符串,如果有,则创建一个。如果没有,则创建两个: 1)一个是常量“abc”对象的内容创建出的一个新的String对象。放在字符串常量池中(方法区中) 2)一个是 new String 创建的一个新的对象,放在堆中。将堆中对象的地址赋给引用str2 场景:String str1 = “abc”; String str = new String(“abc”); 此时,String str = new String(“abc”)语句只创建了一个堆内存中的对象。 实例 String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo"; String s4 = "Hel" + new String("lo"); String s5 = new String("Hello"); String s6 = s5.intern(); String s7 = "H"; String s8 = "ello"; String s9 = s7 + s8; System.out.println(s1 == s2); // true System.out.println(s1 == s3); // true System.out.println(s1 == s4); // false System.out.println(s1 == s9); // false System.out.println(s4 == s5); // false System.out.println(s1 == s6); // true分析: ”== “是比较地址,equals()由于String类方法重写,比较的是字符串的内容 1、s1 = = s2 很容易可以判断出来。s1 和 s2 都指向了方法区常量池中的Hello。 2、s1 = = s3 这里要注意一下,因为做+号的时候,会进行优化,自动生成Hello赋值给s3,所以也是true 3、s1 = = s4 s4是分别用了常量池中的字符串和存放对象的堆中的字符串,做+的时候会进行动态调用,最后生成的仍然是一个String对象存放在堆中。 String str1 = new String(“A”+“B”) ; 会创建多少个对象? 字符串常量池:“A”,“B”,“AB” : 3个(“AB” 是通过“+”号得到的,如上述s3分析) 堆:new String(“AB”) :1个 String str2 = new String(“ABC”) + “ABC” ; 会创建多少个对象? 字符串常量池:“ABC” : 1个 堆:new String(“ABC”) :1个 记住:用new方法创建的对象必定都是不同的(因为在堆中开辟了不同存储区) 注:本文有参考其他博主的文章,并非原创,属于自己整理。 |
CopyRight 2018-2019 实验室设备网 版权所有 |