String st=“abc”;和String st=new String(“abc”)的区别
比如
String st1=“abc”;
String st2=“abc”;
st1==st2  是trueString st1=new String(“abc”)
String st2=new String(“abc”)
st1==st2  是false

解决方案 »

  1.   

    String st1=“abc”; 
    String st2=“abc”; 
    st1==st2  是true st1和st2是同一块内存,String st2 在内存里找到st1赋值给了st2
    所以st1==st2
    String st1=new String(“abc”) //st1 new了一块内存
    String st2=new String(“abc”) //st2 有新new了一块内存
    st1==st2  是false 
    好像就是这样~~·
      

  2.   

    String st1=“abc”; 
    String st2=“abc”; 
    这里的st1和st2指向的是同一个常字符串,他们拥有的值。故st1==st2  是true  
    String st1=new String(“abc”) 
    String st2=new String(“abc”) 
    这里的st1和st2分别是两个不同的string对象,他们在内存中的位置不同,而“==”判断的是连个对象是否相等,所以为“false”,如果想比较他们的内容是否相等,可以用boolean e=st1.equals(st2);
      

  3.   


    没有每天一帖就很。
    Orz
      

  4.   

    String s = "Hello world!";许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
    这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:String string = s;我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
      

  5.   

    很多朋友的回答似乎都有道理,但是我感觉他们在这个问题上似乎自己也不知道有什么道理可讲!
    在JAVA对对象的初始化通常有两种方法:
      1.基本数据类型:如:int i=5;
      2.普通类型:入God g=new God();
    但是String是其中比较特殊的一个问题。可以用以上两种方法来初始化!
    String st=“abc”;和String st=new String(“abc”);而且前者是更通用的一种简单方法。
    至于二者为什么不相等,其实是JAVA中另外一个问题:JAVA中“==”的用法。
    说到这个问题又牵涉到深层COPE的问题。太复杂,这就就用最简单的话,尽力把事情说明,希望楼主能明白就可以了!JAVA中“==”比较的是其两边的对象的物理地址是否相同。
    String st1="abc";String st2="abc";并没有创建一个真正的内存对象,只是将两个String型的引用指向了存放于同一个内存地址的同一个对象“abc”而已。而String st1=new String("abc");String st2=new String("abc");则不同,我们知道,JAVA中new 就是用来开辟一个新的内存空间,然后在这个空间上创建new处理的对象。所以这个引用st1和st2指向的是两个位于不同的内存空间的两个独立的对象。所以他们指向的物理地址是相同的。所以“==”返回true。另外,额外的提醒一下,我们进行操作的时候通常操作的都是"引用",而不是“对象”。这点经常导致一些难以发现和理解的错误,所以必须要留意!
    而如果你想比较内容是否相同,可以用equals()方法
    楼主可以看一下
      String s1="abc";
      String s2="abc";
      String s3=new String ("abc");
      String s4=new String("abc");
      System.out.println(s1==s2);
      System.out.println(s3==s4);
      System.out.println(s1.equals(s2)+" "+s3.equals(s4));
      System.out.println(s1.equals(s3)+" "+s2.equals(s4));
    结果是
      true
      false
      true true
      true true
      

  6.   

    谢谢楼上几位的回答啊
    我还有几个问题 问下7楼
    用堆和栈 考虑。  引用是放在栈里的吧。存放的值放在堆里的吧
    String st=abc   st是在栈里的,那abc 是否是在堆里?
    我问过一个C的高手,他说不实例化的都在栈里那== 是判断 栈里的引用值是否相等,还是判断引用所指向堆里的地址是否相等呢? 
      

  7.   

    String st="abc";
    st为一个引用,在栈内存中,"abc"实际是一个匿名对象,开辟在堆内存中,同时使这个堆内存的地址等于st的内容,完成了st对他的引用
      

  8.   

    String st1=new String(“abc”)  
    String st2=new String(“abc”)  
    st1和st2的hasCode不同.  
      

  9.   

    String类有对象池的概念,String s="abc",这时JVM会从对象池里找一个“abc”的对象,如果没有就new一个,如果有就直接从对象池里拿,所以这时候String s1="abc"就直接从对象池里拿,所以和s是同一个对象,地址一样,而new则不一样,new就是不论什么情况都创建一新对象,所以==不相同。
      

  10.   

    java 设计者在处理String时针对它使用频率非常高这种特殊性,在这一块使用时加了个特别的功能,如果声明的变量比如
    String st1=“abc”; String st2=“abc”; 那么在内存里存储的是同一个“abc”,只是被不同的2个对象引用。
    如果开发者想要用2个不同的“abc”,那就用楼主所说的new 吧。
      

  11.   

    “abc”是字符串常量,在代码段分配一个空间存储“abc”s1,s2分别指向这同一个地址;
    而后两个分别创建了两个对象,在堆空间分配了两块儿内存分别由两个对象指向,==是比较地址中的内容
    而恶quals()是比较两者值是否相等
      

  12.   

    String st1=“abc”; 
    String st2=“abc”; 内存分为堆和栈st1,st2为栈中的一个变量
    "abc"为堆中的一个匿名对象
    第2个"abc"也是一个对象,但是前者已经存在所以它在常量池中,所以st1和st2引用的地址相同!这里就有了常量池的概念!~String st1=new String(“abc”) 
    String st2=new String(“abc”) st1与st2引用了不同的地址所以它们不可能相等
      

  13.   

    ==比较的是地址,new出来的东东当然是flase!
      

  14.   

    我来给你正解!
    你想知道这个知识点的内幕,你要花2分钟了解一下,String常量池的概念了
    Sting s="abc" JVM会先在Sting常量池中查找,如果找到了,就不会new了(当然可以找到),如果找不到,就会new一个,并且添加到Sting常量池.
    如果你在给个语句 Sting s1="abc",那么这次肯定是在String常量池中找到s引用的"abc"了
    所以他们是对同一个对象的引用后面那个就很简单了,2个new出来的对象当然不能简单的"=="