> 文档中心 > 《Java 核心技术 卷1》 笔记 第13章 集合(3)列表

《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