集合容器
数组(array)有什么缺点:
- 在创建数组的时候,就需要定死长度,在运行过程中需要判断剩余长度,并动态扩容
- 在中间插入的时候,需要将后面的元素进行后移
- 在中间删除的时候,需要将后面的元素进行前移
数组的封装类 - 列表(ArrayList)
数组的特点:有序的,不唯一的
- 构造方法 先研究如何构造对象
ArrayList();
ArrayList(int);//一般不用
- 成员变量 研究构造出来的对象中有什么
elementDate
size
- 成员方法 研究如何操作对象中的成员
add(int) 在数组尾部额第一个不为空的位置添加
add(int,E) 在数组指定位置插入
set(int,E) 修改数组指定位置的元素
remove(int) 根据索引删除
remove(Object) 根据指针删除,如果存在多个,只会移除第一个
get(int) 根据指定的索引找到某个位置并返回
ArrayList类中的”E”是什么?
泛型
用泛型来实现类中数据类型(可以是参数类型,可以是返回值类型,可以是任意变量的类型,可以是向下转型的类型)的未知
作者在编写的时候用E来表达未知数据类型,调用者在使用的时候可以给出E的具体的类型,也可以不给,不给的话,E=Object;//多态指针
如果给出E的具体类型,是在声明指针的时候给出
给出E的具体数据类型的语法:
ArrayList<String> al1=new ArrayList();//单态指针
ArrayList<Car> al2=new ArrayList();
用泛型的好处:被调用方可以帮调用方写向下转型的代码
双向链表类 LinkedList
底层:Node(节点)对象
构造方法
成员变量
成员方法
- 增:addFirst(E) 在头部添加
addLast(E) 在尾部添加
add(E) 在尾部追加
add(int, E) 在指定位置插入
链表在中间插入的速度要优于数组,只需要找到插入位置的节点,创建新的节点,然后修改指针即可
数组在尾部插入很快,但是其他比较慢,因为要后移
- 删:removeFirst() 删除头部
removeLast() 删除尾部
Remove(int) 根据指定位置删除
Remove(object) 根据指定元素删除
- 改:set(int,E)
- 查:get(int)
链表并没有索引的机制,所以需要二分查找法遍历链表找到指定位置的节点,并返回节点的item;数组的查找要优于链表
中间插入和删除,链表优于数组,原因是数组需要前移和后移
查询和修改,数组优于链表,原因是链表没有索引号
链表不存在扩容和转移,数组需要
LinkedList的内部类 - node类(用于创建双向链表中的节点对象)
节点的双向链表表示:
遍历ArrayList和LinkedList的几种方式:
- 普通for循环
- 增强型for循环
- forEach循环
- 迭代器
Array和ArrayList的区别是什么?
Array是数组ArrayList是类
Array是定长的(需要手动扩容),ArrayList长度可变(使用过程中自动扩容)
ArrayList的底层是Array
ArrayList和LinkedList的区别是什么?
- 底层数据结构实现︰ArrayList底层数据结构是动态数组,而 LinkedList的底层数据结构是双向链表
- 随机访问(即读)效率∶ArrayList比LinkedList在随机访问的时候效率要高,因为ArrayList底层是数组,可以通过索引号快速访问,LinkedList是通过二分查找法遍历链表节点进行查找的
- 增加和删除效率∶在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList增删操作需要大量的前移或后移,这个过程中涉及到大量的赋值操作比较耗时间,LinkedList只需要修改节点对象的左右指针即可。
- 内存空间占用:LinkedList 比 ArrayList更占内存,因为 LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
- 综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
整理ArrayList和LinkedList的常用方法
ArrayList
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
add(E e) | 泛型 | boolean | 将指定的元素追加到此列表的末尾 |
size() | 无参 | return size; | 返回此列表中的元素个数 |
get(int index) | int | 泛型 | 返回此列表中指定位置的元素 |
remove(int index) | int | 泛型 | 删除该列表中指定位置的元素 |
remove(Object o) | Object | boolean | 从列表中删除指定元素的第一个出现(如果存在) |
contains(Object o) | Object | boolean | 如果此列表包含指定的元素,则返回 true |
addAll(int index, Collection<? extends E> c) | int 泛型 | boolean | 将指定集合中的所有元素插入到此列表中,从指定的位置开始 |
clear() | 无参 | void | 从列表中删除所有元素 |
for / iterator | 无参 | 泛型 | 集合遍历 |
LinkedList
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
add(E e) | 泛型 | boolean return true; | 将指定的元素追加到此列表的末尾 |
size() | 无参 | int return size; | 返回此列表中的元素数 |
get(int index) | int | 泛型 | 返回此列表中指定位置的元素 |
remove(int index) | int | 泛型 | 删除该列表中指定位置的元素 |
remove(Object o) | Object | boolean | 从列表中删除指定元素的第一个出现(如果存在) |
addFirst(E e) | 泛型 | void | 在该列表开头插入指定的元素 |
addLast(E e) | 泛型 | void | 将指定的元素追加到此列表的末尾 |
getFirst() | 无参 | 泛型 | 返回此列表中的第一个元素 |
getLast() | 无参 | 泛型 | 返回此列表中的最后一个元素 |
push(E e) | 泛型 | void | 将元素推送到由此列表表示的堆栈上 |
pop() | 无参 | 泛型 | 从此列表表示的堆栈中弹出一个元素 |