java-javaSE-集合类
集合类结构
- 集合类的基本接口是
Collection和MapCollection向下派生出SetListQueue等接口Map向下派生出HashMapLinkedHashMapTreeMap等实现类
Collection
- Set代表无序的,元素不可重复的集合;
- List代表有序的,元素可以重复的集合;
- Queue代表先进先出(FIFO)的队列。
List 和 Set 的区别
- 有序性
- List 集合中存储的元素是有序的。集合中的元素按照存储的先后顺序排序。
- Set 集合中存储的元素是无序的。
- 可重复性
- List 集合中可以存储重复元素,同样允许多个NULL值的存在。
- Set 集合不能存储重复元素,只能存在一个NULL值。
- 迭代方式
- List 集合可以使用迭代器遍历,也可以通过索引进行查询和遍历
- Set 集合只能使用迭代器获取和遍历集合中的元素
ArrayList 和 LinkedList 的区别
- 实现结构
- ArrayList 是基于数组结构实现的,因此是使用连续的存储空间进行数据存储。
- LinkedList 是基于链表结构实现的,因此存储数据可以分散在内存空间中。
- 查询效率
- ArrayList 是数组实现,可以直接通过下标查询到目标数据,因此时间复杂度为O(1)
- LinkedList 是链表实现,需要通过遍历链表中的节点查找目标数据,因此时间复杂度为O(n)
Map
HashMap 源码分析
存储结构
- JDK1.7 中的 HashMap,是基于数组+链表来实现的,它的底层维护一个Entry数组,数组中的每个元素都是一个链表头节点。
- 当出现哈希冲突时,新插入的元素会被添加到数组索引所在链表上(插入头部)。
- 存在的问题是,当哈希冲突严重时,链表的长度过长,导致查询的效率下降。
- 注意,JDK1.7 在多线程环境下可能出现链表成环的问题
- JDK1.8 中的 HashMap,是基于数组+链表+红黑树来实现的,它的底层维护一个Node数组。
- 在1.8中引入红黑树结构,目的是解决哈希冲突严重时查询效率低的问题,链表为O(N),而红黑树一直是O(logN)。
- 当数组的长度大于64,同时链表的节点个数大于等于8的时候,链表会转为红黑树
- 当链表的节点数低于6时会将红黑树转回链表
- 注意在 JDK1.8 中插入数据是尾插法
添加元素流程
- 计算索引
- 计算对象(key)的哈希值,根据哈希值计算索引位置,计算方法为取余
hash % n = (n-1) & h
- 计算对象(key)的哈希值,根据哈希值计算索引位置,计算方法为取余
- 插入数据
- 若数组在该索引位置为空,则创建一个节点将该数据存入索引位置;
- 若数组在该索引位置不为空,则遍历该索引位置对应的链表,调用 equals() 方法判断是否存在;
- 若发现重复元素,则覆盖重复数据;
- 若没有重复元素,则在链表尾部插入数据;
- 注意,当链表长度达到8时,若数组长度不足64,则会先触发扩容机制,否则会将链表转化为红黑树
扩容机制
- 扩容触发条件
- 数组是否需要扩充是通过负载因子判断的,负载因子默认值为0.75,如果数组已用空间达到0.75时会触发自动扩容。
- JDK1.8 当链表长度达到8时,也会先触发扩容机制。
- 扩容方式
- 默认情况下,初始化的数组长度为16,每次以2的整数次扩容。
- 使用2的整数次扩容的目的是使用位运算代理与运算,提高哈希计算索引的效率,当n是2的整数次方时,
hash % n = (n-1) & h
HashMap 和 HashTable 区别
- 线程安全性
- HashMap 是线程不安全的。
- HashTable 是线程安全的,通过在 HashMap 方法的基础上添加 synchronized 关键字来保证线程安全。
- 空值问题
- HashMap 的 key 可以是 null,而 HashTable 的 key 不允许是 null。
- 扩容算法不同
- HashMap 的初始容量为16,扩容时 *2
- HashTable 的初始容量是11,扩容时 *2 + 1
java-javaSE-集合类的更多相关文章
- java基础 集合类
java集合类主要有以下集中: List结构的集合类: ArrayList类, LinkedList类, Vector类, Stack类 Map结构的集合类: HashMap类,Hashtable类 ...
- Java的集合类
转自:Q.Mr的博客 http://www.cnblogs.com/zrtqsk/p/3472258.html (本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教 ...
- 首先java中集合类主要有两大分支
本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理. Java中的集合类包含的内容很多而且很重 ...
- Java:集合类的区别详解
Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可 ...
- JDK8 下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
JDK8 下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装时最好在 ...
- java中集合类中Collection接口中的List接口的常用方法熟悉
1:集合类,在java语言中的java.util包提供了一些集合类,这些集合类又被称作容器. 2:区别集合类和数组.(1)数组的长度是固定的,集合的长度是可变的.(2)数组是用来存放基本数据类型的,集 ...
- Java Map 集合类简介
作者:Jack Shirazi 了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试 · Oracle ...
- Java常用集合类详解
在Java中有一套设计优良的接口和类组成了Java集合框架,使程序员操作成批的数据或对象元素极为方便.所有的Java集合都在java.util包中. 在编写程序的过程中,使用到集合类,要根据不同的需求 ...
- JAVA Map集合类简介
了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g jav ...
- java的集合类【转】
在JDK API中专门设计了一组类,这组类的功能就是实现各种各样方式的数据存储,这样一组专门用来存储其它对象的类,一般被称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Colle ...
随机推荐
- 【学习笔记】XR872 GUI Littlevgl 8.0 移植(文件系统)
不得不提 在移植的过程中,发现 LVGL 的文件操作接口并不十分完善,在我看来, LVGL 的文件操作接口,应该更多的是为了 LVGL 内部接口方便读取资源文件而设立的,例如读取图像文件,加载字库文件 ...
- 明解STM32—GPIO理论基础知识篇之基本结构
一.前言 万物皆有源头,大家学习单片机的源头操作就是通过GPIO口点灯,GPIO作为STM32最基础的外设,也是大家最先接触的外设.当然,看似基础的GPIO,不仅仅是简单的设置好IO口,让灯亮起就 ...
- 前端-jQuery 查找标签 事件 Bootstrap页面框架
1.查找标签 1.基本选择器: $('#d1'):id选择器 $('.c1'):class选择器 $('div'):标签选择器 2.组合选择器: $('div#d1'):查找id为d1的div标签 $ ...
- 0源码基础学习Spring源码系列(一)——Bean注入流程
作者:京东科技 韩国凯 通过本文,读者可以0源码基础的初步学习spring源码,并能够举一反三从此进入源码世界的大米! 由于是第一次阅读源码,文章之中难免存在一些问题,还望包涵指正! 一. @Auto ...
- 使用GetDIBits()获取Windows位图数据的标准用法,解决内存、堆栈报错问题
获取图标的位图数据 分两次使用GetDIBits(),以便于正确设置缓存的大小 正确设置BITMAPINFO的大小,否则就会报堆栈溢出错误 ICONINFO info = { 0 }; GetIcon ...
- P17_总结
能够知道如何创建小程序项目 微信开发者工具的使用.appID 的获取 能够清楚小程序项目的基本组成结构 app.js.app.json.app.wxss.pages 文件夹 能够知道小程序页面由几部分 ...
- Linux:grep 查找文件内容
在 Windows 中打开文件用查找功能可以查找我们想要的字符,前提是要打开文件.Linux 有一个指令不用打开文件就可以查询字符,而且支持正则表达式-- grep 指令.不仅如此,grep 还支持在 ...
- Oracle中的sql脚本语言中的循环语句介绍
--sql脚本语言的循环介绍:--1.goto循环点.declare x number;begin x:=0;--变量初始化: <<repeat_loop>>--设置循环 ...
- script和template里可选链运算符?.报错Syntax Error: Unexpected token (64:2)
前情:babel-core@6.2.3, vue@2.7.14 试过的方法:1.安装@babel/plugin-proposal-optional-chaining,设置.babelrc文件如下,报 ...
- Linux操作命令(九)1.comm命令 2.diff命令 3.patch命令
1.comm 命令 比较文本文件的内容 comm 命令将逐行比较已经排序的两个文件.显示结果包括 3 列:第 1 列为只在第一个文件中找到的行,第 2 列为只在第二个文件中找到的行,第 3 列为两个文 ...