Java==运算符用于列表和集合比较,但为字符串和StringBuilder比较提供编译时错误 List List=new ArrayList(); Set=newhashset(); 如果(列表==集合){ } String str=“test”; StringBuilder StringBuilder=新的StringBuilder(); if(str==stringBuilder){ }

Java==运算符用于列表和集合比较,但为字符串和StringBuilder比较提供编译时错误 List List=new ArrayList(); Set=newhashset(); 如果(列表==集合){ } String str=“test”; StringBuilder StringBuilder=新的StringBuilder(); if(str==stringBuilder){ },java,Java,在上面的代码列表和集合比较中并没有给出编译时错误。那么为什么str和stringBuilder不编译呢。这是直观的解释 可以使用=将列表与集合进行比较,因为可能存在实例同时为列表和集合的类 使用=无法将字符串与StringBuilder进行比较,因为不可能同时作为字符串和StringBuilder的对象 但是,如果您希望能够使用==比较String和StringBuilder,您可以这样做: List<String> list = new ArrayList<String&g

在上面的代码列表和集合比较中并没有给出编译时错误。那么为什么str和stringBuilder不编译呢。

这是直观的解释

可以使用
=
列表
集合
进行比较,因为可能存在实例同时为列表和集合的类

使用
=
无法将
字符串
StringBuilder
进行比较,因为不可能同时作为
字符串
StringBuilder
的对象


但是,如果您希望能够使用
==
比较
String
StringBuilder
,您可以这样做:

List<String> list = new ArrayList<String>();
    Set<String> set = new HashSet<String>();
    if(list == set) {

    }
    String str = "test";
    StringBuilder stringBuilder = new StringBuilder(); 
    if(str == stringBuilder){

    }
显然,上述测试的评估结果为
false
。但它会编译

这是合法的,因为类型系统说
chars
可以是
字符串
。请注意,
CharSequence
String
StringBuffer
的超类型。(在本例中,超类型是一个
接口
,但它不需要是一个接口。)


(对于遇到此问题并想知道代码“试图做什么”的其他人,请注意……以及正确的方法

  • 使用
    =
    来比较
    哈希集
    数组列表
    是没有意义的。
    =
    操作符测试对象标识,
    哈希集
    数组列表
    都不能是同一个对象

  • 使用
    equals(Object)
    也没有任何意义。javadocs声明一个列表只能与另一个列表“相等”。此外,将显式排序的集合与排序不稳定的集合进行比较……毫无意义

  • 这同样适用于
    String
    StringBuffer
    之间的比较。根据
    equals(Object)
    ,它们永远不可能是
    =
    ,也永远不可能是相等的。如果要按字符比较字符串和字符串缓冲区,简单的答案是
    String.equals(StringBuffer.toString())


  • 简而言之,代码几乎毫无意义……除了作为OP关于如何打字的真正问题的说明。)

    相关:因为
    List
    Set
    是接口@Boristespider——这既不必要也不充分。解释更为复杂。@StephenC这是没有必要的,因为一个人可能是课堂上的。但这应该足够了,不是吗?就好像这两个都是接口一样,一个类总是可以同时实现这两个接口。@BoristheSpider-Hmmm。。。。是的,你是对的。谢谢斯蒂芬,你的解释太棒了!!我认为这个答案应该包括一点,
    ==
    几乎肯定不是OP想要的。它只检查引用标识,而不检查两个不同对象是否相等。请注意,
    等于
    在这里也不起作用;查看我的更新。
    String str = "test";
    CharSequence chars = new StringBuilder(); 
    if (str == chars) {
        // ...
    }