类的设计,自动重写方法,Cloneable接口,ArrayList、Vector深度解析

类的设计

类的设计有很多限制,下以停车场为例进行分析

ConcreteParkingField

AF:

Map——车和停车位的关系

String——停车场的名字

Set——停车位列表

RI:

停车场名字不为空

停车位数目大于0

Map元素个数少于停车位总数,停车位应在Set(停车位列表)中出现

类和类之间存在约束关系

保证停车位宽度大于车的宽度

重写equals()、hashCode()、toString()

equals():根据车牌号判定

hashCode():最简单的方法,之间返回String的哈希值

toString():根据需要编写

绘制 Snapshot Diagram

final限定:双箭头( => )

单圈双圈:

immutable:双圈

mutable:单圈

测试一个数组是否存在重复元素

①双重循环(比较low,不推荐)

②采用Set(因为Set中不会出现重复)

public boolean isRepetition(int[] args) {
        Set<Object> set = new HashSet<>();
        for (int arg : args) set.add(arg);
        return set.size() == args.length;
    	//这种命名更好
		Set <Object> testDuplication= new HashSet<>;
    }

自动重写方法

原来现在IDE都这么智能了,还能自动重写,自动生成构造器

以Eclipse为例:

先写了一点Car类的代码,需要重写equals(),hashCode(),toString()方法

如图所示

在这里插入图片描述

点击以后

在这里插入图片描述

生成如下,这种方式生成的代码只有框架,没有内容:

在这里插入图片描述

但是IDE同样提供了Generate的选择

在这里插入图片描述

这样就可以自动生成代码辣,巨神奇

Cloneable接口

Cloneable是一个接口,实现这个接口后,可以在类中重写Object中的clone方法,然后通过类调用clone方法进行克隆,如果不实现Cloneable接口,则会抛出CloneNotSupportedException异常。Objectclone方法:

protected native Object clone() throws CloneNotSupportedException
Object中的clone方法是一个空的方法,那么他是如何判断类是否实现了Cloneable接口呢?

原因在于这个方法中有一个native关键字修饰。

native修饰的方法都是空的方法,但是这些方法都是有实现体的

这里也就间接说明了native关键字不能与abstract同时使用——因为abstract修饰的方法与java的接口中的方法类似,他显式的说明了修饰的方法,在当前是没有实现体的,abstract的方法的实现体都由子类重写

只不过native方法调用的实现体,都是非java代码编写的(例如:调用的是在jvm中编写的C的接口),每一个native方法在jvm中都有一个同名的实现体,native方法在逻辑上的判断都是由实现体实现的,另外这种native修饰的方法对返回类型,异常控制等都没有约束。

克隆的作用

clone方法克隆的对象包含已经修改过的属性,而new出来的对象是一个新的对象,对应的属性没有值。所以我们还要重新给这个对象赋值。所以当需要一个新的对象来保存当前对象的状态时可以使用clone方法。

浅拷贝和深拷贝

浅拷贝:仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象的引用指向的对象。

深拷贝:深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

ArrayList深度解析
注意事项

ArrayList可以加入null而且可以加入多个

②底层是由数组来存储数据的

ArrayList基本等同于Vector,但是它是线程不安全的(执行效率高),多线程情况下,不建议使用ArrayList

底层逻辑

①维护一个Object类型的数组elementData

transient Object[] elementData;
//transient 表示瞬间、短暂的,表示该属性不会被序列化

②当创建ArrayList对象是,如果采用无参构造器,则初始elementData容量为0,第一次添加,扩容容量为10,如需要再次扩容,则变为原容量的1.5倍

③如果使用的是指定大小的构造器,则初始elementData的容量为指定大小,如需要扩容,则变为原容量的1.5倍

Vector深度解析

注意事项

①定义

public class Vector<E> 
extends AbstractList<E>
implements List<E>,RandomAccess,Cloneable,Serializable

②底层是一个对象数组,protected Object[] elementData;

③是线程同步的,即是线程安全的,操作方法中带有synchronized

④在开发中,需要线程同步安全时,考虑使用Vector

ArrayListVector比较

在这里插入图片描述

两者扩容很像,与ArrayList主要的不同在于Vector在扩容时是一次变为原来的两倍

这次的博客就到这里,感谢观看😄

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值