List的任何子类存储字符串 * * ArrayList的使用。...removeFirst() removeLast() c:获取 getFirst() getLast() B:案例 a:LinkedList存储字符串并遍历 b:LinkedList存储自定义对象并遍历...* ArrayList去除集合中字符串的重复值(字符串的内容相同) * * 分析: * A:创建集合对象 * B:添加多个字符串元素(包含内容相同的) * C:创建新集合 * D:...遍历旧集合,获取得到每一个元素 * E:拿这个元素到新集合去找,看有没有 * 有:不搭理它 * 没有:就添加到新集合 * F:遍历新集合 */ public class ArrayListDemo...(认真思考) 你要定义一个集合类,只不过内部可以使用LinkedList来实现。
实现了Deque接口可以有双端队列操作 实现了Cloneable接口既可以用来做浅克隆 实现了Serializable接口可以用来做网络传输和持久化,同时可以使用序列化来做深度克隆。...从上面的源码里可以看到移除根据index移除里面调用了node(index)方法来查找需要移除的节点,而根据Object移除的时候,则是进行了整个链表的遍历,然后再卸载节点。...这里能够总结出来链表基于首尾节点的删除可以看成是O(1)操作,而非首尾的删除最坏的情况下能够达到O(n)操作,因为要遍历查询指定节点,所以性能较差。...(九)关于操作队列或者堆栈的方法 文章开头说了LinkedList可以当双端队列或者堆栈使用,这里面有一系列的方法,这里只简单列举几个常用的方法,因为原理比较简单所以不在叙述: ?...更加节省空间, 此外它的添加方法和首末位的删除操作非常快,但是查询和遍历操作比较耗时。
但是我们知道缓存的大小通常是有限制的。当缓存满了,我们就需要删除部分数据来腾出空间,问题在于我们基于什么标准来删除数据。...有没有办法让数据放进来的时候就排好序? 每次我们通过get访问一个缓存的元素,只要它存在于缓存中,那它肯定就变成最近最多使用(most recently used)的元素了,要被提取到数组的最前面。...对于单链表,找到它后面的节点很方便,要找到它前面的节点就得再次遍历链表了,这个时间复杂度太大了,所以我们使用一个额外的字段来记录它前一个节点,也就是双链表。...还用上面的例子来说明,我这边用双链表来记录最近被访问的元素,维护删除节点的先后顺序,链表的head是最近最多使用的元素,而tail则是最近最少使用的元素,实际上反过来也没什么问题,大家自己实现时按自己喜好来就好...,拿到一个节点时,我们可以快速从哈希表中移除元素,否则我们得遍历整个哈希表来匹配了。
有的人想有没有不重复的数组,所以有了set。 有人想有自动排序的组数,所以有了TreeSet、TreeList、Tree**。 而几乎所有的集合都是基于数组来实现的。...LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。...对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。...LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。...注意: 1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 2、Set和Collection拥有一模一样的接口。
简介 内部结构分析 LinkedList源码分析 构造方法 添加(add)方法 根据位置取数据的方法 根据对象得到索引的方法 检查链表是否包含某对象的方法: 删除(remove/pop)方法 LinkedList...,其中getFirst() 和element() 方法将会在链表为空时,抛出异常 element()方法的内部就是使用getFirst()实现的。...: " + linkedList); System.out.println("getFirst()获得第一个元素: " + linkedList.getFirst()); // 返回此列表的第一个元素...); System.out.println("for2:" + (end - start) + " ms"); // 通过pollFirst()或pollLast()来遍历...System.out.println("pollFirst()或pollLast():" + (end - start) + " ms"); // 通过removeFirst()或removeLast()来遍历
遍历 LinkedList 遍历 LinkedList 可以使用不同的方式,最常见的是使用 for-each 循环或迭代器。...linkedList.add(2, "葡萄"); // 在索引 2 处插入 "葡萄" 5.3 替换元素 您可以使用 set 方法来替换 LinkedList 中的元素。...6.2 时间复杂度 添加和删除元素:平均时间复杂度为 O(1)(在已知位置的情况下),最坏情况下为 O(n)(如果需要遍历整个链表)。...高级用法 8.1 双向链表 LinkedList 是一种双向链表的实现,这意味着每个节点都包含指向前一个节点和后一个节点的引用。这种双向连接使得在链表中向前和向后遍历都非常高效。...根据您的需求,您可以充分利用其双向链表的特性来解决问题。 9.
泛型程序设计 简要介绍 类型变量使用大写形式,且比较短,在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值得类型。...Object 表示”任意类型” 程序清单使用了Pair类,静态的minmax方法遍历了数组并同时计算出最大值和最小值。它用一个Pair对象返回了两个结果。...与Java泛型转换的事实 虚拟机中没有泛型,只有普通的类和方法。 所有的类型参数都用它们的限定类型替换 桥方法被合成来保持多态 为保持类型安全性,必要时插入强制类型转换。...可以采取两种方法来抑制这个警告。一种方法是为包含addAll调用的方法增加注解@SuppressWarnings(“unchecked”)。...可以通过 `@SuppressWarnings('unchecked')` 来消除对受查异常的检查。 ### 泛型类型的继承规则 1.
其中getFirst() 和element() 方法将会在链表为空时,抛出异常 element()方法的内部就是使用getFirst()实现的。...ArrayList的遍历效率会比LinkedList的遍历效率高一些。 LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Node的引用地址。...ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址。 如果确定插入、删除的元素是在前半段,那么就使用LinkedList。...如果确定插入、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList。 如果不能确定插入、删除是在哪儿呢?...建议使用LinkedList,一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况。
参考链接 JAVA 栈,为什么要使用Deque,而不推荐使用Stack,Deque中ArrayDeque与LinkedList的区别,Deque方法详解_java 栈为什么用deque-CSDN博客 简介...可以理解成,双端队列就是可以在队头 和 队尾进行操作,比如:查看队头队尾元素,弹出队头队尾元素,或者从队头和队尾插入元素,那也就意味着他可以用来当做 队列 和 栈 的数据结构使用 用法 队列 先进先出的线性数据结构...查看队头元素 方法 作用 E getFirst()/E element()/E pop() 只看第一个元素 ,不出来,为空就抛异常 E peekFirst()/ E peek() 只看第一个元素 ,不出来...push(E e) 将指定的元素插入此双端队列的前面 ,空间不足抛异常 出栈 方法 作用 E removeFirst()/E remove()/E pop() 检索并删除第一个元素,为空时抛出异常 E...pollFirst()/ E poll() 检索并删除第一个元素 ,为空时返回null 查看栈顶元素 方法 作用 E getFirst()/E element()/E pop() 只看第一个元素 ,
三:数组是一种可读/可写数据结构---没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本。...对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。...LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。...注意: 1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 2、Set和Collection拥有一模一样的接口。...3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get) 4、一般使用ArrayList。
),插入和删除元素的效率高(遍历元素和随机访问元素的效率低); 底层使用Node双向链表实现的 private static class Node { E item; //元素值...= element; this.next = next; this.prev = prev; } } 3、LinkedList初始化 // LinkedList包含首尾操作的特有方法...addLast(E e) addLast(E e)添加到链表首部 4.4 getFirst() getFirst() 获取第一个元素 4.5 getLast() getLast() 获取最后一个元素...,依次向前移动指针,直到找到指定下标位置,返回对应元素; 所以:当下标位置越接近元素个数一半值(越靠近中间位置),效率是最低的,可以看出:遍历和随机访问的效率低; 源码 public E get(int...,存放元素没限制; 3)使用场景不同:ArrayList适用于快速的遍历和随机访问元素,而LinkedList适用于快速的添加删除元素;
源代码解析LinkedList类的源代码可以在Java SE标准库中找到,它主要由以下几部分组成:Node类:双向链表中的节点,包含前驱节点、后继节点以及当前节点的值。...方法的泛型参数 E 表示元素的类型,这里使用了泛型来支持不同类型的元素。getFirst()public E getFirst() 该方法用于返回列表中的第一个元素。...拓展: 这是一个泛型方法,返回类型为E,表示返回值类型不确定,由调用方法时传入的参数类型来决定。 方法名为getFirst,没有参数。 ...然后,使用 ListIterator 迭代器遍历列表并输出每个元素。 接下来,代码演示了如何在指定位置插入元素,使用 add() 方法并指定插入位置即可。...最后,演示了如何获取列表中的第一个和第二个元素,分别使用 getFirst() 和 get() 方法。 综上,该代码演示了 LinkedList 类的基本用法,包括添加、遍历、插入、删除和获取元素。
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。...LinkedList同样是非线程安全的,只在单线程下适合使用。 LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆。...无参构造方法直接建立一个仅包含head节点的空链表,包含Collection的构造方法,先调用无参构造方法建立一个空链表,而后将Collection中的数据加入到链表的尾部后面。...该方法返回双向链表中指定位置处的节点,而链表中是没有下标索引的,要指定位置出的元素,就要遍历该链表。 从源码的实现中,我们看到这里有一个加速动作。...源码中先将index与长度size的一半比较,如果indexsize/2,就只从位置size往前遍历到位置index处。这样可以减少一部分不必要的遍历,从而提高一定的效率(实际上效率还是很低)。
插入和删除速度快,访问速度慢。 对于List的随机访问来说,就是只随机来检索位于特定位置的元素。...LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。...于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。 三、总结与注意 Collection 和 Map 的区别 容器内每个为之所存储的元素个数不同。...6、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 7、List,可以通过get()方法来一次取出一个元素。...使用数字来选择一堆对象中的一个,get(0)...。
- 双链表的节点除了包含数据元素和指向下一个节点的指针外,还包含一个指向前一个节点的指针。...LinkedList 提供的方法来删除元素: remove(): 移除头部的元素。...- 尾部删除 O(n) 需要遍历找到尾部的前一个节点。 - 指定位置删除 O(n) 需要遍历找到该位置。 访问元素 O(n) 需要从头开始逐个遍历找到指定位置。...remove 方法 } } 使用 CopyOnWriteArrayList 或其他线程安全的集合来避免并发问题。...解决方法: 使用弱引用(WeakReference)来避免不必要的对象持有。
LinkedList是一个实现了List接口和Deque接口的双端链表 有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。...LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以使用如下方式: List list=Collections.synchronizedList(new LinkedList...(); } 从代码可以看到,element()方法的内部就是使用getFirst()实现的。...按照位置删除 返回是否删除成功的标志 返回被删除的元素 按照对象删除 3.1 删除指定对象 remove(Object o) 一次只删除一个匹配的对象,如果删除了匹配对象,返回true,否则false...适用于频繁增加、删除的情况 该类不是线程安全的 由于LinkedList实现了Queue接口,所以LinkedList不止有队列的接口,还有栈的接口,可以使用LinkedList作为队列和栈的实现
增强for循环 实际开发中,由于迭代器操作繁琐,所以最常使用的是 foreach 循环(又叫增强 for 循环)来完成元素的 获取,增强 for 循环是完成集合迭代的简化方式。...所以在使用增强 for 时,我们要尽量避免在遍历过程中为集合添加/删除数据, 解决方案: 普通 for: 遍历时,可以进行添加/删除操作。 ...增强 for: 仅仅做遍历,不会在遍历中 添加/删除 集合元素 练习: 集合中存储多个 Person(姓名、年龄、性别、描述)对象,将集合中年龄大于 80 岁的 Person 对象 删除。...) 但 LinkedList 中这两个索引操作的方法严禁使用,因为效率极低 总结: 需要一次性保存大量数据,经常进行索引遍历数据,推荐使用 ArrayList 需要进行数据频繁的追加和删除...,极少使用索引遍历数据,推荐使用 LinkedList 练习: 1、公司新闻公告,需要频繁滚动新闻(添加新新闻,但每次只展示前 4 条新 闻)。
/* * 返回第一次出现指定元素的位置,或者-1如果不包含指定元素。...null,对元素链表进行遍历,返回x的元素为空的位置 如果需要检索的元素不是null,对元素的链表遍历,直到找到相同的元素,返回元素下标 lastIndexOf(Object o) :.../* * 返回最后一次出现指定元素的位置,或者-1如果不包含指定元素。...删除节点的示意图如下: !...、查找、删除,下面来介绍一下其他的方法 clone() /* * 链表复制 */ public Object clone() {
如果我们遍历Collection集合,使用for循环是无法使用的。我们可以借Collection中的toArray方法转换成数组,来遍历集合!...这种方式也能实现,但总觉得不太舒服,这时,JDK提供了一个Iterator接口来专门用于遍历集合。...Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程: 在调用Iterator...通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。...//集合的另一种遍历方式(jdk8以上才能使用) con.forEach(System.out::println); } } 新for循环必须有被遍历的目标。
一、集合: 集合是Java API所提供的一系列类的实例,可以用于动态存放多个对象 为什么要使用集合?数组的长度是固定的,存满了就不能存了。...HashSet一样,hashCode(),equals() 2、TreeMap:是根据键来排序的,保证键唯一的原理和TreeSet相同,依据 compareTo()或compare()的返回值是否为0,...> c) 从集合中删除所有指定集合包含的对象 (3)、void clear() 清空集合 3、判断方法 (1)、boolean contains(Object o) 判断是否集合中是否包含指定对象 (...next最后一次获取的对象,如果使用迭代器遍历集合,必须使用迭代器的remove方法删除元素 26 } 27 System.out.println("----------...next最后一次获取的对象,如果使用迭代器遍历集合,必须使用迭代器的remove方法删除元素 8 }