[Java]LinkedList的使用

文章详细介绍了LinkedList和ArrayList作为Java中List接口的实现类的区别。LinkedList基于双向链表,擅长头尾插入删除,但访问速度慢;而ArrayList使用数组,适合随机访问,插入删除操作效率低。两者各有优劣,适用于不同的应用场景。
摘要由CSDN通过智能技术生成

LinkedList和ArrayList都是实现了List接口的集合类,LinkedList的底层存储结构使用的是双向链表,相比于ArrayList,LinkedList的对中间下标数据的删除和插入的效率更高,头插和尾插的效率提升到了O(1),解决了ArrayList插入开销大的弊端,但是LinkedList访问数据的效率相比较来说更低。

 一、LinkedList的实现细节

 LinkedList内部维护两个节点,一个首结点一个尾节点,尾结点是的LinkedList的尾插效率提升到了O(1),中间节点的插入和删除还是需要遍历到这个节点然后再进行插入和删除,效率为O(n)

二、LinkedList的创建

(1)无参构造

LinkedList<Integert> list=new LinkedList<>();
//无参构造,内部没有一个节点

LinkedList的无参构造方法是空白的,不会做任何处理,首节点和尾结点也就会是默认值null

(2)使用其他集合类来构造

LinkedList<Integer> list=new LinkedList<>(Collection<? extends E> c);
//使用其他实现了Collection接口的对象来构造

其实这种使用Conllection来初始化都是利用了collection接口的toArray方法,先将集合类转换为数组,然后再依次插入

三、LinkedList的常用方法

除了List的常用方法(List的常用方法),还添加了一些方法

(1)头插尾插(特殊下标的插入)

addFirst(E e);头插

addLast(E e);尾插

(2)头删尾删(特殊下标的删除)

removeFirst();头删

removeLast();尾删

(3)subList(int fromIndex,int toIndex);截取一个下标区间的元素,区间左闭右开。LinkedList的调用subLIst方法返回的对象是全新的对象,该表截取出来的链表并不会影响到父表,和ArrayList的sublist截取的是父表的数组不同。

四、LinkedList的遍历

(1)forEach遍历

//实例出了一个名为list的LinkedList<Integer>对象
for(int a:arr){
    System.out.println(a);
}

 (2)使用迭代器顺序遍历

//实例出了一个名为list的LinkedList<Integer>对象
ListIterator<Integer> it=list.ListIterator();
while(it.hasNext){
    int a=it.next();
    System.out.println(a);
}

 (3)使用迭代器逆序遍历

//实例出了一个名为list的LinkedList<Integer>对象
ListIterator<Integer> it=list.ListIterator(list.size());
while(it.hasPrevious){
    int a=it.previous();
    System.out.println(a);
}

五、ArrayList和LinkedList的区别

(1)ArrayList的底层数据结构是数组,LinkedList的底层数据结构是链表。数组的存储空间是连续的,链表的存储空间逻辑上连续,但是实际上不连续。

(2)ArrayList支持随机访问,LinkedList不支持随机访问。

(3)ArrayList的中间位置的插入删除需要移动后面的元素,LinkedList可以直接插入。

(4)ArrayList适合查询需求比较多,插入删除较少的应用场景。LinkedList适合插入删除较多,查询需求少的场景。

(2)ArrayList的扩容机制是一点5倍扩容,存在存储空间浪费的隐患。 LinkedList则没有容量的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值