当前位置: 首页 > 知识库问答 >
问题:

String和StringBuilder之间的Java等于

锺离飞鸣
2023-03-14
class returntest
{



public static void main(String...args)
{

String name1 = "Test";
String s = new String("Test");
StringBuilder sb = new StringBuilder("Test");

System.out.println(name1.equals(sb)); //Line 1
System.out.println(name1.equals(s));  //Line 2
System.out.println(s.equals(sb));     // Line 3
System.out.println(s.equals(name1));  //Line 4
}

}

以下是输出

false
true
false
true

第1行返回,第3行返回false。

我不明白为什么编译器不认为“name1”和“sb”包含相同的值

类似地,编译器并不认为“s”和“sb”包含相同的字符串(都是非原语)。

有人能解释一下line1和line3的输出吗?

共有3个答案

琴俊人
2023-03-14

一串equals比较的不是内容而是对象

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        ...
    }
    return false;
}

StringBuilder根本不重写equals,而是继承Object。等于

public boolean equals(Object obj) {
    return (this == obj);
}
阎冠玉
2023-03-14

出现这两种false情况的原因是,这就是指定相应的equals(Object)方法的工作方式。

>

  • 用于字符串。equals(Object),javadoc说:

    “将此字符串与指定的对象进行比较。当且仅当参数不为null且是表示与此对象相同字符序列的字符串对象时,结果才为真。”

    对于StringBuilder。equals(Object)equals方法继承自Object,其中javadoc表示:

    “如果此对象与obj参数相同,则返回true;否则返回false。”

    所以在第1行和第3行,String。equals(Object)返回false,因为sb不是字符串。

    如果你倒过来打电话给某人。等于(name1)sb。等于你也会得到false。。。因为某人。等于(…) 正在测试同一个对象。

    我不明白为什么编译器不认为“name1”和“sb”包含相同的值

    正如你所见,这与编译器无关。。。一切都与equals方法的指定方式有关。

  • 颛孙国源
    2023-03-14

    因为它们都是不同的对象

    String object!= StringBuilder object.
    

    但是,你的怀疑是

    name1.equals(s)  returning true
    

    因为在String类中等于方法以这种方式过验证。

    并获得所需的输出转换您的StringBuilderString

    System.out.println(s.equals(sb.toString())); //return true.
    

    如果你看到String#equals()的源代码

    1012    public boolean  equals(Object anObject) {
    1013        if (this == anObject) {
    1014            return true;
    1015        }
    1016        if (anObject instanceof String) {             //key line 
    1017            String anotherString = (String)anObject;
    1018            int n = count;
    1019            if (n == anotherString.count) {
    1020                char v1[] = value;
    1021                char v2[] = anotherString.value;
    1022                int i = offset;
    1023                int j = anotherString.offset;
    1024                while (n-- != 0) {
    1025                    if (v1[i++] != v2[j++])
    1026                        return false;
    1027                }
    1028                return true;
    1029            }
    1030        }
    1031        return false;
    1032    }
    

    如果传递StringBuilder,则行if(字符串的对象实例){总是返回false。

     类似资料:
    • 问题内容: 和之间的主要区别是什么?在决定其中任何一个时是否存在性能问题? 问题答案: 因为不是更快。 这是一个简单的基准测试: 一个试运行给出的数字2241 ms为StringBufferVS 753 ms的StringBuilder。

    • 本文向大家介绍JDK源码分析之String、StringBuilder和StringBuffer,包括了JDK源码分析之String、StringBuilder和StringBuffer的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要介绍了关于JDK源码分析之String、StringBuilder和StringBuffer的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细

    • 主要内容:总结在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder,中文翻译为“字符串缓冲区”。 StringBuilder 类是 JDK 1.5 新增的类,

    • 问题内容: 和之间的主要区别是什么?在决定其中任何一个时是否存在性能问题? 问题答案: 是同步的,不是。

    • 问题内容: 字符串池是否驻留在堆上?如果是,字符串文字是否可以进行垃圾回收? 使用时,我们知道它会在堆上创建一个对象,并将String文字放置在String池中。所以我的第二个问题是: 是否表现方法一样?如果是,StringBuilder如何处理字符串池中的字符串文字? 问题答案: 您会混淆编译时间,加载时间和运行时。 在类加载时,将字符串文字添加到常量池中。只需在类代码中的任何地方 提及 文字即

    • 本文向大家介绍简要解释一下Java中的String,StringBuffer和StringBuilder类之间的区别是什么?,包括了简要解释一下Java中的String,StringBuffer和StringBuilder类之间的区别是什么?的使用技巧和注意事项,需要的朋友参考一下 java.lang包的String类表示字符串。Java程序中的所有字符串文字(例如“ abc”)都实现为此类的实例