07List接口
List接口常用方法
List集合存储元素特点:有序可重复。 有序:是因为List集合中的元素都是有下标的,从0开始,以1递增。 可重复:存进去1,还可以再存一个1。 List接口下常见的实现类有: ArrayList:数组 Vector、Stack:数组(线程安全的) LinkedList:双向链表 List接口特有方法:(在Collection和SequencedCollection中没有的方法,只适合List家族使用的方法,这些方法都和下标有关系。) void add(int index, E element) 在指定索引处插入元素 E set(int index, E element); 修改索引处的元素 E get(int index); 根据索引获取元素(通过这个方法List集合具有自己特殊的遍历方式:根据下标遍历) E remove(int index); 删除索引处的元素 int indexOf(Object o); 获取对象o在当前集合中第一次出现时的索引。 int lastIndexOf(Object o); 获取对象o在当前集合中最后一次出现时的索引。 List<E> subList(int fromIndex, int toIndex); 截取子List集合生成一个新集合(对原集合无影响)。[fromIndex, toIndex) static List<E> of(E... elements); 静态方法,返回包含任意数量元素的不可修改列表。(获取的集合是只读的,不可修改的。)
List接口特有迭代
特有的迭代方式 ListIterator<E> listIterator(); 获取List集合特有的迭代器(该迭代器功能更加强大,但只适合于List集合使用) ListIterator<E> listIterator(int index); 从列表中的指定位置开始,返回列表中元素的列表迭代器 ListIterator接口中的常用方法: boolean hasNext(); 判断光标当前指向的位置是否存在元素。 E next(); 将当前光标指向的元素返回,然后将光标向下移动一位。 void remove(); 删除上一次next()方法返回的那个数据(删除的是集合中的)。remove()方法调用的前提是:你先调用next()方法。不然会报错。 void add(E e); 添加元素(将元素添加到光标指向的位置,然后光标向下移动一位。) boolean hasPrevious(); 判断当前光标指向位置的上一个位置是否存在元素。 E previous(); 获取上一个元素(将光标向上移动一位,然后将光标指向的元素返回) int nextIndex(); 获取光标指向的那个位置的下标 int previousIndex(); 获取光标指向的那个位置的上一个位置的下标 void set(E e); 修改的是上一次next()方法返回的那个数据(修改的是集合中的)。set()方法调用的前提是:你先调用了next()方法。不然会报错。
List接口使用Comparator排序
回顾数组中自定义类型是如何排序的? 所有自定义类型排序时必须指定排序规则。(int不需要指定,String不需要指定,因为他们都有固定的排序规则。int按照数字大小。String按照字典中的顺序) 如何给自定义类型指定排序规则?让自定义类型实现java.lang.Comparable接口,然后重写compareTo方法,在该方法中指定比较规则。 List集合的排序 default void sort(Comparator<? super E> c); 对List集合中元素排序可以调用此方法。 sort方法需要一个参数: java.util.Comparator。我们把这个参数叫做比较器。这是一个接口。 如何给自定义类型指定比较规则?可以对Comparator提供一个实现类,并重写compare方法来指定比较规则。 当然,Comparator接口的实现类也可以采用匿名内部类的方式。
08ArrayList
ArrayList ArrayList集合底层采用了数组这种数据结构。 ArrayList集合优点: 底层是数组,因此根据下标查找元素的时间复杂度是O(1)。因此检索效率高。 ArrayList集合缺点: 随机增删元素效率较低。不过只要数组的容量还没满,对末尾元素进行增删,效率不受影响。 ArrayList集合适用场景: 需要频繁的检索元素,并且很少的进行随机增删元素时建议使用。 ArrayList默认初始化容量? 从源码角度可以看到,当调用无参数构造方法时,初始化容量0,当第一次调用add方法时将ArrayList容量初始化为10个长度。 ArrayList集合扩容策略? 底层扩容会创建一个新的数组,然后使用数组拷贝。扩容之后的新容量是原容量的1.5倍。 ArrayList集合源码分析: 属性分析 构造方法分析(使用ArrayList集合时最好也是预测大概数量,给定初始化容量,减少扩容次数。) 添加元素 修改元素 插入元素 删除元素
09Vector
Vector Vector底层也是数组,和ArrayList相同。 不同的是Vector几乎所有的方法都是线程同步的(被synchronized修饰:线程排队执行,不能并发),因此Vector是线程安全的,但由于效率较低,很少使用。因为控制线程安全有新方式。 Vector初始化容量:10 Vector扩容策略:扩容之后的容量是原容量的2倍。
10链表存储结构
11LinkedList
LinkedList LinkedList是一个双向链表 源码分析: 属性分析 构造方法分析 添加元素 修改元素 插入元素 删除元素 手写单向链表