当前位置: 首页 > 面试题库 >

字符串比较混乱

濮阳鸿卓
2023-03-14
问题内容

在继续之前: 我知道我们应该使用.equals()比较内容。 我现在只是在谈论以下情况下的实际引用是否相同…

说我们有以下内容:

String str1 = "str";
String str2 = "string";
String str3 = "ing";
String str4 = str1 + str3;
str1 = str4;
String str5 = "string";
System.out.println(str1==str2);//false

我认为应该是正确的,因为在字符串池中,对“字符串”的引用应该与str1和str2相同,现在都是“字符串”。它应该为true,但最终为 false

System.out.println(str1.intern()==str2.intern());//true

我尝试过,这次返回了 true 。然后我尝试了:

System.out.println(str1==str5);//false
System.out.println(str2==str5);//true

同样是 System.out.println(“ str” +“ ing” ==“ string”); // true

不应该来自字符串池吗?有人可以帮忙解释一下吗?


问题答案:

仅保证字符串 文字 和常量表达式被池化。由于str1 + str2不是文字,因此由JVM决定是否保留结果。您可以通过intern()已发现的电话强制它。

这在Java语言规范的第3.10.5节中定义:

字符串文字是对类实例的引用String(第4.3.1节,第4.3.3节)。

而且,字符串文字总是引用class的相同实例String。这是因为html" target="_blank">使用方法将字符串文字(或更广泛地说,是作为常量表达式的值的字符串(第15.28节))“插入”以便共享唯一的实例String.intern

您的第二个示例,"str" + "ing"是一个常量表达式,因此可以确保将其内联。

另请参阅JavaDocString.intern

这是试图解释发生了什么。编写良好的代码应该永远不要依赖于此,而应始终使用该equals方法。任何合理的JRE都会有类似的支票

if (this == other)
  return true;

非常接近String.equals性能明智的最高标准,这无关紧要。



 类似资料:
  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran

  • 主要内容:equals() 方法,equalsIgnoreCase() 方法,equals()与==的比较,compareTo() 方法字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀串等。 在 Java 中,比较字符串的常用方法有 3 个:equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。下面详细介绍这 3 个方法的使用。 equals() 方法 equals() 方法将逐个地比较两个字符串的每个字符是否相同。如果两个字符串具有相

  • 我读了这篇文章,当我们应该在字符串常量上使用字符串的实习生方法时,但仍然不太清楚String==也与intern()进行比较。我有几个例子。有人能帮我更好地理解这一点吗?

  • 问题内容: 我写了一个从套接字读取一行的代码。 如果该行是“再见”,我希望它输出“ nice”。由于某种原因它不起作用,尽管我确实尝试无条件输出输入,并且确实说“再见” 这是我的代码 问题答案: 使用,而不是比较字符串。

  • 问题内容: 给我输出: 我不太了解第一行,为什么它会给我带来错误? 如果我在字符串2上添加空格,则此行为false,但如果不添加空格,则为true: 为什么第1行给我假,但第6行为真,但是如果我在string2上添加空格则为假。 谢谢=) 问题答案: 那里发生了几件事。 当您将两个字符串声明为相等的“ Hi”时,java将对其进行优化以引用相同的字符串对象(因此不必将相同的字符串存储两次)。 “

  • 问题内容: 我是Java的新手:) 我有2个字符串列表,我想知道比较这两者的最有效方法是什么,并得到一个包含另一个字符串的结果数组。例如,我有一个名为oldStrings的列表和一个名为Strings的列表。我已经看过Comparator函数,但是还不完全了解它的工作原理,现在我想我可以创建一个for循环,遍历每个字符串,然后保存该字符串: 此列表中最多包含200个字符串。这是解决此问题的最佳方法