Java LinkedList

考点:

什么是LinkedList?

不仅是Java的一个类,还是一个数据结构
是经典的双向链表实现:prev/next指针
也是Java中最常用的Deque(双端队列)实现

核心数据结构?

双向链表

查找/插入/删除复杂度?

查找:O(n) (需要一个一个找,有优化,判断下标在前半部分就从前面开始找,在后半部分就在后面开始找)
查找+插入/删除:O(n) (要删除非头尾某个位置的元素要先找到它才能删除)
头尾插入/删除:O(1) (直接新建或者删除一个节点即可)

和ArrayList区别和联系?

核心数据结构的差别:LinkedList是双向链表,ArrayList是数组

适用场景:

LinkedList: 用在查询比较少而插入删除比较多的情况;比如需要缓存每分钟系统的内存使用情况,那么只需要没每次将最新的数据插入结果中即可,效率极高.
ArrayList: 使用在查询比较多,但是插入和删除比较少的情况;

源码:

add:新建一个节点,然后直接挂上去
get(index):

  • 检查index有没有超过容量.
  • 拿到该节点,然后获取元素
    • 如果index在链表的前半部分就从前面开始循环找
    • 如果index在链表的后半部分就从后面开始循环找

add 源码

/**
 * Appends the specified element to the end of this list.
 * (将指定的元素附加到此列表的末尾。)
 * <p>This method is equivalent to {@link #addLast}.
 * (此方法等效于addLast 。)
 *
 * @param e element to be appended to this list 要附加到此列表的元素
 * @return {@code true} (as specified by {@link Collection#add})
 */
public boolean add(E e) {
	// 
	linkLast(e);
	return true;
}

/**
 * Links e as last element.(元素附加到此列表的末尾)
 */
void linkLast(E e) {
	final Node<E> l = last;
	final Node<E> newNode = new Node<>(l, e, null);
	last = newNode;
	if (l == null) // 说明是第一次添加,是首节点
		first = newNode;
	else
		// 非第一次添加,所以直接挂最后
		l.next = newNode;
	// 容量计数增加
	size++;
	// 用于检测并发修改的计数也增加
	modCount++;
}

扩展:

transient 关键字,标志字段不被序列化.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值