这是在论坛里看到的问题,这里将自己的理解贴出;
http://bbs.csdn.net/topics/390761915?page=1#post-397364421
问题:
String s =””,String s1= “abc”,String str =null,String tp = s;
创建了几个对象?
A.2
B.3
C.1
我的理解:
String s1 = "abc";// 能编译成功,也能执行,既然s1能有toString属性,那么s1肯定是Object;
System.out.println(s1.toString());
String s2 = "";// 能编译成功,也能执行,只是输出的也是"",既然s2能有toString属性,那么s2肯定是Object;
System.out.println(s2.toString());
// String s3 =
// null;//可以通过编译,但是运行的时候会抛出NullPointerException,因此次处没有创建新的对象;
// System.out.println(s3.toString());
String tp = s2;// 此处是s2的地址传给tp,是址传递,所以也没有创建新对象;
System.out.println(tp == s2);// 输出true
System.out.println(tp.equals(s2));// 输出true
String tp1 = "";
/*
* String类型的数据是放在内存的data segment里面的,而8中基本数据类型是存放在栈中的常量池;
* 执行此句的时候,虚拟机会首先在内存的data segment搜索是否已经存在空字符串"",如果没有,
* 则创建.如果已经有了,则直接将tp1指向这个地址,因此也没有创建新的对象,这种机制类似常量池;
* 这种数据的共享是由编译器完成的,tp1的修改并不会影响到s2;
*/
System.out.println(tp1 == s2);// 输出true
System.out.println(tp1.equals(s2));// 输出true
}