String str = new String() ;这句话创建几个对象
我只知道String str = new String(“abc”) ;先在字符串池找"abc",如果不存在,就创建一个,然后把它拷贝一个到堆中。但如果想String str = new String() ;这样不带参数的我就不知道它是怎样创建的??创建几个??
我只知道String str = new String(“abc”) ;先在字符串池找"abc",如果不存在,就创建一个,然后把它拷贝一个到堆中。但如果想String str = new String() ;这样不带参数的我就不知道它是怎样创建的??创建几个??
public String () {
value = new char[0];
offset = 0;
count = 0;
}
只创建了String对象带参数相当于调用了这个构造方法:
public String (String string) {
value = string.value;
offset = string.offset;
count = string.count;
}
也就是有两个String对象
这样得方式创建了两个对象,一个是abc,一个是str,一般不建议这样创建
直接String str = "abc";就可以
另外楼主说错了,第一种方式创建的,也就是用new创建的,不会去字符串池中找看是否有相同的,
new创建的会在堆中重新开辟内存。
也就是说String str = new String("abc")
String str2 = new String("abc")这样创建的str 和 str2 其实是两个对象但是 String str = "abc"
String str2 = "abc"这样创建的str == str2 当你创建str2得时候会在字符串池中找是否有"abc"存在,若存在则不会创建了,直接把str2这个引用指过去
在创建新的String时 会去看池里有没有一样的串 有的话就不再创建 将对象引用指向那个字符串 没有的话就创建一个
String str = new String("abc")
String str2 = new String("abc") str和str2是两个对象引用 他们指向的对象是两个不同的对象 但对象中的值是指向池中的同一个字符串“abc”
字符串池中始终就只有一个字符串“abc”这是我的理解 请大家指正 呵呵
10楼说:在创建新的String时 会去看字符串池里有没有一样的串5楼说:用new创建的字符串,(即String str = new String("abc"))不会去字符串池中找看是否有相同的, new创建的会在堆中重新开辟内存。5楼接着说:但是用这种方法 String str = "abc" 创建时会在字符串池中找是否有"abc"存在,若存在则不会创建了,直接把str这个引用指过去;
到底谁的说法对呢?来测试下。呵呵
String str = new String ("abc");
String str2 = new String ("abc");
if(str==str2) System.out.println("10楼是对的");
else System.out.println("5楼是对的"); String s1="abc";
String s2="abc";
if(s1==s2) System.out.print("5楼是对的");
else System.out.print("5楼是错的");
我们知道对象之间“==”是比较其地址的。结果是:
5楼是对的
5楼是对的那么通过验证,我知道了两种给字符串变量初始化的方法及它们的区别了。
带参数的创建两个对象.
直接就String str = new String("abc") 写成String str = "abc" ;不就行了嘛
怎么那么累赘~
创建了两个对象
str和"abd"
另外用new创建的string对象不会去栈中寻找有没有"abc"这个串。所以一般不使用new创建。
String str2 = new String() ;
不懂
等待正解
String str2 = new String ("abc");
if(str==str2) System.out.println("10楼是对的");
else System.out.println("5楼是对的"); String s1="abc";
String s2="abc";
if(s1==s2) System.out.print("5楼是对的");
else System.out.print("5楼是错的"); 上面是13楼的程序
我要说的是,13楼这么测试是有问题的
先看这段:
String str = new String ("abc");
String str2 = new String ("abc");
if(str==str2) System.out.println("10楼是对的");
else System.out.println("5楼是对的");
输出肯定是:"5楼是对的"
为什么,因为他们是两个不同的对象
但是10楼有说:
'str和str2是两个对象引用 他们指向的对象是两个不同的对象 但对象中的值是指向池中的同一个字符串"abc”中'
这个本来就是正确的,str 和str2 的确是不同的两个对象,但他们的值的确是一样的。所以单凭空上来证明10楼不对是错误的.我们可以试下下面这段代码:
String str = new String ("abc");
String str2 = new String ("abc");
if((str != str2) )
System.out.println("10楼是对的");
else if(str.equals(str2))
System.out.println("10楼是对的");
else
System.out.println("10楼是错的");来证明10楼是对的
value = string.value;
offset = string.offset;
count = string.count;
这3个是String类调用的什么方法?查了API的String类 好像没有这些方法啊
另外楼主说错了,第一种方式创建的,也就是用new创建的,不会去字符串池中找看是否有相同的,
new创建的会在堆中重新开辟内存。 好像不对,new创建的会在堆中重新开辟内存这没错,new创建的肯定会在堆中开辟内存的,但用new创建的,他在堆中开辟内存前,会先去字符串池中找看是否有相同的,如果有相同的,就拷贝到堆中,如果没有,就先在字符串池中建一个,然后再拷贝到堆中我只想知道的是String str = new String();这样会怎样创建,麻烦大家只跟我说说这样的情况会怎样创建,谢谢
Object o = new Object();
//这个创建几个对象?
//现在的某些个别程序员越学越倒退了String str = new String();这样会怎样创建?
答:
String
public String()初始化一个新创建的 String 对象,使其表示一个空字符序列。注意,由于 String 是不可变的,所以无需使用此构造方法。
这个方法没有任何用处。
楼主想要的答案都在里面了
String str = new String(“abc”) ;
都是只创建一个对象。
即时你连续执行2次
String str = new String(“abc”) ;
str = new String(“abc”) ;都不会是返回同一个对象,而是2个不同对象,在你创建第二个对象时,第一个对象如果没有别人引用,就会作为待垃圾回收的对象.
不过这2个对象是相等的 equals的 ,但是不是同一个对象,是 != 的
几十元把女朋友打扮成清纯公主
String str = new String(“abc”) ; 是会创建2个对象。
String s2=new String("abc");
System.out.println(s2.intern()==s1.intern());
System.out.println(s1.intern()=="abc");
根据这段代码来看好像10楼对的
注意第0,8行
下面是用:
javap -c Test
反编译的结果
public class Test
{
public static void main(String[] args)
{
String str1 = new String();
String str2 = new String("abc");
}
}
/*
Code:
0: new #2; //class java/lang/String
3: dup
4: invokespecial #3; //Method java/lang/String."<init>":()V
7: astore_1
8: new #2; //class java/lang/String
11: dup
12: ldc #4; //String abc
14: invokespecial #5; //Method java/lang/String."<init>":(Ljava/lang/String;)V
17: astore_2
18: return
*/
直接 String str = null; or String str;就可以了.
而 String str2 = new String("abc");创建了2个对象.