使用 new,就是創建一個新的String~~~而採用=時,String s3= "a",然後執行String s4 = "a",系統先查找是否有"a"存在,如果沒有就創建,否則就將引用s4  指向已存在的"a",也就是s3所指向的内存塊故s3==s4,s1 != s2,s1 != s5,s1 != s3你可以試一下,即使s3,s4 不在同一個method(但兩者必須是可見的,否則無法比較,比如實例變量和局部變量),也有s3 == s4

解决方案 »

  1.   

    楼上解释得很清楚。我想说的一点就是,String是对象,用==只是判断两个引用是否指向同一个对象,而不是判断其字符串序列是否相等。要判断值相等,应该用equals()方法。这个你应该是知道的吧,就当我随便说说好了。hoho
      

  2.   

    java中还保留了几个基本的数据类型,String就是其中一个,他可以不用定义对象的方法,而直接使用类似赋值的方法。
      

  3.   

    java是面向对象的,字符串的比较是对象(object )的比较,所以应该用s1.equals(s2)而不能用“==”,你用==比较的是他们的内存地址,所以一定是不相等的。
    equals:
    用来比较两个对象是否相同,先比较类型,再比较对象内容,返回true or false
    String s1=new String (“abc”);
    String s2=new String (“abc”);
       s1==s2;  false
       s1.equals(s2);  true
    若: String s1=”abc”
         String s2=”abc”
    s1,s2常量对象,内容一样时,系统只分配一个空间,所以引用相同
    s1==s2;  true
    你明白了吗?
      

  4.   

    要判断值相等,应该用equals()方法。
      

  5.   

    谢谢各位大虾,我还是有些不理解,既然s1先创建了,也就是说"a"已经存在,那么String  s3="a" 是s3就应该指向"a",这样 s1==s3就应该是true,可事实并不是这样,而是返回了false
      

  6.   

    那么我来说说吧,每道理大家不要骂啊!
    java中对象是个基本的概念,就是一切都是对象,再java中对于对象我们知道是引用的,就是当  A = B;后 A对象和B对象将是引用同一对象.把这个思想换入我们讨论的这个问题,java是把"a"看作一个对象的,而且任何时候"a"这个串实际就是同一对象的引用,那么我们用这个去给其他对象赋值,那么赋值后的对象将同样是同一对象的引用.我们有"=="运算是实际是在比较是否指向同一对象,这样就是了(赋值未"a"的对象都是"=="的);
        对于wxtasp(可可) 所说的"既然s1先创建了,也就是说"a"已经存在,那么String  s3="a" 是s3就应该指向"a",这样 s1==s3就应该是true,可事实并不是这样,而是返回了false" 
        我们应该这样理解了,当我们用new创建一个对象时,实际上是从新开辟了内存区域,哪怕是内容一样,但实际已经不是对同一对象的引用了.当然不"==".
        这个问题的关键是把"a"看作一个对象.
      

  7.   

    正因为"a" 是被开做一个对象的原因,在你用它去给其他对象赋值时,你是不会对"a"这个对象进行重定向的,也就是"a"一直就是那个对象,不可能让他再重新成为另一个对象的引用.正因为"a"始终都只是"一个"对象,所以你在任何地方所引用的和所有以"a"赋值的对象都是同一对象的引用!
      

  8.   

    就是用"a" 对对象赋值是其实一直都是用同一对象引用去赋值,"a"这个对象从来都不曾变过.除非你能对"a" 这样: "a" = new ...,否则它一直都是它,当然这样不可能啊,所以它一直都是它,不曾变过...
      

  9.   

    ==比较的是句柄,如果比较内容应该用equal()good  luck
      

  10.   

    两个知识点:
    1:String是对象,不是基本数据类型
    2:==比较的是对象的引用,不是对象自身的类容
      

  11.   

    ==对于对象比较的是引用
    对于基本类型是比较实际内容
    对象比较一般用equals方法