🏠个人主页: 黑洞晓威
🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在CSDN中与大家一起成长。
🎁如果你也在正在学习Java,欢迎各位大佬来到我的博客查漏补缺呀,如果有哪里写的不对的地方也欢迎诸佬指正啊。
1. List实现类的对比
List接口:存储有序的,可重复的数据。
- ArrayList : 作为List的主要实现类;线程不安全,效率高;底层使用Object[] elementDatec存储
- LinkedList : 作为频繁的插入,删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
- Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementDatec存储
2. ArrayList底层结构和源码分析
1、注意事项:
- 允许存储所有元素,包括null,ArrayList可以加入一个或者多个null
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全的(源码中没有synchronized关键字,执行效率高)
2、ArrayList底层操作机制源码分析
ArrayList中维护了一个Object类型的数组elementData:
transient Object[] elementData;//transient关键字表示,该属性不会被序列化
- 当创建ArrayList对象的时候,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如需再次扩容, 则扩容elementData1.5倍
- 如果使用的是指定大小的构造器,则初始化elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
3. LinkedList底层结构与源码分析
LinkedList说明:
- LinkedList底层实现了双向链表和双端队列的特点
- 可以添加任意元素(可以重复), 包括null
- 线程不安全,没有实现同步
LinkedList底层机制
- LinkedList底层维护了一个双向链表
- LinkedList中维护了两个属性first和last分别指向首节点和尾节点
- 每个节点(Node对象),里面又维护了prev、next、item三个属性,其中prev指向前一个,通过next指向后一个节点,最终实现双向链表
- 所以LinkedList的元素添加和删除,不是通过数组实现的,相对来说效率较高
4 . List中的常用方法
方法 | 作用 |
---|---|
add(int index,Object obj) | 在index位置插入元素 |
allAdd(int index ,Collection coll) | 从index位置开始将coll总所有元素添加进来 |
get(int index) | 获取指定index位置的元素 |
remove(int index) | 移除指定index位置的元素并返回此元素 |
set(int index , Object obj) | 设置指定index位置的元素为obj |
subList(int fromIndex,int toIndex) | 返回从fromIndex到 toIndex位置的子集合 |
indexOf(Object obj) | 返回obj在集合中首次出现的位置 |
LastIndexof(Object obj) | 返回obj在当前集合中末次出现的位置 |
List中的增删改查插
public static void main(String[] args) {
ArrayList list = new ArrayList();
//增
list.add(123);
list.add(456);
list.add(new String("AA"));
list.add(new Student("张三",18));
System.out.println(list);
//删
list.remove(0);
list.remove(new Integer(123));
System.out.println(list);
//改:
list.set(0,007);
//查:
list.get(0);
//插:
list.add(1,234);
}
遍历的两种方法:
ArrayList list = new ArrayList();
//增
list.add(123);
list.add(456);
list.add(new String("AA"));
list.add(new Student("张三",18));
System.out.println(list);
//方式一:
//Iterator迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//方式二:
//增强for循环
for(Object obj:list){
System.out.println(obj);
}
一道面试题
区分List中remove(int index)和remove(Object obj)
remove(int index)通过下标删除remove(Object obj)通过元素删除
如何选择ArrayList和LinkedList:
1)如果改查操作多,选择ArrayList
2)如果增删操作多,选择LinkedList
3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下都会选择ArrayList
4)在一个项目中,根据业务灵活选择。
🎉文章到这里就结束了,感谢诸佬的阅读。🎉💕欢迎诸佬对文章加以指正,也望诸佬不吝点赞、评论、收藏加关注呀😘