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的输出吗?
一串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);
}
出现这两种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
方法的指定方式有关。
因为它们都是不同的对象
。
String object!= StringBuilder object.
但是,你的怀疑是
name1.equals(s) returning true
因为在String类中等于方法以这种方式过验证。
并获得所需的输出转换您的StringBuilder
到String
。
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”)都实现为此类的实例