一、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的方式
- 普通for循环
- 增强型for循环
- forEach循环
- 迭代器
四、整理ArrayList和LinkedList的常用方法(方法名、参数说明、返回值说明、方法功能说明)
方法名 | 参数说明 | 返回值说明 | 方法功能说明 | |
add(E e) | 泛型 | boolean | 将指定元素追加到列表的末尾 | |
ArrayList | add(Object element) | 向ArrayList数组中添加元素 | ||
size() | 无参 | return size | 返回数组中元素个数 | |
get(int index) | int | 泛型 | 返回数组中对应位置的元素 | |
add(int intex,object element) | 在数组指定位置添加元素,原数组从指定位置开始的元素全部后移 | |||
set(int i,Object element) | 将索引i对应位置的元素替换为element并返回被替换的元素 | |||
LinkedList | add(Frist) | 在链表开头插入指定的元素 | ||
add(Last) | 在链表末尾插入指定元素 | |||
add(int index,E element) | 在指定位置插入有一个元素 | |||
集合容器
一、数组(Array)有什么缺点?
1.在创建数组的时候,就需要定死长度,在运行过程中需要判断剩余长度,并动态扩容
2.在中间插入的时候,需要将后面的元素进行后移
3.在中间删除的时候,需要将后面的元素进行后移
二、数组的封装类-列表 (ArrayList);底层是object类数组
数组的特点:有序不唯一
构造方法 先研究如何构造对象
ArrayList ()
ArrayList(int)
成员变量 研究构造出来的对象中有什么
elementData
size
成员方法 研究如何从操作对象中的成员
add(int)---在数组尾部第一个不为空的位置添加
add(int ,E)—在数组指定位置添加
set(int E)—修改数组指定位置
remove(int)---根据索引号移除
remove(object)—根据指针移除如果存在多个,只会移除第一个
get(int)根据指定的索引号找到某个元素并返回
ArrayList中的E是什么
用泛型来实现类中用到的数据类型的未知
--作者在编写的时候用E来表达数据类型的未知
--调用者在使用的时候可以给出E的具体类型,也可以不给,
如果给出E的具体类型,是在声明指针的时候给出
例如E=String E=Car E=Dog
不给的话E=Object
给出E的数据类型的具体语法
ArrayList<String>al1=new ArrayList
ArrayList<Car>al2=new ArrayList
可以是参数类型,可以是返回值类型,可以是任意变量的类型,可以是向下转型的类型
双向链表封装类-LinkList
底层:Node 对象
Item子顶 next下一个 Node<E的类型>node=new Node() prve上一个 没有无参构造方法,只有一个全参构造方法
构造方法
成员变量
成员方法
LinkedList的内部类------Node类(用于创建双向链表中的节点对象)
增:
数组:遍历数组,指定位置后面的元素要后移
链表:遍历链表,指定位置的节点修改指针
- addFirst(E)在头部添加
- addLast(E)在尾部添加
- add(E)在尾部添加
- add(int,E)在指定位置添加
链表在中间插入的速度要优于数组,只需要站到插入位置的节点,创建新的节点然后修改指针即可
数组在尾部插入新快,但是在首部
删
- removeFirst()删除头部
- removeLast()删除尾部
- remove(int)根据指定位置删除
- remove(object)根据指定元素删除
改
Set()
查
Get()
数组有索引
链表没有索引
Index是序号不是索引