抽象类
- 抽象类其实和普通类一样,只不过多了抽象方法,可以用private修饰变量,但是不
能修饰抽象方法
,因为抽象方法需要子类继承它 - 抽象类里可以有抽象方法,也可以不写抽象方法,但是
有抽象方法的类一定是抽象类
- 抽象类不能用来创建对象
- 不允许使用final和abstract同时修饰一个抽象方法或者抽象类
接口
- 接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为 public static final 变量(并且
只能是 public static final变量
,用 private 修饰会报编译错误) - 接口方法会被隐式地指定为 public abstract 方法且
只能是 public abstract 方法
(用其他关键字,比如 private、protected、static、 final 等修饰会报编译错误),并且接口中所有的方法不能有具体的实现 - 接口中的方法
必须都是抽象方法
,接口是一种极度抽象的类型,它比抽象类更加"抽象
",并且一般情况下不在接口中定义变量。 - 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
ArrayList
查询、修改、新增(尾部新增)快
- 删除、新增(队列中间)慢
- 适用于查询、修改较多的场景。不是线程安全的。
- 底层实现是基于数组的,因此对指定下标的查找和修改比较快,但是删除和插入操作比较慢。
- 每次添加元素之前会检查是否需要扩容,每次扩容都是增加
原有容量的一半
。(扩容是创建一个新的数组,并将原来的数组元素迁移到新数组中) - 次对下标的操作都会进行安全性检查,如果出现数组越界就立即抛出异常。
LinkList
- 双向链表集合。
- 查询、修改慢(需要遍历集合)
新增,删除快(只需要修改前后节点的链接即可)
适用于新增、删除较多
的场景。- 不是线程安全的
- LinkedList根据index查询时采取的是二分法,即index小于总长度一半时从链表头开始往后查找,大于总长度一半时从链表尾往前查找。如果是根据元素查找,则需要从头开始遍历
HashMap
- 结合数组和链表的优势,期望做到增删改查都快速
适用于增删改查所有场景
- 时间复杂度接近于O(1)
- 当hash算法较好(hash冲突较少)时,增删改查的时间复杂度都是O(1)。但是如果链表较长,则会增加增删改查的时间复杂度O(链表长度)。原则就是尽量减少hash冲突,并预先估算hashmap长度,减少扩容操作。