在Java中,通过新运算符可以创建具有相同String内容的不同对象吗?

时间:2019-05-02 04:22:30

标签: java

在下面的代码中,hashCode()似乎创建了2个对象。然后,尽管s1 == s3给出了true,但是为什么s1 == s4给出了false?

公共类主要{

public static void main(String[] args) {
    String s1 = new String("jordi") ;
    String s2 = s1.toUpperCase() ;
    String s3 = s1.toLowerCase() ;
    String s4 = new String("jordi") ;
    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    System.out.println(s3.hashCode());
    System.out.println(s4.hashCode());
    System.out.println(s1==s2);
    System.out.println(s1==s3);
    System.out.println(s1==s4);
}

}

这给出的输出为:

  

101312786

     

70775026

     

101312786

     

101312786

     

false

     

true

     

false

4 个答案:

答案 0 :(得分:0)

s1 == s4

这将执行参考比较。因此,您正在比较s1和s4是否指向同一个对象(它们不是-因为您显式创建了两个不同的对象)

答案 1 :(得分:0)

当我们使用==运算符进行s1和s4比较时,这是假的,因为它们在内存中都有不同的地址。比较内存地址

答案 2 :(得分:0)

值对象(身份不重要且值是唯一重要的对象,例如StringInteger)覆盖equalshashCode,例如,它们可以用作HashMap中的键。专门针对hashCode is specified in detailString值,以便具有相同内容的任何两个字符串将散列为相同的值。

您的s1s3是同一对象,因为String#toLowerCase() has an optimization返回this并避免在整个字符串已经小写的情况下避免创建新对象。

答案 3 :(得分:-3)

对字符串使用.equals方法而不是==。当您尝试用==而不是.equals()比较两个字符串时,Java变得有些棘手了

这是您的代码,但已修复。

public static void main(String[] args) {

        String s1 = new String("jordi");
        String s2 = s1.toUpperCase();
        String s3 = s1.toLowerCase();
        String s4 = new String("jordi");
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
        System.out.println(s4.hashCode());
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println(s1.equals(s4));
    }