java - Java 中的字符串文字

标签 java string

我刚开始学习 Java 并遇到了这个:

String s = "Hello";
String s1 = "Hello";
if(s.equals("Hello") && s.equals(s1))
{
    System.out.println("Equal");
}

if 语句中的第一个条件将字符串文字 s 与字符序列进行比较,而第二个语句将 s 与另一个字符串进行比较文字 s1。两种比较结果都是正确的。

我的理解是 s 将保存对 "Hello" 的引用,s1 也是如此。由于 ss1 都包含对 "Hello" 的引用,因此可以比较它们并且它们总是相等的(因为 'common string pool' ).

我的问题是:保存引用的 s 如何与作为字符序列的实际字符串 "Hello" 进行比较?是否有任何逻辑或只是实现处理内存引用然后比较两者??

如果我的理解有误,请指正...

最佳答案

My question is: How can 's', which holds a reference, be compared to the actual string "Hello" which is a character sequence?

"Hello" 不是字符序列。这是一个 String。 (String 确实实现了 CharSequence interface ,但这不是一回事。)因此,当您使用 equals== 时,您正在比较 String 实例,而不是一些特殊的东西。 String 文字一个String(在文字写入源代码的地方加上对它的引用)。

起初您似乎对 equals== 感到困惑。重新阅读,我不确定你是不是,但以防万一:equals 比较两个对象的等价性;如果这两个对象是 String,并且它们具有相同的字符序列,则返回 true== 比较两个对象引用,如果它们指向同一对象,则评估为true。对于看似不同的 String 对象,== 有时是 true,因为 String 文字隐式为 intern'd (放入一个公共(public)池中并从中重复使用)以节省内存,因此两个独立但等效的文字实际上最终指向同一个对象。 永远不要依赖它。使用 == 来比较 String 几乎总是一个错误(不是的情况是非常边缘的情况)。使用 equals

关于java - Java 中的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20879256/

相关文章:

java - 为什么我会收到(top 方法和 isempty 方法)错误消息说找不到符号?

java - 如何在 Java 中正确定义和处理参数化错误消息?

python - Pandas:从带有字符串的列创建词云

php - 具有不规则空格和制表符的文件按列拆分/分解

java - Swing JScrollPane 溢出

java - KeyListener 不适用于 JTextField

java - 从Spring Boot API(K8s,Docker,Spring,Java)解耦数据库连接字符串

java - 面向对象范式中的方法可以被继承类中具有相同签名的方法覆盖。但是变量不能。为什么?

java - 如果缺少某些字符,则从列表中删除字符串

c++ - 使用 printf 和 cout 获得不同的输出 - C++