【问题标题】:How == Operator works in Java [duplicate]==运算符如何在Java中工作[重复]
【发布时间】:2015-09-27 10:33:14
【问题描述】:

我正在阅读有关 == operator in java 的信息,发现它用于比较内存引用,下面的示例来自给定的链接。

String obj1 = new String("xyz");

// now obj2 and obj1 reference the same place in memory
String obj2 = obj1;

if(obj1 == obj2)
   System.out.printlln("obj1==obj2 is TRUE");
else
  System.out.println("obj1==obj2 is FALSE");

请注意,在上面的代码中,obj2 和 obj1 都引用了相同的 因为这一行而放在内存中:“String obj2 = obj1;”。和 因为“==”比较每个对象的内存引用,它 将返回真。而且,上面代码的输出将是:

之后我随机编写代码来检查 == 运算符,但为什么在这个示例中它返回 true?

String obj1 = "ABC";
String obj2 = "ABC";
if(obj1 == obj2)
System.out.println("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");

“ABC”字符串是否保存在一个内存位置,然后 obj1 和 obj2 共享该内存引用?

即使 int 也返回 true。

int obj1=3;
int obj2=3;

【问题讨论】:

  • 当您使用双引号而不是 new 运算符创建字符串时,它首先会查找字符串池,如果找到具有相同字符串的字符串,则返回对它的引用,否则会创建新的
  • @Murinik 为什么标记为重复?即使我的问题不同,我也会编辑它。
  • @EthicalThinker 答案和解释是相同的 - 标记为重复意味着提出语义相同问题的人将被引导到已建立的答案池。
  • 你有没有读过一本关于 Java 的书并了解引用类型和原始类型之间的区别?

标签: java


【解决方案1】:

字符串有点特别,因为它们使用String interning。 所以是的,在屏幕后面这两个字符串具有相同的内存引用(但不要指望它进行字符串比较。请参阅this question)。

替换你的字符串
Object obj1 = new Object();
Object obj2 = new Object();

你会得到预期的输出。

【讨论】:

  • 好的,这只是字符串? int obj1=3; int obj2=3; 这也打印真实
  • @EthicalThinker 那是因为那些不是对象,而是普通的内存值 ;-)
  • @watery 这意味着 java 将共享每个重复的内存,字符串 int,double long 和任何其他没有 new 关键字的类型?
  • @NewBie 当然不是!我的意思是,事情没那么简单。原始类型的处理方式与对象不同;例如当您将int 传递给一个方法时,后者会获得该值的副本,而如果您传递一个对象,则该方法会收到对其的引用。但是,我认为(虽然我不确定)Integers(和其他人)是不可变的,被保存在某种缓存中。
  • @watery 为什么 java 引入 equals() 方法 == 对于对象也不够用?
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 2012-06-10
  • 2021-02-07
  • 2020-10-29
  • 2014-01-17
  • 2016-01-09
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多