Java引用类型对象地址引用和内容复制

Java数组属于引用类型对象,以此为例说明地址引用和内容复制的区别
1.地址引用
为一个数组变量赋值另一个数组变量后,2个数组变量指向同一个内存地址,引用同一个数组对象,此时内存中并没有建立新的数组对象。
2.内容复制
有时候需要复制一个数组或数组的一部分,在内存中独立于原数组对象存在,即创建一个新数组对象。
复制一个新数组对象主要有3种方法
1)使用循环语句逐个地复制所有或部分数组元素
2)使用System类的静态方法arraycopy(原数组名,原数组起始位置,目标数组名,目标数组起始位置,复制长度)复制所有或部分数组元素
3)使用数组的clone方法复制一个新数组对象
注:内容拷贝不一定是深度的、彻底的,如果拷贝的值是基本类型,则拷贝出一个新的值,两个值的内存地址不同;如果拷贝的值是内存地址(引用类型),则拷贝的是内存地址的引用,两个值指向同一个内存地址,此时属于浅度拷贝,详参浅拷贝和深拷贝(谈谈java中的clone)
3.对象内容及ID查看和对象比较
此处,对象的内容是指该对象持有的所有全局属性和类静态属性的集合,如果两个对象的每一个相应属性的值的内容都相同,则认为两个对象内容相同
3.1 内容及ID查看
3.1.1 内容查看
toString()方法继承自Object类,直接打印对象会调用对象的该方法,如果没被重写,则return getClass().getName() + "@" + Integer.toHexString(hashCode()),即返回全限定类名+@+16进制的hashCode值,由此可知,两个对象是否同一toString()结果取决于是否同一hashCode()结果
String类、所有的包装类以及所有的日期时间类都重写了toString()方法,使得调用结果为规定格式的值
数组类也重写了toString()方法,数组的toString值由Arrays.toString(Object[] arr)方法获取
Collection集合类没有重写toString()方法,不过集合类定义了public Object[] toArray()方法,得到对应的数组后,即可由数组来获取toString值
Map图类也没有重写toString()方法,不过Map类定义了public Set<K> keySet()public Collection<V> values()方法,可以分别得到对应的key集合和value集合,即可由集合类来分别获取key集合和value集合的toString值
自定义的类如果需要,应重写toString()方法,重写时可自由实现
实际上,对象内容是其所有属性的集合,而由于toString()方法可自由实现,并不一定能表示所有内容,不过,可以认为,当toString()方法返回所有属性的值组成的字符串时,该方法的调用结果即完全表示了对象的内容
3.1.2 内容ID查看
hashCode()方法继承自Object类,为native方法,如果没被重写,则交由底层实现,本地hashCode()实现的细节不讨论,但散列要求是,两对象内容不同 ⇔ 两对象hashCode值不同,同一个对象每次得到相同的hashCode值
很大程度上可以认为,对象的hashCode值表征了对象的内容ID
String类、所有的包装类、所有的日期时间类以及所有的集合类都重写了hashCode()方法,使得调用结果为按照数据类型特定的算法对对象的值散列出一个符合散列要求的散列值
数组类也重写了hashCode()方法,数组的hashCode值由Arrays.hashCode(Object[] arr)方法获取
自定义的类如果需要,可重写hashCode()方法,重写时务必保证符合散列要求

3.2 内容比较
equals(Object obj)方法继承自Object类,如果没被重写,则会return (this == obj),即等价于"=="比较
所有未重写该方法的类,obj1.equals(obj2)等价于obj1==obj2
String类、所有的包装类、所有的日期时间类以及所有的集合类都重写了该方法,使得obj1.equals(obj2)==true ⇔ 两对象内容相同
数组类也重写了该方法,数组的内容比较使用Arrays.equals(arr1,arr2)方法
自定义的类如果需要比较,应重写该方法,重写时需要保证obj1.equals(obj2)==true ⇔ 两对象内容相同,因此,在重写实现时,应对对象的每一个属性分别进行内容比较(即对属性本身也调用equals方法),判断是否整个对象内容(即所有属性)都相同

3.3 引用地址比较
两对象引用地址相同 ⇔ obj1==obj2
即使两对象的所有属性相应都相等,两对象也可能不相等,当创建两个对象后,为对象的属性赋值同样的引用地址时就是这样

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值