黑马程序员技术交流社区
标题:
一个String小问题
[打印本页]
作者:
Baiye
时间:
2014-8-20 21:12
标题:
一个String小问题
本帖最后由 Baiye 于 2014-8-21 10:38 编辑
String str = new ("abc");
这条语句会创建两个对象吗?
作者:
咸菜+萝卜干
时间:
2014-8-20 21:21
记得不错的话是两个对象,常量池里面一个,堆里面一个!{:3_47:}
作者:
java_dream
时间:
2014-8-20 21:37
String str = new ("abc"); 应该只创建一个对象,如下程序证明:
public class Test {
public static void main(String[] args){
// test_1();
test_2();
}
public static void test_1(){
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2);
}
public static void test_2(){
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);
}
}
test_1打印false,说明String str = new ("abc");只创建一个对象,没有在常量池创建对象
test_2打印true,说明str1、str2都执行常量池。
作者:
hsy
时间:
2014-8-22 09:21
这是道面试题吆,任意字符串都是对象,此题在字符串常量池里有一个对象,在堆内存new 出来一个对象,共两个
作者:
画了一个圈儿
时间:
2014-8-22 10:30
java_dream 发表于 2014-8-20 21:37
String str = new ("abc"); 应该只创建一个对象,如下程序证明:
public class Test {
test_1中,String str1 = new String("abc")在堆中new了一个String对象,同时在常量池中也创建了"abc",str1指向的地址是堆中对象的地址,str2指向的是常量池中"abc"的地址,所以结果为false。
作者:
java_dream
时间:
2014-8-22 14:48
支持楼上的
作者:
yqj
时间:
2014-8-22 16:52
应该是跟两个对象相关连,但堆内存中肯定会创建一个新对象,如果常量池中有“abc”则直接将堆中的地址指向常量池中的“abc”,没有创建后在指向。这是我的理解吧
作者:
李国荧
时间:
2014-8-22 22:07
同意大家的观点……
作者:
SmallRooker
时间:
2014-8-24 07:47
是两个对象,一个池中一个,堆中一个,楼上代码详解!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2