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的方式
整理ArrayList和LinkedList的常用方法
集合容器
数组(Array)有什么缺点
在创建数组的时候,需要定死长度。在运行过程中需要判断剩余长度,并动态扩容-长度固定
1.在中间插入的时候,需要将后面的数组后移
2.在中间删除的时候需要将后面的元素进行前移
数组的封装类-列表(ArrayList)
数组的特点:有序的不唯一的
-构造方法 先研究如何构造对象
ArrayList()
ArrayList(int)
-成员变量 研究构造出来的对象中有什么
ElementData
size
-成员方法 研究如何操作对象中的成员
add(int)--在数组尾部的第一个不为空的位置添加
add(int E)--在数组指定的位置插入
set(int E)--修改数组的指定位置
remove(int)--根据索引号移除
remove(Object)--根据指针移除,如果存在多个只会移除第一个
ArrayList类中的”E”
泛型
用泛型实现类中用到的数据类型的未知
--作者在编写的时候未知数据类型用E来表达数据类型的未知,
--调用者在使用的时候可以给出E具体的数据类型,也可以不给出
如果给出E的具体类型,是在构造ArrayList对象的时候给出
例如给:E=String E=car
给出E的具体数据类型的语法:
ArrayList<String>al1 =new ArrayList()
ArrayList<Car>al1 =new ArrayList()
不给:E=Object
不给的时候默认为E=object
(可以是参数类型,可以是返回值类型,可以是向下转型的类型,可以是任意变量的类型)
用泛型的好处:被调用方可以帮凋用方写向下转型的代码
双向链表封装类
构造方法:
成员变量:
成员方法:
Add first:在头部添加
Add Last:在尾部添加
Add E:在尾部追加
Add (int E):在指定位置插入
链表在中间插入的速度优于数组,只要找到插入位置,创建新的节点然后修改指针即可
数组在尾部插入新快,但是在首部或者中间插入比较慢因为需要后移
删:
- RemoveFirst 删除头部
- removeLast 删除尾部
- remove(int) 删除指定位置
- remove(Object) 删除指定指针
改:
- set(int, E)
查
- get(int)链表没有索引的机制,需要通过遍历链表然后通过二分查找法找到指定位置的节点并且返回节点中的item
- 从查询角度来看数组的性能远远高于链表
- 由于链表不需要前移和后移所以中间插入和删除,链表优于数组,因为链表没有索引所以查询和修改数组优于链表
LinkedList的内部类 -Nod类(用于创建双向链表中的节点对象)
遍历ArrayList和LinkList的几种方式
- 普通for循环
- 增强型for循环
- ForEath循环
- 迭代法