zoukankan      html  css  js  c++  java
  • Java学习笔记之Object常用方法

    Object:万类之祖

      == : 比较的是是否是同一个对象,比较的是地址

     

    equals: 是Object里面的方法,默认的是==,比较的是地址,但在String类型里重写为比较内容

    一般我们在设计一个类中,需要重写父类的equals方法,需要遵照以下几个规则设计:

    • 自反性(x.equals(x)必须返回true);
    • 对称性(x.equals(y)返回true时,y.equals(x)也必须返回true);
    • 传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true);
    • 一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值);
    • 非空性(对于任何非null值的引用x,x.equals(null)必须返回false)。 
    1 String s = "seven" ;
    2 String s1 = "seven";
    3 System.out.println(s == s1); //返回false        
    4 System.out.println(s.equals(s2));//返回true

     

    hashcode : 哈希码。 native本地方法(C、C++实现),操作系统实现逻辑,把结果返还给我们。把对象的内存地址经过算法得出的一个int。

     为什么重写equals必须重写hashcode?

     以下为重写equals和hashcode方法的源码,建议自动生成

     1 @Override
     2     public int hashCode() {
     3         final int prime = 31;
     4         int result = 1;
     5         result = prime * result + ((name == null) ? 0 : name.hashCode());
     6         return result;
     7     }
     8     @Override
     9     public boolean equals(Object obj) {
    10         if (this == obj)
    11             return true;
    12         if (obj == null)
    13             return false;
    14         if (getClass() != obj.getClass())
    15             return false;
    16         Person other = (Person) obj;
    17         if (name == null) {
    18             if (other.name != null)
    19                 return false;
    20         } else if (!name.equals(other.name))
    21             return false;
    22         return true;
    23     }

    现有两个对象

    1  Student s1=new Student("小明",18);
    2 
    3  Student s2=new Student("小明",18);

    此时s1.equals(s2)返回true,但如果不重写hashcode,Object默认的hashcode将对象的内存地址经过哈希算法返回给我们一个int,就违反了两个对象相等,hashcode一定相等的规定

     关于hashcode的规定:

    • 两个对象相等,hashcode一定相等
    • 两个对象不等,hashcode不一定不等
    • hashcode相等,两个对象不一定相等("Aa"、"BB")
    • hashcode不等,两个对象一定不等



     toString : 把引用数据类型转换成字符串。直接打印一个引用数据类型的对象则默认调用这个对象动态toString方法。

     finalize : 里面的逻辑会在当前对象被垃圾回收器回收的时候执行。

     clone:Object默认的方法clone()实现的是浅拷贝

    下面实现一个浅拷贝的实例,首先实现接口Cloneable并覆写方法

    1 public class Person implements Cloneable{
    2     
    3     @Override
    4     public Object clone() throws CloneNotSupportedException
    5     {
    6         Object object = super.clone();
    7         return object;
    8     }
    9 }

    然后可以调用clone()方法,下面代码也展示了两种创建对象的方法1,new    2,clone()

    1 Person p1=new Person("张三",11);
    2 Person p2=(Person)p1.clone();



  • 相关阅读:
    windows应用程序单实例
    11. 无数人难办事?
    递归、尾递归和使用Stream延迟计算优化尾递归
    吴裕雄--天生自然MySQL学习笔记:MySQL 函数
    吴裕雄--天生自然MySQL学习笔记:MySQL 导入数据
    吴裕雄--天生自然MySQL学习笔记:MySQL 导出数据
    吴裕雄--天生自然MySQL学习笔记:MySQL 及 SQL 注入
    吴裕雄--天生自然MySQL学习笔记:MySQL 处理重复数据
    吴裕雄--天生自然MySQL学习笔记:MySQL 序列使用
    吴裕雄--天生自然MySQL学习笔记:MySQL 元数据
  • 原文地址:https://www.cnblogs.com/sunzhiqiang/p/11721687.html
Copyright © 2011-2022 走看看