类的设计
类的设计有很多限制,下以停车场为例进行分析
如 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
异常。Object
中clone
方法:
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
ArrayList
和Vector
比较
两者扩容很像,与ArrayList
主要的不同在于Vector
在扩容时是一次变为原来的两倍
这次的博客就到这里,感谢观看😄