抽象类 接口 ArrayList LinkList HashMap

抽象类

  • 抽象类其实和普通类一样,只不过多了抽象方法,可以用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长度,减少扩容操作。

猜你喜欢

转载自blog.csdn.net/wlj1442/article/details/109319953