1. 在创建数组的时候 , 就需要确定数组长度 , 在运行过程中需要判断剩余长度 , 并动态 扩容
2. 在中间插入的时候 , 需要将后面的元素进行后移
3. 在中间删除的时候 , 需要将后面的我元素进行前移
4. 数组中所有元素都是同一种类型(多态可以有多种)
数组的封装类 - 列表(ArrayList) 数组的特点 : 有序的 , 不唯一的 - 构造方法 先研究如何构造对象ArrayList()
ArrayLisr(int)
- 成员变量 研究构造出来的对象中有什么elementData
size
- 成员方法 研究如何操作对象中的成员add(int) -- 在数组尾部第一个不为空的地方添加
add(int , E ) --在数组中的指定位置添加
set(int , E) --在数组指定位置修改
remove(int) --根基索引移除
remove(Object) -- 根据指针删除 , 如果存在多个只会移除第一个
get() -- 根据指定的索引号找到某个元素并返回
ArrayList 类中的 " E " 是什么?泛型
用泛型来实现类中用到的数据类型的未知
--作者在编写的时候位置数据类型
-- 作者在使用的时候 , 可以给出 " E " 具体的数据类型 , 也可以不给
如果给出 E 的具体类型 , 实在 构造 ArrayList对象的时候给出
例如 : E = String , E = Car , E = Dog
不给的话 E = Object
给出 E 的具体数据类型的语法
ArrayLIst
ArrayList
可以是参数类型 , 可以是返回值类型 , 可以是任意变量的类型 , 可以是向下转型的类型
用泛型的好处 , 被调用方当可以
双向链表封装类 - LinkedList底层 : Node 对象
- 构造方法
- 成员变量
- 成员方法
-- 增
1. addFirst(E) ==在头部添加
2. addLast(E) ==在尾部添加
3. add(E) ==默认在尾部追加
4. add(int , E) ==在指定位置插入 ,
链表在中间插入的速度要优于数组 , 链表优于数组 , 只需要找到插入的位置的结点 , 然后创建新节点然后修改指针即可 ,
数组在尾部插入很快 , 但是在首部胡哟者中间插入比较慢 , 因为需要后移
-- 删
1. removeFirst() ==删除头部
2. removeLast() ==删除尾部
3. remove(int) ==删除指定位置
4. remove(Object) ==根据指定元素删除
--改
set(int , E)
-- 查
get(int) 链表并没有索引机制 , 底层通过遍历链表然后通过二分查找法找到指定位置的节点 , 并返回节点中的 item
从查询角度来看数组的性能远远优于链表
中间插入和删除 , 链表优于数组
查询和修改 , 数组优于链表
LinkedList的内部类 - Node 类 (用于创建双向链表中的节点对象)
遍历 ArrayList 和 LinkedList 的几种方式
1. 普通 for 循环
2. 增强型 for 循环
3. forEach循环
4. 迭代器
Array和ArrayList的区别是什么?
Array是数组,ArrayList是类
Array是定长的( 需要手动扩容),ArrayList长度可变(使用过程中自动扩容)ArrayList的底层是Array
ArrayList和LinkedList的区别是什么?
1.底层数据结构实现: ArrayList底层数据结构是动态数组,而LinkedList的底 层数据结构是双向链表
2.随机访问(即读)效率: ArrayList比LinkedList在随机访问的时候效率要高,因为ArrayList底层 是数组,
可以通过索引号快速访问,LinkedList是通过二 分查找法遍历链表节点进行查找的
3.增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比ArrayList 效率要高,因为ArrayList
增删操作需要大量的前移或后移,这个过程中涉及到大量的赋值操作比较耗时间,LinkedList只需要修改节点对象的左右指针即可。4.内存空间占用: LinkedList比ArrayList 更占内存,因为LinkedList
的节点除了存储数据,还存储了两个引用,一个指向前一-个元素,一个指向后一个元素。
5.综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList, 而在插入和删除操作较多时,更推荐使用LinkedList。



