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

是什么使引用比较(==)对Java中的某些字符串有效?

昝浩阔
2023-03-14
问题内容

我有以下几行代码来比较String。str1不等于str2,这是可以理解的,因为它比较对象引用。但是,为什么s1等于s2?

String s1 = "abc";
String s2 = "abc";

String str1 = new String("abc");
String str2 = new String("abc");

if (s1==s2)
    System.out.println("s1==s2");           
else
    System.out.println("s1!=s2");

if (str1==str2)
    System.out.println("str1==str2");           
else
    System.out.println("str1!=str2");

if (s1==str1)
    System.out.println("str1==s1");         
else
    System.out.println("str1!=s1");

输出:

  s1==s2
  str1!=str2
  str1!=s1 

问题答案:

字符串常量池实际上将缓存所有字符串文字,因此它们是下面的同一对象,这就是为什么你看到要执行输出的原因s1==s2。本质上,这是对VM的一种优化,可以避免每次声明文字时都创建新的字符串对象,这可能会很快变得非常昂贵!在你的str1==str2示例中,你明确地告诉VM创建新的字符串对象,因此为什么它是错误的。

顺便说一句,intern()在任何字符串上调用该方法都会将其添加到常量池中(并返回添加到该池中的String。)但这不一定是一个好主意,但是除非你确定要处理绝对将用作常量的字符串,否则你可能最终难以跟踪内存泄漏。



 类似资料:
  • 问题内容: 如前所述,==运算符比较对象引用以检查它们是否引用堆上的同一对象。如果是这样,为什么我得到这段代码的“等于”? 问题答案: 程序将打印。(至少使用Sun Hotspot和suns Javac。)此处在http://ideone.com/8UrRrk上进行了演示。 这是因为该字符串字面常量存储在一个事实 串池 和字符串的引用 可以 被重复使用。 进一步阅读: 什么是字符串文字池? 字符串

  • 我在大学的一门Java课程中被告知,我永远不应该将Java字符串与运算符进行比较,因为它检查两个字符串是否是同一个对象,而不是检查它们是否具有相同的字符。 但是,在考试当天,呈现给我的是以下代码: 我以为结果会“不一样”,因为和不是同一个对象。

  • 问题内容: 在Java中比较两个字符串最快的方法是什么? 有没有比平等更快的东西? 编辑:我不能帮助澄清问题。 我有两个按字母顺序排列且大小完全相同的字符串 示例:abbcee和abcdee 字符串最长为30个字符 问题答案: 我不认为 Sun Oracle还没有最大程度地优化标准。因此,我希望它已经是最快的方法。如果您想了解他们如何实现它,请看一下它的源代码。这是摘录:

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

  • 问题内容: “按字典顺序比较两个字符串”是什么意思? 问题答案: 从@Bozho和@aioobe的答案出发,字典比较类似于在字典中可能会发现的顺序。 Java String类提供了该方法以便按字典顺序比较String。这样使用。 此方法的返回int值可以解释如下: 返回<0,则调用该方法的String按字典顺序排在首位(在字典中排在首位) 返回== 0,则这两个字符串在字典上等效 返回> 0,然后

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