哇靠,,String s = new String("xyz")这个创建了两个对象!不能理解成,new出一个,s一个,2个。流程:new的时候从String类型的常量池里面找,看看有没有一个叫"xyz"的,没有?先往池子里放一个。这就产生了一个对象:常量"xyz"。然后把"xyz"拉过来,new String("xyz")出第二个对象。然后 Stirng s 在栈内存中创建s(不是对象 !!)存放new出对象的首地址。s是在内存中的栈空间里创建了一个引用,存放的不是一个对象,是new出的对象所在的堆内存的首地址,指向了new出的这个对象。再强调,它存储的是new出的对象的首地址,不是对象。所以,要说String s = new String("xyz")建立出几个对象?两个??不一定例如: String str = new String("xyz"); //创建了两个 String s = new String("xyz");//这句绝对只创建了一个对象,那就是S,因为"xyz"在池子里已近有了嘛这是正解!
所以一般不推荐new String ("")
2个,分析:
首先new String(“xyz”)就创建了一个String object对象;
接着创建的的该String Object对象赋给 String 类型的 s 对象,所以就创建了2个,
Person p=new Person();创建了几个Person对象?
例:
public class Demo{
public static void main(String args[]){
String s="xyz"; //声明String类型变量s
System.out.println("xyz".equals(s)); //equals()为String类中比较字符串内容的方法
}
}
也就是说见到有引号""包围的字符串时就创建了一个匿名对象。
而new操作符又是用来创建对象的,所以见到new("xyz")时又创建了一个String类型的对象。
所以是两个Object
不过建议LZ不要使用此种方式创建String类的对象,因为此方法创建之后,其中一个对象会变成垃圾,消耗内存。
“xyz”这个字常量符串会在字符串常量池中被创建,而又new了一个字符串s 所以是两个。
到底是在data segment中,
还是在heap中呢?按照马士兵的说法,new出来的东西都在heap中,而字符串常量又应该在data segment中。
哥们,这个不能赞同! 要是这样理解就明显只创建一个对象嘛!
正确理解: lz可以把new String("xyz")看成new String(String str),str=‘xyz’;其中后面这个对象是在常量池中创建的!
String str = new String("xyz"); //创建了两个
String s = new String("xyz");//这句绝对只创建了一个对象,那就是S,因为"xyz"在池子里已近有了嘛这是正解!