String s1 = "test";
        String s2 = "test";
        String s3 = new String("test");
        String s4 = new String("test");
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
        System.out.println(s3 == s4);
        System.out.println(s3.equals(s4));
true
true
false
true字符串不是new出来的,jvm会将其指向同一个地址(不变模式);
new出来的,各有各的地址,需使用equals比较内容,==比的是地址。

解决方案 »

  1.   

    如果不是new的话,虚拟机回搜索是否已经有"test"
    没有就new一个(相当于String s2 new String("test");)
    有的话这个变量就指向原String(相当于String s2 = s1;)
      

  2.   

    ==是没有对象时提出
    equals 时对对象提出的故他是考虑对象提出的
      

  3.   

    String s1 = "test";
    String s2 = "test";
    注意java里对象只不过是一个指针引用,这里s1与s2指向的是同一个引用,因为程序里声明的一个字符串常量在编译后运行实质只有一个存储地址,所以,这里s1==s2为真。

    String s3 = new String("test");
    String s4 = new String("test");
    这里跟上面所得结果是不一样的,s3与s4用new来创建,获得的是两个不同的对象,也就是不同的内存地址,因此,s3!=s4,that is true!为了比较两个对象是否相等,一般都要提供equals方法,象String.eauls("")一样,其实是对对象中的字符串值进行了比较,返回一个布尔值。