java.lang.Object是所有java类的超类,在定义的类中并没有显示的加上extends Object,它是由JVM启动的时候自动实现的,其方法如下图所示:
我们经常会判断两个对象之间是否相等;我们有时也需要获得一个对象的副本;对象在实例化后,存放在堆内存中,可以通过getClass()获得对象对应类的引用地址; 对象被存放在主内存(堆中),在多个线程共用主内存的时候会先获得对象锁,然后线程可以等待,进入阻塞状态,只有等待超时、中断或者被其他线程唤醒,该等待线程才会进入运行状态;JVM是进行内存自动管理的,当满足垃圾回收条件的时候,JVM会调用每个对象的finalize()方法进行垃圾回收,释放内存。
【对象相等判断】
判断一个对象相等,有使用equals和==,通常判断一个对象相等,我们使用equals,它主要是判断两个对象的属性是不是相等的,==判断两个数值或对象的引用地址是不是一样的。我们在创建对象的时候,一般要重写equals和hashCode方法,如果不重写equals方法,其比较则和==是一致的,如果不重写hashCode方法,则将对象放到集合如HashTable、HashMap或者HashSet的时候可能会出错。如果两个对象相等,则其hashCode也一定相等,如果两个对象的hashCode不相等,两个对象一定不相等,如果两个对象的hashCode相等,则两个对象不一定相等。
【克隆对象】
Object类中有clone方法,其对应的子类不能直接使用clone()方法,必须实现Cloneable接口才可以使用clone()方法,Cloneable接口里面没有任何的方法,只作功能性标记使用。Object自带的native clone方法,只能做浅拷贝(只复制对象的基本类型,对象类型,仍属于原来的引用)。不能做深度拷贝(不紧复制对象的基本类,同时也复制原对象中的对象,完全产生新对象)。主要表现为被克隆对象内部,如果还有对象或集合的引用,则新克隆出来的对象中对这些属性对象或集合的引用是不变的,如果有使用到深度clone的话,则需要重写clone方法作进一步的操作。
(1)默认的浅度克隆
1 /** 2 * 功能描述:验证对象的clone 3 * @author ckx 4 * @date 2016年11月17日 5 */ 6 public class ValidateClone implements Cloneable{ 7 public String name; 8 public String address; 9 public List<?> list; 10 public static void main(String[] args) { 11 ValidateClone vc=new ValidateClone(); 12 vc.setAddress("北京"); 13 vc.setName("小明"); 14 List<String> listT=new ArrayList<String>(); 15 listT.add("String Type"); 16 vc.setList(listT); 17 try { 18 ValidateClone vcNew=(ValidateClone)vc.clone(); 19 System.out.println("vcNew.getAddress:"+vcNew.getAddress()); 20 System.out.println("vcNew.getName:"+vcNew.getName()); 21 System.out.println("vcNew.getList.size:"+vcNew.getList().size()); 22 System.out.println("vcNew.equals(vc):"+vcNew.equals(vc)); 23 System.out.println("vcNew.list.equals(vc.list):"+vcNew.list.equals(vc.list)); 24 } catch (CloneNotSupportedException e) { 25 e.printStackTrace(); 26 } 27 } 28 public String getName() { 29 return name; 30 } 31 public void setName(String name) { 32 this.name = name; 33 } 34 public String getAddress() { 35 return address; 36 } 37 public void setAddress(String address) { 38 this.address = address; 39 } 40 public List<?> getList() { 41 return list; 42 } 43 44 public void setList(List<?> list) { 45 this.list = list; 46 } 47 }
其输出结果如下:
vcNew.getAddress:北京 vcNew.getName:小明 vcNew.getList.size:1 vcNew.equals(vc):false vcNew.list.equals(vc.list):true
(2)深度克隆,需要根据实际情况,将引用的对象进行重新new对象出来,再进行相应的设置对应属性操作,直到最后一层的引用为基本数据类型为止。
获得类引用的作用
多线程里面wait、notify的作用
垃圾回收finalize的运用
参考文档:
Java Collections - hashCode() and equals()
浙公网安备 33010602011771号