Java常用API(一)Object与Objects
Object
基本介绍
Object 类是 Java 中的祖宗类,Object 类的方法是一切子类都可以直接使用
Object 类常用方法:
public String toString()
:默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址,例:Student@192536;
- 直接输出对象名称,默认会调用 toString() 方法,所以省略 toString() 不写;
- 如果输出对象的内容,需要重写 toString() 方法,toString 方法存在的意义是为了被子类重写 就是转换String
public boolean equals(Object o)
:默认是比较两个对象的引用是否相同protected Object clone()
:创建并返回此对象的副本
面试题:== 和 equals 的区别
- == 比较的是存放的对象的内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象,比较的是真正意义上的指针操作
- Object 类中的方法,默认比较两个对象的引用,重写 equals 方法比较的是两个对象的内容是否相等,所有的类都是继承自 java.lang.Object 类,所以适用于所有对象
hashCode 的作用:
- hashCode 的存在主要是用于查找的快捷性,如 Hashtable,HashMap 等,可以在散列存储结构中确定对象的存储地址
- 如果两个对象相同,就是适用于 equals(java.lang.Object) 方法,那么这两个对象的 hashCode 一定要相同
- 哈希值相同的数据不一定内容相同,内容相同的数据哈希值一定相同
深浅克隆
Object 的 clone() 是 protected 方法,一个类不显式去重写 clone(),就不能直接去调用该类实例的 clone() 方法
深浅拷贝(克隆)的概念:
- 浅拷贝 (shallowCopy):对基本数据类型进行值传递,对引用数据类型只是复制了引用,其实就是增加了一个指针指向原来对象的内存地址(学过c的小伙伴应该可以理解)
Java 中的复制方法基本都是浅拷贝:Object.clone()、System.arraycopy()、Arrays.copyOf() - 深拷贝 (deepCopy):对基本数据类型进行值传递,对引用数据类型是一个整个独立的对象拷贝,会拷贝所有的属性并指向的动态分配的内存,简而言之就是把所有属性复制到一个新的内存,增加一个指针指向新内存。所以使用深拷贝的情况下,释放内存的时候不会出现使用浅拷贝时释放同一块内存的错误
Cloneable 接口是一个标识性接口,即该接口不包含任何方法(包括 clone),但是如果一个类想合法的进行克隆,那么就必须实现这个接口,在使用 clone() 方法时,若该类未实现 Cloneable 接口,则抛出异常
- Clone & Copy:
Student s = new Student
Student s1 = s
:只是 copy 了一下 reference,s 和 s1 指向内存中同一个 Object,对对象的修改会影响对方Student s2 = s.clone()
:会生成一个新的 Student 对象,并且和 s 具有相同的属性值和方法
Objects
Objects 类与 Object 是继承关系
Objects 的方法:
public static boolean equals(Object a, Object b)
:比较两个对象是否相同
public static boolean equals(Object a, Object b) { // 进行非空判断,从而可以避免空指针异常 return a == b || a != null && a.equals(b); }
public static boolean isNull(Object obj)
:判断变量是否为 null ,为 null 返回 truepublic static String toString(对象)
:返回参数中对象的字符串表示形式public static String toString(对象, 默认字符串)
:返回对象的字符串表示形式
public class ObjectsDemo { public static void main(String[] args) { Student s1 = null; Student s2 = new Student(); System.out.println(Objects.equals(s1 , s2));//推荐使用 // System.out.println(s1.equals(s2)); // 空指针异常 System.out.println(Objects.isNull(s1)); System.out.println(s1 == null);//直接判断比较好 } } public class Student { }