zoukankan      html  css  js  c++  java
  • Java中==与equals的区别及理解

    区别

      “”比较的是两个引用在内存空间中的存储位置是否一致,和Object类的equals方法是等价的。但是,Java中存在很多类(如String、Date、Long、HashMap和File等类)都重写了Object类的equals方法,导致其和“”不等价。

    分析

      如果两个对象的引用相同时(即指向同一对象),“==”操作符返回true;否则,返回flase。

      equals方法是由Object类提供的,可以由子类重写,实现多态性。Object类默认的实现如下:

    public boolean equals(Object obj) {
         return (this == obj);
    }
    

      由此可见,默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。但是,Java中很多类,诸如String、Date、Long、HashMap和File等类,都重写了equals方法,这里拿常见的String类为例进行说明。

    1 public class Test {
    2 	public static void main(String[] args) {
    3 		String str1 = "abc";
    4 		String str2 = "abc";
    5 		System.out.println(str1==str2);//true 
    6
    7		
    8 		 String str3 = new String("abc");
    9 		 String str4 = new String ("abc");
    10      System.out.println(str3==str4); //false
    11      System.out.println(str3.equals(str4)); //true
    12	 }
    13 }
    

      上例中第5行的执行结果是true。分析原因:先看第3行代码,先在栈中创建一个对 String类的对象引用变量str1,然后通过引用去字符串常量池里找有没有"abc",如果没有,则将"abc"存放进字符串常量池。这时常量池中并没有“abc”,故在编译期创建好“abc”,存储在了常量池中。第4行代码又创建了对String类的对象引用str2,然后和str1赋值逻辑一样,找”abc”,发现它已经存在,直接令str2指向它。所以str2和str1指向的是同一个“abc”,返回true。

      第8行和第9行代码分别创建了2个对象,str3和str4指向的是不同的对象,即上面所说的内存空间中存储位置不同。故str3 == str4 返回的肯定是false。

      第11行代码 str3.equals(str4) 之所以返回true,是因为String类重写了equals方法,比较的是内存空间存放的值是否相同。由于存放的都是值“abc”,故返回true。

    小结

      Java 语言里的 equals方法其实是交给开发者去重写的,让开发者自己去定义满足什么条件时,两个Object是相等的。这就是equals存在的目的。所以不能单纯的说equals到底比较的是什么,若想知道一个类的equals方法是什么意思就需要翻源码,看定义。

    Reference

    https://www.cnblogs.com/whcwkw1314/p/8044947.html


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    NAT(网络地址转换)
    go从文件中读取json字符串并转换
    实现守护进程
    c++ uconcontext.h实现协程
    bzoj 1085骑士精神
    在线代码评测机
    基于时间轮的定时器
    内存管理(一)
    二叉树的先序中序后序(非递归)
    RDD操作
  • 原文地址:https://www.cnblogs.com/east7/p/14563794.html
Copyright © 2011-2022 走看看