And*_*son 50

  • identity:变量与另一个变量保存 相同的实例.

  • 相等:两个不同的对象可以互换使用.他们经常拥有相同的身份.

身分

例如:

Integer a = new Integer(1);
Integer b = a;
Run Code Online (Sandbox Code Playgroud)

a是完全相同的b.

在Java中,身份用于测试==.例如,if( a == b ).

平等

Integer c =  new Integer(1);
Integer d = new Integer(1);
Run Code Online (Sandbox Code Playgroud)

c是平等但不相同d.

当然,两个相同的变量总是相等的.

在Java中,等式由equals方法定义.请记住,如果实现equals,则还必须实现hashCode.

  • 这是错误的都市圈.正如我在一个不同的答案中所指出的,在使用"new"运算符分配对象时,编译可以不做技巧.只有使用Integer.valueof(1)创建它们时才会合并对象. (9认同)

小智 15

Identity确定两个对象是否共享相同的内存地址.Equality确定两个对象是否包含相同的状态.

如果两个对象相同,那么它们也是相等的,但仅仅因为两个对象相等,并不意味着它们共享相同的内存地址.

对于字符串有一个特例,但这不是主题,你需要向别人询问它是如何工作的;-)

  • 字符串有时是实例化的,例如当它们是编译时常量时. (2认同)

jit*_*ter 5

标识意味着它是相同的对象实例,而相等意味着您比较的对象是对象的不同实例,但碰巧包含相同的数据.

插图(在java中)

Date a = new Date(123);
Date b = new Date(123);
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true
Run Code Online (Sandbox Code Playgroud)

所以a和b是不同的实例(内存中的不同分配),但在"数据"级别上它们是相等的.