From 13818f9b75cbcce94532549d8aae5128d461b3d5 Mon Sep 17 00:00:00 2001 From: panchaoyuan Date: Mon, 23 Dec 2019 18:00:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=81K=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\220\347\240\201\345\210\206\346\236\220" | 21 +++++++++++++++++++ ...2\220\347\240\201\345\210\206\346\236\220" | 8 +++++++ 2 files changed, 29 insertions(+) create mode 100644 "week_02/49/LinkedList\346\272\220\347\240\201\345\210\206\346\236\220" create mode 100644 "week_02/49/Unsafe\346\272\220\347\240\201\345\210\206\346\236\220" diff --git "a/week_02/49/LinkedList\346\272\220\347\240\201\345\210\206\346\236\220" "b/week_02/49/LinkedList\346\272\220\347\240\201\345\210\206\346\236\220" new file mode 100644 index 0000000..a6cd66f --- /dev/null +++ "b/week_02/49/LinkedList\346\272\220\347\240\201\345\210\206\346\236\220" @@ -0,0 +1,21 @@ +一、LinkedList的特性: +LinkedList基于双向链表(所以定义了的属性包含链表链表头节点first和链表尾节点last)适用于增删频繁且查询不频繁的场景,线程不安全的且适用于单线程。 +LinkedList常见的构造函数是LinkedList()和LinkedList(Collection c)两种。 +LinkedList继承的类和实现的接口如下: +LinkedList 集成AbstractSequentialList抽象类,内部使用listIterator迭代器来实现重要的方法 +LinkedList 实现 List 接口,能对它进行队列操作。 +LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 +LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 +LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 +二、LinkedList的函数介绍: +1、增加元素方法: +①linkedList.add(E e):创建一个newNode它的prev指向之前队尾节点last,并记录元素值e,之前的队尾节点last的next指向当前节点,size自增,modcount自增。 +②linkedList.add(int index, E element):首先去检查下标是否越界,然后判断如果加入的位置刚好位于队尾就和我们add(E element)的逻辑一样了, +如果不是则需要通过 node(index)函数定位出当前位于index下标的node,再通过linkBefore()函数创建出newNode将其插入到原先index位置 +2、删除元素方法: +①linkedList.remove(int index):首先根据index通过方法值node(index)来确定出集合中的下标是index的node, +主要看unlink()方法,其实只是将当前要删除的节点node的头结点的尾节点指向node的尾节点、将node的尾结点的头节点指向node的头节点,然后将下标为index的node置空,供GC回收 +②linkedList.remove(Object o):首先判断一下当前要删除的元素o是否为空,然后进行for循环定位出当前元素值等于o的节点node, +然后再走的逻辑就是上面我们看到过的unlink()方法,也很简单,比remove(int index) 多了一步 +3、修改元素方法 +①set(int index, E element):首先检查下标是否越界,然后根据下标获取当前Node,然后修改节点中元素值item。 \ No newline at end of file diff --git "a/week_02/49/Unsafe\346\272\220\347\240\201\345\210\206\346\236\220" "b/week_02/49/Unsafe\346\272\220\347\240\201\345\210\206\346\236\220" new file mode 100644 index 0000000..de54fa4 --- /dev/null +++ "b/week_02/49/Unsafe\346\272\220\347\240\201\345\210\206\346\236\220" @@ -0,0 +1,8 @@ +1、Unsafe类介绍: +①Java 不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe 类提供了硬件级别的原子操作。 +②Unsafe 类在 sun.misc 包下,不属于 Java 标准。很多 Java 的基础类库,包括一些被广泛使用的高性能开发库都是基于 Unsafe 类开发,比如 Netty、Hadoop、Kafka 等 +③Unsafe 对象不能直接通过 new Unsafe() 或调用 Unsafe.getUnsafe() 获取。Unsafe 被设计成单例模式,构造方法私有。getUnsafe 被设计成只能从引导类加载器(bootstrap class loader)加载。 +④Unsafe 的大部分 API 都是 native 的方法。 +2、CAS相关 +①compareAndSwap,内存偏移地址 offset,预期值 expected,新值 x。如果变量在当前时刻的值和预期值 expected 相等,尝试将变量的值更新为 x。 +如果更新成功,返回 true;否则,返回 false \ No newline at end of file -- Gitee