对于String创建的两种方法,的确是老的不能再老的问题了,下面说说我的看法:
创建方法:
1.String str = new "test";
2.String str_new = new String("test");
说明:
1: 在pool上创建String;如果如果pool中已经存在一个等于此 "test"的字符串,则直接将"test"赋给str_1,那么Str就是该字符串的引用;如果不存在则先在pool中新建一个字符串"test",将引用赋给str_1。
2:在heap中创建String;与pool毫无关系,创建两个对象,一个是实际的存储对象,一个则是引用。测试程序:
public class StringTest {
public static void main(String[] args) {
String str = "test";
String str_ano = "test";
String str_new = new String("test");
String str_new_ano = new String("test").intern();
System.out.println(str == str_ano); //-------a
System.out.println(str == str_new); //-------b
System.out.println(str == str_new_ano); //-------c
}
}输出:
true //-----a
false //----b
true //----c
总结:
1:如果pool中已经有一个该字符串,那么只创建一个对象(即引用);如果没有,则创建两个对象,一个是实际的存储对象(在pool中),另一个就是引用了。
2:总是创建两个对象,一个是实际的存储对象,另一个是引用。不知道各位大虾是否同意偶的看法~~~~
创建方法:
1.String str = new "test";
2.String str_new = new String("test");
说明:
1: 在pool上创建String;如果如果pool中已经存在一个等于此 "test"的字符串,则直接将"test"赋给str_1,那么Str就是该字符串的引用;如果不存在则先在pool中新建一个字符串"test",将引用赋给str_1。
2:在heap中创建String;与pool毫无关系,创建两个对象,一个是实际的存储对象,一个则是引用。测试程序:
public class StringTest {
public static void main(String[] args) {
String str = "test";
String str_ano = "test";
String str_new = new String("test");
String str_new_ano = new String("test").intern();
System.out.println(str == str_ano); //-------a
System.out.println(str == str_new); //-------b
System.out.println(str == str_new_ano); //-------c
}
}输出:
true //-----a
false //----b
true //----c
总结:
1:如果pool中已经有一个该字符串,那么只创建一个对象(即引用);如果没有,则创建两个对象,一个是实际的存储对象(在pool中),另一个就是引用了。
2:总是创建两个对象,一个是实际的存储对象,另一个是引用。不知道各位大虾是否同意偶的看法~~~~
你就是真正明白了至少也没有说明白。String literals are references to instances of class String.
你要揣摩一下这句话。对象(即引用)???no。
确实是创造了两个对象
对象是对象,引用是引用。
创建对象只有new关键字。
String str_new = new String("test");
new String("test"):创建对象。
str_new:对象引用。
对于上面的语句本人也认为是创建了一个对象。但是网上还有一种说法是创建了两个对象,为什么会出现有两个对象的说法呢,到底哪个是正确的呢,玄机在哪里,请高手点拨,谢谢
关于string的创建,不知道我的理解对不?
我个人理解,"test"本身就是一个对象,而用new String()会再产生一个对象,而对象的构造参数为"test",这时生成的String对象即为"test",但和前面的"test"并不是同一个对象,只是内容相同罢了。
我在C++的理解中是char *str1="test"会在栈存储区中保存"test"
char *str2=new String("test"); 会在栈区生成一个str2的字符指针,而在堆区生成一个"test"
虽然在java中只用引用而已经没有了C++这些概念,但引用其实也是一个指针,实际在内存中的表现应该差不多。
不过我也想说一下,只要有new关键字 那么他一定会开辟一个新的内存空间
另外“对象是对象,引用是引用” 关注!!!
但我考虑一点,类本身也就是一个对象,Class is class 不知道这句话你听过没
================================后面的intern()是干什么用的?