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 "应该还是直接从池里拿出来的。

解决方案 »

  1.   

    http://hi.baidu.com/xun1573/blog/item/42617ad8acb7333333fa1c9f.html看看这个吧
    讲的非常清楚了
    http://hi.baidu.com/xun1573/blog/item/42617ad8acb7333333fa1c9f.html
      

  2.   

        public String(String original) {
    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[]是一个