为什么==适用于int,double等,但不适用于java中的String

时间:2014-11-20 08:14:17

标签: java operators

我不明白为什么操作员" =="不会用于比较字符串,但会用于比较int,double,float等。 从我的理解," =="确定两个实体是否指向同一个对象

int a = 10;
int b = 10;

if(a == b){
...
}

a和b在内存中有不同的引用,但此语句返回true。这是为什么?我想" =="比较参考?

2 个答案:

答案 0 :(得分:1)

  

我不明白为什么操作员" =="不会用于比较字符串,但会用于比较int,double,float等我所理解的," =="确定两个实体是否指向同一个对象。

误解的根源在于1false以及3.14159等原始值不是对象。它们是没有对象标识的值。

在Java中有两种类型:

  • 原始数据类型... ==比较值
  • 引用类型... ==比较对象标识
  

a和b在内存中有不同的引用,但此语句返回true。

现在你混淆别的东西了。 ab实际上是变量。是的,幕后变量确实有相应的内存地址。

但是...... a == b不会将地址与变量进行比较。它比较变量的内容。变量的内容是没有地址的原始值。

  

我想" =="比较参考?

对于引用类型(对象和数组),==运算符会比较引用。

对于基本类型,==运算符会比较实际值。

想一想。您希望42等于42 ...无论数字是如何生成的。

回到String。尽管"内置"对于Java语言,String类型是引用类型(类java.lang.String),==使用引用类型语义对它进行比较;即通过比较身份。这对于新的Java程序员来说是一个相当混乱的原因(因此是膝盖反射),但如果你了解更大的图片,这是完全合乎逻辑的。


现在,当我们将包装类型和装箱/拆箱投入混合时,事情会变得更加复杂。但这超出了你的问题的范围。

答案 1 :(得分:0)

比较字符串时你是对的,但这是因为字符串是引用类型。 ==测试引用类型的相同引用,而不是值。

intbooleanlongchar等类型是原始的,或者"值"类型,而不是引用类型。那是;变量表示实际的;不是对值存储位置的引用。

请注意,以上版本的引用类型;包含大写字母的版本:IntBooleanLongChar。这些代表“盒装”#39;上述基元的版本,==将引用与它们进行比较。