集合容器
数组(Array)有什么缺点
- 在创建数组的时候,就需要定死长度,在运行过程中需要判断剩余长度,并动态扩容
- 在中间插入的时候,需要将后面的元素进行后移
- 在中间删除的时候,需要将后面的元素进行前移
- 数组中所有的元素但是同一种类型
数组的封装类 - 列表(ArrayList)
数组的特点:有序的,不唯一的(不会自动去重)
-构造方法 先研究如何构造对象
ArrayList()
ArrayList(int)
-成员变量 研究构造出来的对象中有什么
elementDate--object[]类型
size--int类型
-成员方法 研究如何操作对象中的成员
add(int)--在数组尾部的第一个不为空的位置添加
add(int,E)--在数组的指定位置插入
size(int,E)--修改数组指定位置
remove(int)--根据索引号移除
remove(object)--根据指针移除,如果存在多个只会移除第一个
get(int)--根据指定的索引号找到某个元素并返回
不需要担心扩容问题
ArrayList类中的那个“E”到底是啥?
E出现的位置:
- 类的签名上面有一个
- Add方法参数类型是E
- Get方法的返回值类型是一个E
- 取出元素后的向下转型为E类型
E是一个未知的数据类型:泛型 --作者在编写的时候用E来表达数据类型的未知
泛型 --调用者在时候的时候,可以给出E的具体类型,也可以不给(给的话例如:E=String E=Car...不给的话E=Object)
用泛型来实现类中用到的数据类型(可以是参数,可以是任意变量的类型,可以是向下转型时的类型)
给出E的具体数据类型的语法:(如果给出E具体数据类型,是在声明指针的时候给出)
ArrayList
ArrayList
泛型的好处:被调用方可以帮调用方写向下转型的代码
双向链表封装类-LinkeList
底层:Node对象
构造方法
成员变量
成员方法
-增
- addFirst(E)--在头部添加
2.addLast(E)--在尾部添加
3.add(E) --在尾部追加
4.add(int,E)--在指定位置插入
链表在中间插入的速度要优于数组,只需要找到要插入位置的节点,创新节点,然后修 改指针即可
数组在尾部插入较快,但是在首部或者中间插入,比较慢,因为需要数据后移
数组:遍历数组,指定位置后面的元素要后移
链接:遍历数组,指定位置的节点修改指针
-删
- removeFisrt() - 删除头部
- removeLast() - 删除尾部
- remove(int) - 根据指定位置删除
- remove(object ) - 根据指元素删除
-改
set(int,E)
- 检查下标是否越界
- 调用node方法找到需要修改的节点
-查
get(int,E)
数组有索引 - 不需要遍历
链表没有索引的 - 底层通过遍历链表然后通过二分查找,找到指定位置的节点,并返回节点的item
从查询的角度来看,数组的性能远远优于链表
增删链表快,改和查数组快
(中间插入和删除,链表优于数组;查询和修改,数组优于链表)
链表不存在扩容和转移,数组存在
LinkeList类中的一个静态内部 Node - 节点
next:下一个 prev:上一个
LinkeList内部类 - Node类(用于创建双向链表中的节点对象)
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。
你知道几种遍历ArrayList的方式
1.for循环
2.增强for循环
3.forEach循环
4.迭代器
整理整理ArrayList和LinkedList的常用方法
ArrayList常用方法:
add(int)--在数组尾部的第一个不为空的位置添加
add(int,E)--在数组的指定位置插入
size(int,E)--修改数组指定位置
remove(int)--根据索引号移除
remove(object)--根据指针移除,如果存在多个只会移除第一个
get(int)--根据指定的索引号找到某个元素并返回
LinkedList的常用方法:
-增
1.addFirst(E)--在头部添加
2.addLast(E)--在尾部添加
3.add(E) --在尾部追加
4.add(int,E)--在指定位置插入
-删
- removeFisrt() - 删除头部
- removeLast() - 删除尾部
- remove(int) - 根据指定位置删除
- remove(object ) - 根据指元素删除
-改
set(int,E)
- 检查下标是否越界
- 调用node方法找到需要修改的节点
-查
get(int,E)
数组有索引 - 不需要遍历
链表没有索引的 - 底层通过遍历链表然后通过二分查找,找到指定位置的节点,并返回节点的item
从查询的角度来看,数组的性能远远优于链表
链表在中间插入的速度要优于数组,只需要找到要插入位置的节点,创新节点,然后修 改指针即可
数组在尾部插入较快,但是在首部或者中间插入,比较慢,因为需要数据后移
数组:遍历数组,指定位置后面的元素要后移
链接:遍历数组,指定位置的节点修改指针
增删链表快,改和查数组快
(中间插入和删除,链表优于数组;查询和修改,数组优于链表)
链表不存在扩容和转移,数组存在



