package com.test;
public class TestString { public static void main(String[] args) {
String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
}
}
1.我想问的是我的main()方法的第一句话 String s = new String("abc");产生里几个对象,这几个对象究竟是什么?
还有第二句话 产生几个对象?还有就是产生的每个对象在内存的分配位置? 2.我还想问的是第一句话的变量 s 在内存的什么地方存储着呢?
第二句的s1变量在内存的什么地方呢? 我个人通过查看资料有了一点了解,但是还是不太深刻有点迷糊,呵呵,希望高手能给出详细的解释啊 期待 这是昨天提问者的问题 我将跟帖的人的主要思想归纳了如下,请大家提出意见第一种说法:
String s=new String(“abc”); 一共创建了2个对象。一个是 “abc” 一个是new String(“abc”)
“abc”是在栈中,而new的对象都是在堆中,所以new String又去栈中把”abc”加载到堆里。
String s1=”abc” 创建了一个对象。放在栈中。在String类中,new的对象都放在堆里,不是new的对象都放在栈中。第二种说法:
对于String s=new String(“abc”);
jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。所以只创建了一个对象。
对于String s1=”abc”;
jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法1. String str1=new String("abc");//jvm 在堆上创建一个String对象
2. Stirng str2 = "abc";
3. //jvm 在strings pool中找不到值为“abc”的字符串,因此
4. //在堆上创建一个String对象,并将该对象的引用加入至strings pool中
5. //此时堆上有两个String对象
6. String str3 = "abc";
7. //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
8. //因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用第三种说法:
String s= new String( "abc "); 这一句创建了2个对象,应该是都在堆空间上,但是 "abc "是在字符串池中,new String( "abc ")是堆上的另一块内存。
String s1= "abc "; 没有创建对象,只是吧S1指向了池当中的 "abc "
String s2=new String( "abc "); 再次创建新对象,新的空间,但应该只是创建了new String( "abc ")的新空间,那个 "abc "应该还是直接从池里拿出来的。
public class TestString { public static void main(String[] args) {
String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
}
}
1.我想问的是我的main()方法的第一句话 String s = new String("abc");产生里几个对象,这几个对象究竟是什么?
还有第二句话 产生几个对象?还有就是产生的每个对象在内存的分配位置? 2.我还想问的是第一句话的变量 s 在内存的什么地方存储着呢?
第二句的s1变量在内存的什么地方呢? 我个人通过查看资料有了一点了解,但是还是不太深刻有点迷糊,呵呵,希望高手能给出详细的解释啊 期待 这是昨天提问者的问题 我将跟帖的人的主要思想归纳了如下,请大家提出意见第一种说法:
String s=new String(“abc”); 一共创建了2个对象。一个是 “abc” 一个是new String(“abc”)
“abc”是在栈中,而new的对象都是在堆中,所以new String又去栈中把”abc”加载到堆里。
String s1=”abc” 创建了一个对象。放在栈中。在String类中,new的对象都放在堆里,不是new的对象都放在栈中。第二种说法:
对于String s=new String(“abc”);
jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。所以只创建了一个对象。
对于String s1=”abc”;
jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法1. String str1=new String("abc");//jvm 在堆上创建一个String对象
2. Stirng str2 = "abc";
3. //jvm 在strings pool中找不到值为“abc”的字符串,因此
4. //在堆上创建一个String对象,并将该对象的引用加入至strings pool中
5. //此时堆上有两个String对象
6. String str3 = "abc";
7. //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
8. //因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用第三种说法:
String s= new String( "abc "); 这一句创建了2个对象,应该是都在堆空间上,但是 "abc "是在字符串池中,new String( "abc ")是堆上的另一块内存。
String s1= "abc "; 没有创建对象,只是吧S1指向了池当中的 "abc "
String s2=new String( "abc "); 再次创建新对象,新的空间,但应该只是创建了new String( "abc ")的新空间,那个 "abc "应该还是直接从池里拿出来的。
讲的非常清楚了
http://hi.baidu.com/xun1573/blog/item/42617ad8acb7333333fa1c9f.html
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
v = new char[size];
System.arraycopy(originalValue, original.offset, v, 0, size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
debug一下String s = "abc你好么";
String s2 = new String("abc你好么");
走的是else,但char[]是一个