字符串==运算符是否比较引用?

时间:2017-03-23 10:59:03

标签: java string

public class Test
{
    public static void main(String args[])
    {
        String a="meow";
        String b=a+"deal";
        String c="meowdeal";
        System.out.println(b==c);
    }
}

根据我==运算符比较参考。所以b == c应打印" true" 但是它打印出了“假”和#34; 。我通过打印" b"和" c"的哈希码进行检查。 。

两者的哈希码相同

3 个答案:

答案 0 :(得分:1)

union pun_unsigned { unsigned char c[sizeof(uint64_t)]; uint16_t u16; uint32_t u32; uint64_t u64; }; 会比较引用,但对==b的引用不同 - 它们是两个不同的c个实例,尽管它们包含相同的内容。

如果您想比较两个字符串的内容,请使用String

答案 1 :(得分:1)

  

根据我==运算符比较参考。

这是正确的。如果两个操作数都是引用类型,则==运算符会比较引用。 (如果任一操作数是基本类型,则不正确......但这是一个不同的主题。)

  

所以b == c应该打印“true”但它打印“false”。我通过打印哈希码“b”和“c”来检查。

您的推理不正确。

   String a = "meow";
   String b = a + "deal";
   String c = "meowdeal";

实际上,当代码完成b并且c引用具有相同值的不同字符串对象时。实际上,JLS声明+运算符创建了一个新的字符串objext ... ,除非表达式是一个常量表达式。 (在这种情况下,它不符合常量表达式,因为a是变量。)

所以b == cfalse ...因为==正在比较参考文献,参考文献是不同的。

答案 2 :(得分:0)

您应该将let tabItem = UITabBarItem() tabItem.title = "Tab1" tabItem.selectedImage = nil tabItem.image = nil tabViewController?.tabBarItem = tabItem 用于对象,将b.equals(c)用于基本类型