String str1="sdfdsf";
String str2="sdfdsf";System.out.println(str1==str2);
//结果是true啊,很奇怪了的啊
String str1=new String("sdfdsf");
String str2=new String("sdfdsf");
System.out.println(str1==str2);
//这是false我是知道的。
==不是原生类型的才比值的吗?
String str2="sdfdsf";和String str2=new String("sdfdsf");
有什么不同的啊

解决方案 »

  1.   

    String str1="sdfdsf";
    String str2="sdfdsf";他们在运行加载类的时候,会从常量池里找是否有相同的(为了节省空间), 所以地址是相同的第二个 new 的,因为从堆里面重新分配了,当然就不等(==)了,这也是 new 的特性
      

  2.   

    String str1="sdfdsf"; //"sdfdsf"在数据区,str1和str2两个引用都指向数据区的同一块地方
    String str2="sdfdsf"; System.out.println(str1==str2); //所以相等
    //结果是true啊,很奇怪了的啊 
    String str1=new String("sdfdsf"); //把"sdfdsf"做构造函数参数,在堆中申请2块内存,把字符串拷贝过去,str1和str2指向堆中不同的地方,所以不相等 
    String str2=new String("sdfdsf"); 
    System.out.println(str1==str2); 
    //这是false我是知道的。 
    ==不是原生类型的才比值的吗? 
    String str2="sdfdsf";和String str2=new String("sdfdsf"); 
    有什么不同的啊
    一个指向常量区
    一个指向堆
      

  3.   

    “==” 用于判断两个Object的时候,你要看他们是否指向同一个对象!对于String str1 = "sted";
       String str2 = "sted"; 而言,你是把两个object instance都指向堆里的同一个对象。对于String str1=new String("sdfdsf");
        String str2=new String("sdfdsf"); 而言,你是创建了四个object,其中str1指向第一个"sdfdsf” object,而str2指向第二个"sdfdsf" object.
      

  4.   

    我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的 (2)使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担
    详细请看:
    http://z6688.com/info/42046-1.htm。 
      

  5.   

    什麼按值拷貝啊,你說什麼啊
    String str1="sdfdsf"; 
    String str2="sdfdsf"; 
    str1 == str2為true,因為兩個常量字符串相同,常量字符串放在string pool中,str2賦常量值時,會從string pool中查找,結果找到,故將池中的對象賦予str2引用
      

  6.   

    String的==比较的是两个字符串是不是放在同一个位置,所以 
    String str1="sdfdsf"; 
    String str2="sdfdsf"; 应该是指向在同一个地址了 没有重新新建
      

  7.   


    String str2="sdfdsf";//这个是去常量池找有没有"sdfdsf",如果有的话直接把str2引用指向它,如里没有,就建一个,然后指向它
    String str2=new String("sdfdsf"); //这个是在堆里开个空间存储"sdfdsf",每次new都会开一个
      

  8.   

    第一种情况是在常量池中创建了一个“sdfdsf”对象,在栈中str1,str2的引用都指向了这个对象所以相等。
    第二种情况是在堆中创建对象的同时,在常量池中也创建了一个对象,最后str1指向堆中创建的对象,str2指向另一个在堆中创建的对象所以不等
    在第二种情况下是创建了三个对象,两个堆中,一个常量池中。
    常量池的作用就是节省内存空间,而堆没有这个功能。
      

  9.   

    给str2赋值的时候,JAVA先会去字符串池里面找有没有已经存在的"sdfdsf",如果有,就直接把str2指向它.这样节省空间.所以,见你看到的str1和str2他们的地址一样.
      

  10.   

    csdn的兄弟们太热情了, 
    1楼的已经说的很清楚了,嘿嘿
      

  11.   

    这种问题很基础,这正是java与其他语言不同的地方
    看点书就会明白
      

  12.   

    呵呵,再看看。其实原因就是一楼说的,不过java中对字符串比较建议你使用equals方法,呵呵
    这样就不会存在你上面的疑惑了。
      

  13.   

    String str2="sdfdsf";//期中str2在stack创建临时变量,"sdfdsf"则在data区,然后str2指向该字符串
    String str2=new String("sdfdsf"); //同样的str2在stack创建临时变量,"sdfdsf"则是在heap区分配内存,然后str2指向该字符串