Java集合类学习笔记2
二,具体的集合
集合类型 | 描述 |
ArrayList | 一种可以动态增长和缩减的索引序列 |
LinkedList | 一种可以在任何位置进行高效地插入和删除操作的有序序列 |
ArrayDeque | 一种用循环数组实现的双端队列 |
HashSet | 一种没有重复元素的无序集合 |
TreeSet | 一种有序集 |
EnumSet | 一种包含枚举类型值的集 |
LinkedHashSet | 一种可以记住元素插入次序的集合 |
PriorityQueue | 一种允许高效删除最小元素的集合 |
HashMap | 一种存储键/值关联的数据结构 |
TreeMap | 一种键值有序排列的映射表 |
EnumMap | 一种键值属于枚举型的映射表 |
LinkedHashMap | 一种可以记住键/值项添加次序的映射表 |
WeakHashMap | 一种其值无用武之地后可以被垃圾回收器回收的映射表 |
IdentityHashMap | 一种用==,而不是用equals比较键值的映射表 |
如上表,除了以Map结尾的类之外,其他类都实现了Collection接口。而以Map结尾的类实现了Map接口。
1.链表
数组和数组列表都有一个很大的缺陷,从数组的中间位置删除一个元素要付出很大的代价,因为数组中处于被删除元素之后的所有元素都要向数组的前端移动。在数组的中间位置上插入一个元素也是如此。然而,链表正好解决了这个问题。
所有的链表都是双向链接的,链表将每个对象存放在独立的结点中。每个结点都存放着序列中下一个结点的引用 和 前驱结点的引用。
链表提供了get()方法来访问特定的元素。绝对不应该使用for循环来遍历链表效率极低。每次查找一个元素都要从列表的头部重新开始搜索,LinkedList对象根本不做任何缓存位置信息的操作。
列表迭代器接口还有一个方法,可以告之当前位置的索引。实际上,由于Java迭代器指向两个元素之间的位置,所以可以同时产生两个索引:nextIndex方法返回下一个调用next方法时返回元素的整数索引;previousIndex方法返回下一次调用previous方法时返回元素的整数索引。这两种方法的效率比较高。
2.散列表
链表和数组可以按照人们的意愿来排序元素的次序。但是想查看某个指定的元素,却又忘记了它的位置,就需要访问所有的元素,直到找到为止。散列表解决了这个问题,散列表为每个对象计算一个整数,称为散列码(hash code)。不同数据区域的对象将产生不同的散列码。
在Java中,散列表用列表数组实现。每个列表被称为桶(bucket),如果大致知道最终会有多少个元素插入到元素中,就可以设置桶数。最好将桶数设置为一个素数,以防键的集聚,桶数设置为元素个数的75%-150%。
散列表可以用于实现几个重要的数据结构。其中最简单的是set类型。set是没有重复元素的元素集合。set的add方法首先在集中查找要添加的对象,如果不存在,就将这个对象添加进去。
Java类库中提供了一个HashSet类,它实现了基于散列表的集。可以用add方法添加元素。contains方法已经被重新定义,用来快速地查看是否某个元素已经出现在集中。
3.树集
TreeSet与散列集十分相似,不过,它比散列集有所改进。树集是一个有序集合,可以以任意顺序将元素插入到集合中,在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现。例如:
SortedSet<String> sorter = new TreeSet<String>(); sorter.add("Bob"); sorter.add("Amy"); sorter.add("Carl"); for(String sorter) System.println(s);
这时候,打印出来:Amy,Bob,Carl。将一个元素添加到树中要比添加到散列表中慢,但是,与将元素添加到数组或者链表的正确位置上相比还是快很多的。如果树中包含了n个元素,查找新元素的正确位置平均需要log以2为底n次方比较。因此,将一个元素添加到TreeSet中要比添加到HashSet中慢。
4.优先级队列
优先级队列中的元素可以按照任意顺序插入,但总是按照排序进行检索。也就是说何时调用remove方法,总会获得当前优先级队列中最小的元素。
典型实例就是任务调度。
5.映射表
通常,我们知道某些键的信息,并想要查找与之对应的元素。映射表(map)数据结构就是为此设计的。映射表用来存放键/值对。如果提供了键,就能找到值。Java类库为映射表提供了两个通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。
Java集合类学习笔记2的更多相关文章
- java集合类学习笔记之HashMap
1.简述 HashMap是java语言中非常典型的数据结构,也是我们平常用的最多的的集合类之一.它的底层是通过一个单向链表(Node<k,v>)数组(也称之为桶bucket,数组的长度也叫 ...
- java集合类学习笔记之LinkedHashMap
1.简述 LinkedHashMap是HashMap的子类,他们最大的不同是,HashMap内部维护的是一个单向的链表数组,而LinkedHashMap内部维护的是一个双向的链表数组.HashMap是 ...
- java集合类学习笔记之ArrayList
1.简述 ArrayList底层的实现是使用了数组保存所有的数据,所有的操作本质上是对数组的操作,每一个ArrayList实例都有一个默认的容量(数组的大小,默认是10),随着 对ArrayList不 ...
- java集合类学习笔记1
一.集合的接口 java集合类库也将接口与实现相分离.首先看一下大家都熟悉的数据结构-队列是如何分离的.队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数.当需要 ...
- Java集合类学习笔记(Set集合)
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...
- Java集合类学习笔记(各种Map实现类的性能分析)
HashMap和Hashtable的实现机制几乎一样,但由于Hashtable是一个古老的.线程安全的集合,因此HashMap通常比Hashtable要快. TreeMap比HashMap和Hasht ...
- Java集合类学习笔记(Map集合)
Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...
- Java集合类学习笔记(各种线性表性能分析)
ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...
- Java集合类学习笔记(Queue集合)
Queue集合用于模拟队列(先进先出:FIFO)这种数据类型. Queue有一个Deque接口,代表一个"双端队列",双端队列可以同时从两端来添加.删除元素,因此Deque的实现类 ...
随机推荐
- Windows系统Git安装配置
Git的安装 Git是一个开源的分布式的版本控制软件,是Linus Torvalds 为了方便开源贡献者协同开发和管理 Linux 内核开发替代BitKe而开发的. 打开git官网的下载地址:http ...
- Oracle视图 create View
视图是一种虚表,使用CREATE VIEW语句来定义视图,该视图是基于一个或多个表或视图的逻辑表.一个视图本身不包含任何数据, 视图所基于的表称为基表. 视图就相当于一条select 语句,定义了一个 ...
- 变量类型-String
教程:一:字符串的创建 用单引号.双引号括起来,同时用转义字符转义 二:字符串的索引 变量[头标:尾标] 从前到后:0---end 从后到前:-1---->-len(str)三:获取 ...
- jQuery插件开发的五种形态小结(转)
关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...
- linux 文件 IO 目录操作及文件属性
///练习:实现列出某个目录中所有文件属性(文件大小,文件最后修改时间,文件名)//目录名由参数传入 ./dir /home/linux#include <sys/stat.h>#incl ...
- 解决C#中FileSystemWatcher类的Changed事件触发多次的问题
public static void WatchFile() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = ...
- graph engine
有个侥幸的机会,参与了微软的项目,侥幸的接触了,graph engine图形数据库,感觉很是新颖,做点记录,和大家分享,理解有限,发现不足之处,还请指点. 微软发分布式图处理引擎GraphEngine ...
- mysql视图、存储过程等
视图: 需求: 创建的临时表(select * from tb1)被反复使用,这时可以为该临时表创建视图.视图相当于为某个查询创建了别名. 1.创建视图 create view v1 as selec ...
- 建立live555海思编码推流服务
因项目需要,这一周弄了一下live555.需求:海思编码——>RTSP server,使用VLC可以访问,类似于网络摄像机的需求.看了一下,live555的架构太复杂了,半桶水的C++水平还真的 ...
- vue Baidu Map --- vue百度地图插件
vue Baidu Map 官网:https://dafrok.github.io/vue-baidu-map/#/zh/start/installation javascript 官网:http:/ ...