= =如何比较内存位置?

lil*_*oka 4 java autoboxing equals

我被告知从不使用==字符串而是用于其他所有内容,因为它.equals会比较值而不是对象的实例.(我理解其中的区别).

根据一些网站,==比较内存位置?

我不明白的是,如果你将一个整数与另一个整数进行比较,为什么它会比较内存位置,还是仅仅用于字符串?

如果你将int 3与int 4进行比较,显然它不会在同一个内存位置,但是如果你将int 4与int 4进行比较,那是否意味着所有值为4的整数都存储在同一个内存中记忆位置?

aio*_*obe 12

根据一些网站,==比较内存位置?

表达a == b比较内容ab无论其类型.

我不明白的是,如果你将一个整数与另一个整数进行比较,为什么它会比较内存位置,还是仅仅用于字符串?

如果ab是引用的==,因为这是该变量包含运营商将比较"内存位置".

在壳体ab是原始类型,如intdouble的变量将包含实际值,因而这些值(而不是它们的位置)进行比较.

(注意,变量永远不能包含诸如a之类的对象String,它最多只能指向一个对象.)

这是否意味着值为4的所有整数都存储在同一个内存位置?

不.如上所述,int"直接"比较s.说到Integer这个故事略有不同.首先,new 保证你获得一个新的参考,即

Object i = new Integer(5);
Object j = new Integer(5);

... i == j ...
Run Code Online (Sandbox Code Playgroud)

永远都会产生错误.

但是,如果你经历自动拳击:

Object i = (Integer) 5;
Object j = (Integer) 5;

... i == j ...
Run Code Online (Sandbox Code Playgroud)

你会得到真实的,因为自动装箱会通过缓存获取-128-127范围内的值.(例如,参见这个问题:比较两个整数:为什么==是真的?)


Sas*_*wat 4

== 比较操作数的值,无论它是原始类型还是引用类型。

  1. 如果操作数是原始操作数,则将比较操作数的值。

  2. 作为引用的操作数包含值,即访问它们所引用的对象的地址。字符串不是原始数据类型,它们在java中被视为对象,当您比较字符串类型的两个引用时,仅当操作数的值(即字符串对象的地址)相等时,结果才会为真(这意味着它们引用到同一个 String 对象)。