我不明白为什么操作员" =="不会用于比较字符串,但会用于比较int,double,float等。 从我的理解," =="确定两个实体是否指向同一个对象
int a = 10;
int b = 10;
if(a == b){
...
}
a和b在内存中有不同的引用,但此语句返回true。这是为什么?我想" =="比较参考?
答案 0 :(得分:1)
我不明白为什么操作员" =="不会用于比较字符串,但会用于比较int,double,float等我所理解的," =="确定两个实体是否指向同一个对象。
误解的根源在于1
和false
以及3.14159
等原始值不是对象。它们是没有对象标识的值。
在Java中有两种类型:
==
比较值==
比较对象标识a和b在内存中有不同的引用,但此语句返回true。
现在你混淆别的东西了。 a
和b
实际上是变量。是的,幕后变量确实有相应的内存地址。
但是...... a == b
不会将地址与变量进行比较。它比较变量的内容。变量的内容是没有地址的原始值。
我想" =="比较参考?
对于引用类型(对象和数组),==
运算符会比较引用。
对于基本类型,==
运算符会比较实际值。
想一想。您希望42
等于42
...无论数字是如何生成的。
回到String
。尽管"内置"对于Java语言,String
类型是引用类型(类java.lang.String
),==
使用引用类型语义对它进行比较;即通过比较身份。这对于新的Java程序员来说是一个相当混乱的原因(因此是膝盖反射),但如果你了解更大的图片,这是完全合乎逻辑的。
现在,当我们将包装类型和装箱/拆箱投入混合时,事情会变得更加复杂。但这超出了你的问题的范围。
答案 1 :(得分:0)
比较字符串时你是对的,但这是因为字符串是引用类型。 ==
测试引用类型的相同引用,而不是值。
但int
,boolean
,long
,char
等类型是原始的,或者"值"类型,而不是引用类型。那是;变量表示实际的值;不是对值存储位置的引用。
请注意,以上版本的是引用类型;包含大写字母的版本:Int
,Boolean
,Long
,Char
。这些代表“盒装”#39;上述基元的版本,==
将引用与它们进行比较。