java集合知识点
若不重写equals方法,则调用的是object对象的equals方法,相当于==比较,比较的是对象的内存地址
|------Collection接口:单列集合,用来存储一个一个对象
|------List接口:存储有序的,可重复的数据,动态“数组”
|------ArrayList:作为List接口下的主要实现类,线程不安全,效率高,使用Object[]存储数据
|------LinkedList:底层使用双向链表存储,对于频繁插入和删除操作,使用效率比ArrayList高,链表中的元素只影响前一个和后一个元素,当插入元素时,修改前一个元素和后一个元素指向新元素的指针,不需要全部数据进行移动
|------Vector:作为List接口古老的实现类,线程安全,效率低,使用Object[]存储数据
|------Set接口:存储无序的,不能重复的数据
|------HashSet:作为Set接口的主要实现类,线程不安全,可以存储null值
|------LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序去遍历
|------TreeSet:可以按照添加的对象,指定属性进行排序
jdk1.7 ArrayList中原理是,构造的时候直接初始化一个长度为10的数组,若后期数据增量超过10,则就进行1.5倍长度的扩容
jdk1.8 ArrayList中原理是,构造的时候不初始化数组,而是在调用集合方法add的时候,进行默认长度为10的数组创建,若增量超过10,则进行1.5倍长度扩容
vector中原理是,底层创建长度为10的数组,扩容方式是原数组的2倍
无序性:不等于随机性,并不按照添加的顺序添加数据,而是根据数据的hash值决定数据的添加的位置
不可重复性:使用equals进行元素判断,相同的元素不能添加进来
添加元素的过程:已HashSet为例:
我们向HashSet中添加元素a,首先调用a所在类的hashCode()方法,计算元素a的哈希值,此哈希值通过某种算法计算出在hashSet底层数组中的存放位置(即为:索引位置),判断此位置上是否有其他元素,如果此位置上没有元素,则a元素添加成功,如果此位置上有其他元素b(或已链表形式存在的多个元素),则比较元素a和元素b的哈希值,如果哈希值不相同,则元素a添加成功,如果哈希值相同,进而需要调用元素a的所在类的equals方法:若方法返回true,表明元素a与存在元素重复,添加失败,若返回false,说明跟现有元素存在差异,则添加成功。
对于添加成功的情况2和情况3而言,元素a与已经存在指定索引位置上数据以链表的方式存储数据
jdk7:元素a放到数据中,指向原来数组中的元素
jdk8:原来的元素在数组中,指向a, 7上8下
HashSet底层:数组+链表
要求:向Set中添加数据的类,必须重写hashCode()和equals()方法,以实现对象相等规则,相等的对象必须具有相等的散列值(哈希值)
LinkedHashSet:作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,用来记录前一个数据和后一个数据。不要理解成LinkedHashSet有序。
优点:对于频繁的遍历操作,使用LinkedHashSet的效率更高
TreeSet:向其中加入对象,必须是相同类型的
自然排序:TreeSet中的对象必须实现Comparable接口,实现CompareTo方法,若调用CompareTo方法返回的是0,则代表2个对象相等,不继续添加到set集合中,不使用equals了
定制排序:在初始化TreeSet集合对象的时候,传递一个Comparator接口的实现对象。定制一个比较规则,使用compare方法进行比较,不使用equals了
|------Map:双列数据,存储key-value数据,
|------HashMap:作为Map接口的主要实现类,线程不安全,效率高,可存储null的key和value
|------LinkedHashMap:保证在遍历map对象时,可以按照添加的顺序进行遍历,原理是在原有HashMap基础上,添加了一对指针,用来指向前一个和后一个对象。
|------TreeMap:保证按照添加的key-value对 进行排序,按照key进行排序(自然排序或定制排序),底层属于红黑树
|------HashTable:作为古老的Map接口实现类:线程安全,效率低,不能存储null的key和value
|------Properties:常用来处理配置文件。key和value都是String类型
HaskMap的底层:数组+链表(jdk7之前)
数组+链表+红黑树(jdk8)
Map结构的理解:
Map中的key:无序的、不可重复的,使用Set集合储存 ---》key所在的类要重写hashCode()和equals()(以HashMap为例)
Map中的value:无序的、可重复的,使用Collection存储所有的value ---》value所在类需要重写equals()
一个key-value对,组成一个Entry对象
Map中的Entry:无序的,不可重复的,使用set存储所有的Entry
HashMap的底层实现原理:以jdk7为例说明
HashMap hashMap = new HashMap();
在实例化以后,底层创建了一个长度是16的一维数组,类型是Entry[] table。
。。。可能已经执行过多次put。。。
map.put(key1,value1)
首先计算key1所在类的hashCode(),计算哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。
如果此位置上没有数据,此时key1-value1的数据添加成功 ---情况1
如果此位置上的数据不为空,意味着此位置上存在一个或多个数据(以链表形式存在),比较当前key1和已经存在的一个或多个数据的哈希值,
如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功。---情况2
如果key1的哈希值与已经存在的数据的哈希值相同,则调用key1所在类的equals方法,
如果equals返回false,key1-value1添加成功
如果equals返回true,使用value1去替换相同key1的value值
在不断添加的过程中,默认的扩容方式是原有数据量的2倍(超出临界值,并且该插入的位置不为空),并将原有数据提取过来
jdk8:相较于jdk7中底层的不同
1.底层没有创建一个长度为16的Entry数组
2.jdk8底层的数组,是Node[],而非Entry[]
3.首次调用put方法时,底层去创建长度为16的Node[]
4.jdk7中的底层结构:数组+链表,jdk8中的底层结构:数组+链表+红黑树。当数组中的某一个索引位置上的元素,以链表形式存在的数据个数大于8,且当前数组的长度超过64,此时此索引位置上的索引数据改为使用红黑树存储。
HashMap初始容量:16
加载因子:0.75
扩容临界值:初始容量*加载因子 = 12
java集合知识点的更多相关文章
- java集合知识点总结
下面是java中常见的集合: List--列表:内部元素有序,可以重复, ArrayList:线程不安全,效率高.数据结构是线性表,底层结构是顺序表,也就是数组,有唯一的下标来指定元素的位置,查询快, ...
- Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
(三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...
- Java集合总结【面试题+脑图】,将知识点一网打尽!
前言 声明,本文用的是jdk1.8 花了一个星期,把Java容器核心的知识过了一遍,感觉集合已经无所畏惧了!!(哈哈哈....),现在来总结一下吧~~ 回顾目录: Collection总览 List集 ...
- 知识点:Java 集合框架图
知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList Java集合框架图 我们经常使用的Arrayist.LinkedList继承的关系挺复 ...
- Java 集合常见知识点&面试题总结(上),2022 最新版!
你好,我是 Guide.秋招即将到来(提前批已经开始),我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你. 你也可以在网站(javaguide.cn)上在线阅读, ...
- Java集合原理分析和知识点大杂烩(多图初学者必备!!)
一.数据结构 数据结构就是计算机存储.组织数据的方式. 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. 时间复杂度是同一问题可用不同算法解决, ...
- java后端知识点梳理——java集合
集合概览 Java中的集合,从上层接口上看分为了两类,Map和Collection.Map是和Collection并列的集合上层接口,没有继承关系. Java中的常见集合可以概括如下. Map接口和C ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
随机推荐
- onkeyup的死循环问题
如果对一个控件调用的onkeyup事件,那么不能用回车来关闭alert()弹窗,因为按下回车的同时又再次触发了这个onkeyup事件,这样会造成一个死循环,不停按回车,不停的alert(), 所以应该 ...
- 【游戏体验】Sift Heads World Act 1(暗杀行动1)
>>>点此处可试玩无敌版<<< 注意,本游戏含有少量暴力元素,13岁以下的儿童切勿尝试本款游戏 非常良心的火柴人游戏,值得一玩 个人测评 游戏性 8/10 音乐 9 ...
- DFT 问答 II
1. Boundary Scan A:Boundary scan 顾名思义,是附加在芯片I/O 周边的扫描测试链,它通过专门的测试端口(TAP)访问.在测试模式下,边界扫描链会接管功能逻辑,对I/O进 ...
- NIO-BufferAPI
一 核心要素 capacity (容量):不能为负,不可更改:就是buffer的长度(buffer.length) limit (限制):指第一个不可被读入缓冲区元素的位置:不可为负,若positio ...
- MyBatis(8)——联表多对一的处理
xml说明: <!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性--> <resultMap id="唯一的标识" ...
- 线索二叉树的详细实现(C++)
线索二叉树概述 二叉树虽然是非线性结构,但二叉树的遍历却为二又树的结点集导出了一个线性序列.希望很快找到某一结点的前驱或后继,但不希望每次都要对二叉树遍历一遍,这就需要把每个结点的前驱和后继信息记录下 ...
- Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version)
This problem is different from the hard version. In this version Ujan makes exactly one exchange. Yo ...
- Docker - 周边 - Go Template
概述 docker inspect -f 引出 希望学会后, 可以处理这个命令 问题: 这是啥 疑问 最开始, 我以为是 jsonpath 后来看 命令行的解释, 说叫 go template 但是我 ...
- Linux - Shell - 在多个文件中查找关键字
1. 概述 在多个文件中 查找内容 2. 想干啥 目的 在 多个文件 中, 查找内容 准备 之前在 单个文件里 查找过内容 工具 awk 前提 文件有固定格式 查找时有字段的要求 例子 # print ...
- 每天进步一点点------altium designer 实用的快捷键
1.设计浏览器快捷键: 鼠标左击 选择鼠标位置的文档鼠标双击 编辑鼠标位置的文档鼠标右击 ...