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

Java == for String对象停止工作了吗?

丁鸿信
2023-03-14
问题内容

public class Comparison {
public static void main(String[] args) {
String s = “prova”;
String s2 = “prova”;
System.out.println(s == s2);
System.out.println(s.equals(s2));
}
}

输出:

true
true

在我的机器上。为什么?==比较对象引用是否相等?


问题答案:

由于 String 实例是不可变的
,因此Java语言能够进行一些优化,以使String文字(或更一般而言,String其值为编译时间常数)可以
插入并实际上引用同一(即==)对象。

[JLS

3.10.5字符串文字](http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5)

每个字符串文字都是对实例的引用class StringString对象具有恒定值。使用方法,可以对字符串文字(或更一般而言,是常量表达式的值的字符串)进行“
interned”,以便共享唯一的实例String.intern

这就是为什么您得到以下信息的原因:

System.out.println("yes" == "yes"); // true
System.out.println(99 + "bottles" == "99bottles"); // true
System.out.println("7" + "11" == "" + '7' + '1' + (char) (50-1)); // true
System.out.println("trueLove" == (true + "Love")); // true
System.out.println("MGD64" == "MGD" + Long.SIZE);

也就是说它需要说,你应该 依赖==String一般的比较,而应该使用equals针对非null instanceof String。特别是,请不要为自己intern()所有的东西而着迷,String以便在==不知道字符串实习如何工作的情况下使用它。

new String(...)

如果出于某些特殊原因需要创建 两个 String 对象
(因此不是==定义的对象)并且仍然是equals,则可以使用此构造函数,其中包括:

public String(String original):初始化一个新创建的String对象,使其代表与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。
除非需要显式的原始副本,否则不需要使用此构造函数,因为Strings它们是不可变的

因此,您可以拥有:

System.out.println("x" == new String("x")); // false

new操作者总是创建一个新对象,因此上述被保证打印false。也就是说,这实际上通常不是您真正需要做的事情。只要有可能,您应该只使用字符串文字,而不是new String为其显式创建一个。



 类似资料:
  • null GrantPermissionRule是否停止了为其他人所宣传的工作?

  • 我正在用Unity 2018.2.2(最新版本于2018年8月8日)开发一款android小游戏。我在这个游戏上工作了几周,但现在,Unity在试图找到我的JDK时毫无理由地失败了。当我分配文件夹时(编辑- [如果您看不到图像:“未能检测到Java版本。Android开发需要JDK 8(1.8)。安装JavaRunatime环境(JRE)是不够的。”] 第一个我想的是,它可能会因为JDK的更新而失

  • 我正在通过conda安装pymc,它告诉我更新一些文件,所以没有问题。然而,在更新后,它给出了一个OSError,现在,我不能访问任何conda构建命令。现在,当我键入任何conda命令时,它会给我

  • 问题内容: 几天前使用时,它已经正常工作了。 但是现在不起作用了。而且我不知道问题出在哪里。 它显示“邮件已发送”。 我没有碰过Apache或这段代码中的任何内容。我已经在空PHP文件中测试了代码,结果相同。如何调试此问题? 问题答案: 可能是电子邮件发送正常,但被垃圾邮件过滤器捕获了吗?如果可以的话,请允许我交叉发表自己的看法: 一些要点(假设mail()返回true,并且错误日志中没有错误):

  • 问题内容: 我试图用ui-bootstrap制作一个用于angularjs的轮播,我基本上直接从angular文档复制/粘贴了它,但是它在最后一张幻灯片上停止了工作。 它不会重新开始,并且控件停止工作,即在控制台上没有出现任何错误,只是停止了工作 编辑:我再次检查,它不会停止在最后一张幻灯片,实际上它停止在第二个,无论有多少个元素。 编辑:我只是用轮播制作了一个测试站点,但仍然无法正常工作 这是完

  • 我的程序需要允许用户输入员工姓名和年度总销售额。当用户完成将员工添加到阵列中时,程序应确定哪些员工的销售额最高,哪些员工的销售量最低。然后,它应该打印出两个数字之间的差异。 在我下面的代码中,我有一个保存用户输入的年销售额的totalPay类(它包括以前赋值中的其他变量和方法,这里没有使用)。salesPerson类保存雇员的姓名和totalPay对象,其中包括他们的年销售额。(我意识到这太复杂了