《Java 核心技术 卷1》 笔记 第13章 集合(3)列表
13.2 具体的集合
集合类型 |
描述 |
ArrayList |
有序,可随机访问,查找快,增删慢 |
LinkedList |
有序,不可随机访问,增删快,查找慢 |
ArrayDeque |
双端队列,有序,不可随机访问,可头尾插入、头尾删除、头尾查看 |
HashSet |
无序哈希集合,不可重复,可检查存在性 |
TreeSet |
有序哈希集合,不可重复,可检查存在性,可排序,可查询大于小于某值的第一个元素,可获取头尾元素 |
EnumSet |
无序保存枚举值集合,快速获得存在性结果(位图的一种,更省空间) |
LinkedHashSet |
插入次序哈希集合,不可重复,可检查存在性,循环时按顺序 |
PriorityQueue |
堆(优先队列),可按顺序排序,插入元素时直接进行排序,插入查找效率都为 O(logn) |
HashMap |
无序键值对,键值不可重复,查找效率O(1),最坏O(logn) |
EnumMap |
枚举剪枝対,键值不可重复,快速获得存在性结果(位图的一种,更省空间) |
LinkedHashMap |
插入次序键值对,键值不可重复,可检查存在性,循环时按顺序 |
WeakHashMap |
弱引用哈希表,可被垃圾回收器回收 |
IdentityHashMap |
哈希强制通过地址判断 |
13.2.1 链表
插入、删除快,查找速度慢的数据结构
现实中使用的情况:栈(配对,比如编译器括号匹配检查)、队列(最常用BFS,有限步数的最优解),跳表(快速在有序集合内查找指定元素)
实际使用情况:算法题+框架级别底层数据结构(白话,初学不太用的上,面试笔试有用,需要学数据结构)
考点补充:List 集合的迭代器 ListIterator 可以查找前一个元素: previous(),也可以添加元素:add(), 普通集合迭代器 Iterator 不可以
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.ListIterator; public class LinkedListTest { public static void main(String[] args) { List a = new LinkedList(); a.add("Amy"); a.add("Carl"); a.add("Erica"); List b = new LinkedList(); b.add("Bob"); b.add("Doug"); b.add("Frances"); b.add("Gloria"); //b 的元素都拷贝到里 int size = a.size(); ListIterator aIter = a.listIterator(); Iterator bIter = b.iterator(); while (bIter.hasNext()){ if(aIter.hasNext()) aIter.next(); aIter.add(bIter.next()); } System.out.println(a); //删掉b的第偶数位置元素 bIter = b.iterator(); while(bIter.hasNext()){ bIter.next(); if(bIter.hasNext()){ bIter.next(); bIter.remove(); } } //a的元素还原,删掉多出的元素 System.out.print(b); while (aIter.hasPrevious() && a.size()>size){ aIter.previous(); aIter.remove(); } System.out.print(a); }}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
运行结果:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
13.2.2 数组列表
这个一直用,我不知道为什么反而简写了,这个速度更快一些,也更省内存。事实上在实际应用过程,很少直接在数组列表里面添加删除元素的(遇到的大概就是页面上批量选择图片/文件这种会用到批量修改集合元素)。走数据库进行增删操作,然后再取出来新的数据更多一些,几乎没有直接修改数组的情况。
线程安全:Vector
线程不安全:ArrayList