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 ...
随机推荐
- vue 开发插件流程
UI demo UI 插件汇总 我的github iSAM2016 在练习写UI组件的,用到全局的插件,网上看了些资料.看到些的挺好的,我也顺便总结一下写插件的流程: 声明插件-> 写插件-&g ...
- Ubuntu 14.04 kylin 安装 OpenCV 2.4.9|3.0.0
首先安装依赖 sudo apt-get -y install libopencv-dev sudo apt-get -y install build-essential checkinstall cm ...
- 编程语言分类 + python解释器的安装 + jupyter的使用(day 02整理)
目录 一.昨日内容回顾 一 计算机基础之编程 (一) 什么是编程语言 (二) 什么是编程 (三) 为什么编程 二 计算机组成 (一) CPU (二) 存储器 (三) I/O设备 (四) 多核CPU ( ...
- day3,用户交互,input的应用
1.与用户交互 输入:input() python2.x版本 input后面家的东西要声明输入的类型 >>> input(">>:") ...
- django-URL认识(一)
URL由三部分组成:资源类型.存放资源的主机域名.资源文件名.也可认为由4部分组成:协议.主机.端口.路径 URL的一般语法格式为:(带方括号[]的为可选项): protocol :// hostna ...
- 数据库系统(六)---MySQL语句及存储过程
一.DDL.DML.DCL常用语句 1.DDL(Data Definition Language)数据库定义语言 (1)数据库模式定义 #创建数据库 create database if exsite ...
- transform-origin盒子旋转位置
transform-Origin属性允许您更改转换元素的位置. 2D转换元素可以改变元素的X和Y轴. 3D转换元素,还可以更改元素的Z轴. 为了更好地理解Transform-Origin属性,请查看这 ...
- Angular工作笔记(2018/8/8)
需求1:input标签只允许输入数字且不会出现上下选择按钮 开始设置 type="number" 客户不想要出现上下选择按钮 解决方法: 但是这种写法会有一个限制,只能输入整数,无 ...
- 说说 Python3 中的数字处理
最近在处理订单相关的问题,踩了数字的一些坑,在此记录下. 其中有问题的代码涉及金额比较,便于描述,假设了下面一段代码 def is_paid(pay_price, paid_price): retur ...
- 记 Maven 本地仓库埋坑之依赖包为何不能用
记一次 Maven 本地仓库埋坑之 Verifying Availability 背景 某 Java 后端项目使用 maven 构建,因为某些原因,某些依赖库下载不了,直接找其它人索要了他电脑上的 m ...