java集合讲解
java集合讲解
1.概述
- 集合类的顶级接口是Iterable,Collection继承了Iterable接口
- 常用的集合主要有 3 类,Set,List,Queue,他们都是接口,都继于Collection
- Set下的实现类有HashSet,LinkedHashSet,TreeSet等
- List下的实现类主要有ArrayList,Vector,LinkedList
- Queue基本上是一个先入先出(FIFO)数据结构的队列

| 集合类名 | 数据结构 | 特点 |
|---|---|---|
| ArrayList | 数组 | 查询快,增删慢,线程不安全,但效率较Vector高 |
| Vector | 数组 | 查询快,增删慢,线程安全,但效率相对较低 |
| LinkedList | 双向链表 | 查询慢,增删快,线程不安全,效率高 |
| HashSet | 哈希表 | 集合内数据不重复,依赖hashCode()和equals()方法,但元素乱序 |
| LinkedHashSet | 链表与哈希表 | 数据不重复,保证遍历顺序为插入顺序(区分:不是排序) |
| TreeSet | 红黑树 | 数据不重复且有序,支持自然排序和自定义排序(Comparable接口) |
2.List
- ArrayList和Vector内部都采用数组实现,不指定大小的情况下,默认容量10,数组的特点,查询(根据索引访问)直接寻址,所以查询的效率非常高
- ArrayList与Vector的实现基本一样,但Vector方法上都使用synchronized加锁来保证线程安全,相比ArrayList来说效率较低,所以一般我们使用ArrayList,并发也可外部自己来实现
- ArrayList和Vector尾部添加元素时,也就是常用的add() 方法,如果当前容量足够,不涉及扩容,添加效率也很高
- 我们一般说ArrayList和Vector增删慢,是因为中间插入、删除,即add(index, element)和remove(index),或者需要扩容的尾部添加,在这样的操作时,ArrayList和Vector都需要进行数组的重组,频繁触发影响效率
- LinkedList内部采用了双向链表,在插入与删除时,仅仅调整链表指针指向,所以增删效率高,但对于元素获取,虽然LinkedList可根据索引大小来判断前序遍历还是后序遍历,但效率都较ArrayList和Vector低
3.Set
- HashSet底层实际上是一个HashMap ,初试化容量都是16,默认加载因子是0.75.
- HashSet内部元素不重复, 是根据hashCode()和equals()方法来控制,先根据hashCode()获取hash值,hash值重复则调用equals()方法,所以如果要自定义重复规则,需要重写hashCode()和equals()方法
- HashSet遍历元素是无序的,既不记录插入顺序,内部元素也不按规则排序
- LinkedHashSet是HashSet的子类,内部是LinkedHashMap,即链表加哈希表,初试化容量都是16,默认加载因子是0.75,通过链表来保证了记录插入顺序
- TreeSet底层是红黑树,排序通过Comparable接口的compareTo()方法来实现,自定义对象如果需要排序需要重写该方法
- 需要特别注意的是:我们常说LinkedHashSet有序, 这个是指他的遍历顺序与插入顺序是一致的,而说的TreeSet有序,是指其内部元素是按一定规则排序的,这个千万要区分
4.Queue
- Queue队列默认使用FIFO(先进先出)规则
- 实现类PriorityQueue 和 ConcurrentLinkedQueue是不阻塞队列,PriorityQueue 类实质上维护了一个有序列表,ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列
- 而阻塞队列类,它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用
- ArrayBlockingQueue :一个由数组支持的有界队列
- LinkedBlockingQueue :一个由链接节点支持的可选有界队列
- PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列
- DelayQueue :一个由优先级堆支持的、基于时间的调度队列
- SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制
java集合讲解的更多相关文章
- 超详细的java集合讲解
1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...
- java集合讲解干货集
文章都来自网络,收集后便于查阅. 1.Java 集合系列01之 总体框架 2.Java 集合系列02之 Collection架构 3.Java 集合系列03之 ArrayList详细介绍(源码解析)和 ...
- 常用的JAVA集合讲解
java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 接口:Collection Collection是最基本的集合接口,一个Coll ...
- java集合框架的讲解
下面要开始java中相关集合框架的学习啦. Are you ready?Let's go~~ 今天要讲解的Java中的集合框架. 1) 首先查看jdk中Collection类的源码后会发现如下内容: ...
- 【深入理解Java集合框架】红黑树讲解(上)
来源:史上最清晰的红黑树讲解(上) - CarpenterLee 作者:CarpenterLee(转载已获得作者许可,如需转载请与原作者联系) 文中所有图片点击之后均可查看大图! 史上最清晰的红黑树讲 ...
- Java集合---ArrayList的实现原理
目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 6) 调整数组容量 ...
- 《深入理解Java集合框架》系列文章
Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...
- Java集合之Collection接口
java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...
- Java 集合系列 12 TreeMap
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
随机推荐
- 《编写可维护的JavaScript》 笔记
<编写可维护的JavaScript> 笔记 我的github iSAM2016 概述 本书的一开始介绍了大量的编码规范,并且给出了最佳和错误的范例,大部分在网上的编码规范看过,就不在赘述 ...
- 设计模式(十三)Visitor模式
Visitor模式可以用来把数据结构与处理分离开.通俗来说就是编写一个访问者类来访问数据结构中的元素,并把对各元素的处理交给访问者类.这样,当需要增加新的处理时,只需要编写新的访问者,然后让数据结构可 ...
- Unity调用Android
1.Unity调用Android 根据unity用户手册,unity可以采用native code(c/c++),但是也提供了C#调用方法,本文对此进行简单讲解. 2.Unity获取android类 ...
- 源码学习系列之SpringBoot自动配置(篇一)
源码学习系列之SpringBoot自动配置源码学习(篇一) ok,本博客尝试跟一下Springboot的自动配置源码,做一下笔记记录,自动配置是Springboot的一个很关键的特性,也容易被忽略的属 ...
- php经典设计模式和Trait类代码的复用
PHP经典设计模式 <?php /** * 单例模式 */ class Site { #定义属性 public $siteName; #定义本类的静态实例 protected static $i ...
- AtCoder Grand Contest 038
目录 \(\bf A - 01 \ Matrix\) \(\bf B- Sorting \ a \ Segment\) \(\bf C-LCMs\) \(\bf D-Unique \ Path\) 这 ...
- CSPS模拟 59
经ooo提醒咕题解会掉rp 我反正也冒着改不完题的风险,就开始颓博了 话说好久没这么舒坦的垫过底了233 上来一看T1,立刻就转化题意为有奇偶性和距离限制的bfs 然后就没考虑子串不能越过母串边界的事 ...
- 二叉查找树学习笔记(BST)
我土了....终于开始看平衡树了,以前因为害怕一直不敢看数据结构...浑浑噩噩跟同学落了1—2个数据结构没看....果然,我是最弱的 二叉查找树,遵守每个点的左儿子小于点小于右儿子. 于是,BST能够 ...
- php debug_backtrace方法跟踪代码调用
php debug_backtrace方法跟踪代码调用<pre>function string 当前的函数名,参见: __FUNCTION__.line integer 当前的行号.参见: ...
- php微信卡券logo上传方法
php微信卡券logo上传方法 <pre> $xiangmupath = $this->getxiangmupath(); $logo = $xiangmupath . '/imag ...