好吧,我承认我可能是Out了。String s1="android";
String s2="android";if(s1==s2)
  System.out.println("s1==s2");if(s1.equals(s2))
  System.out.println("s1.equals(s2)");印象中,无论是书本、视频,还是论坛上讨论起来的时候,都是s1 equals s2;直到今天下午,看一同事写的代码时用了 ==,正想批评他,结果一debug,竟然 if(s1==s2)里边的代码执行了。这是什么情况?是我记得不对,还是语法改了?

解决方案 »

  1.   

    String s1= new String("android");
    String s2= new String("android");
    再试试。
      

  2.   

    String s1="android";
    String s2="android";
    因为android这个字符串是字符串常量池中,所以s1和s2的地址都是指向一个地方的,所以地址也是相等的
      

  3.   

    String str1 = "android";
    String str2 = "android";
    System.out.println(str1==str2); //true
    1、编译器先处理String str1 = "android";它会在栈中创建一个变量为str1的引用,然后查找栈中是否有android这个值,如果没找到,就将android存放进来,然后将str1指向android。
    2、   接着处理String str2 = "android";在创建完b的引用变量后,因为在栈中已经有android这个值,便将str2直接指向android。这样,就出现了str1与str2同时均指向android的情况
    3、使用new String("android")会直接在堆内存中创建新的android值。
      

  4.   


    这个我知道,不同对象内存地址不一样,==肯定是false。但我纠结的是String s="android";这种写法
      

  5.   

    String s1="android";
    栈中如果有,则直接引用已经存在的android,如果不存在,则在栈中生成一份新的android
    String s2="android";
    明显,android现在已经在栈中存在了,所以s2直接引用栈中的android,所以,无论是==还是equils()都是相等的。
    领完楼主还可以试着new 一个android,new出来的对象是在堆中,每次new出来的都是一个新的对象,所以equils()应该是相等的,==就为false了。
      

  6.   

    String是默认final,内存中找到有android这个字符串,就会直接引用先前的内存地址,内存地址一致
      

  7.   

    2楼是对滴 string有个字符串常量池 当你string a=“a” 的时候 就把a放入池中 然后你string b=“a”他会在池中查找有没有这个字符串 有就返回地址 没有就在池中创建一个 然后返回地址 所以用等也是可以的
      

  8.   

    "android"是一个常量,而常量的值是不会改变的。
    所以当LZ写 String s1 = "android" String s2 = "android"的时候,只生成了一个String实例,s1和s2都是引用的同一个"android",所以s1 == s2的结果应该是true(毕竟同一个实例的地址是一样的)。当然,使用equals肯定是true了,毕竟s1和s2的内容也一样。如若你使用String s1 = new String("android"); String s2 = new String("android"); 这是就分别为s1和s2生成了一个实例,故此时使用==的结果是false,而使用equals的结果是true。
    实际上,这里生成了三个"android",第一个是"android"常量,另外两个s1和s2分别利用之前的常量生成了两个String实例。我也初学java,能理解LZ的困惑,同事,如果说得不对的地方也忘高人指正。