谈谈java "=="

浅谈java ”=="


  看来看下面的一段代码:
  
  代码片段1
  
  public static void main(String[] args){Integer a=new Integer(100);Integer b=100;System.out.println(a==b);}
  
  这段代码的输出是什么?相信很多人都会很容易的猜到:false,因为a、b两个对象的地址不同,用“==”比较时是false。恭喜你,答对了。
  
  再看下面的一段代码:
  
  代码片段2
  
  public static void main(final String[] args){Integer a=100;Integer b=100;System.out.println(a==b);}
  
  你可能会回答,这没什么不一样啊,所以还是false。很遗憾,如果你执行上面的一段代码,结果是true。
  
  上面的代码可能让你有些意外,那好吧,再看看下面的这段代码:
  
  代码片段3
  
  public static voidmain(final String[] args){Integer a=156;Integer b=156;System.out.println(a==b);}
  
  结果是true吗?很遗憾,如果你执行上面的一段代码,结果是false。
  
  感到吃惊吗?那最后再看下面的一段代码:
  
  代码片段4
  
  public static void main(final String[] args){Integer a=Integer.valueOf(100);Integer b=100;System.out.println(a==b);}
  
  最后的结果,可能你已经猜到了,是true。
  
  为什么会这样?
  
  现在我们分析一下上面的代码。可以很容易的看出,这一系列代码的最终目的都是用“==”对两个对象进行比较。Java中,如果用“==”比较两个对象结果为true,说明这两个对象实际上是同一个对象,false说明是两个对象。
  
  现在,我们来看看为什么会出现上面的现象。
  
  我们先看代码片段4:最后的运行结果是true,说明a、b两个对象实际上是同一个对象。但是a对象是通过调用Integer的valueOf方法创建的,而b对象是通过自动装箱创建出来的,怎么会是同一个对象呢?难道问题在字节码那里,毕竟Java程序是依靠虚拟器运行字节码来实现的。
  
  代码中我们只调用了一次Integer.valueOf方法,但是字节码中出现了两次对Integer.valueOf方法的调用。那么另一次是哪里呢?只可能在自动装箱时调用的。因此这段代码实际上等价于:
  
  public static void main(final String[] args){Integer a=Integer.valueOf(100);Integer b=Integer.valueOf(100);System.out.println(a==b);}
  
  现在问题就简单了:看jdk源代码,查看valueOf方法的具体实现:
  
  public static Integer valueOf(inti){finalintoffset=128;if(i>=-128&&i<=127){//must cache

return Integer Cache.cache[i+offset];}

return new Integer(i);}
  
  看到这儿,上面的代码就很明确了:对于-128到127的数字,valueOf返回的是缓存中的对象。所以两次调用Integer.valueOf(100)返回的都是同一个对象。
  
  我们再先看代码片段3:根据上面的分析,代码片段3实际上等价于以下代码:
  
  public static void main(final String[] args){Integer a=Integer.valueOf(156);Integer b=Integer.valueOf(156);System.out.println(a==b);}
  
  由于156不在-128到127范围内,所以两个对象都是通过newInteger()的方式创建的,所以最后结果为false。

Java中,`equals()`和`==`都是用来比较两个对象的方法,但是它们的作用不同。 `equals()`方法用于比较对象的内容是否相等,即比较对象的属性值是否相等。默认情况下,`equals()`方法比较的是两个对象的地址是否相等,如果想要比较对象的属性值是否相等,就需要在对应类中重写`equals()`方法。一般而言,如果一个类重写了`equals()`方法,通常也需要重写`hashCode()`方法。 `==`运算符用于比较两个对象的地址是否相等,即判断两个对象是否是同一个对象。如果两个对象的地址相等,则它们一定是同一个对象;如果两个对象的地址不相等,则它们不一定是不同的对象,可能是同一类的不同对象。 举个例子,假设有一个Person类,包含两个属性name和age。当我们使用`equals()`方法比较两个Person对象时,比较的是它们的name和age属性值是否相等;而当我们使用`==`运算符比较两个Person对象时,比较的是它们的地址是否相等。 ``` Person p1 = new Person("张三", 20); Person p2 = new Person("张三", 20); Person p3 = p1; System.out.println(p1.equals(p2)); // true System.out.println(p1 == p2); // false System.out.println(p1 == p3); // true ``` 在上面的例子中,p1和p2虽然属性值相等,但是它们是两个不同的对象,因此使用`==`运算符比较结果为false;而p1和p3是同一个对象,因此使用`==`运算符比较结果为true。`equals()`方法比较的是p1和p2的属性值是否相等,因此结果为true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值