Java基础学习

Java集合学习

标签(空格分隔): Java

学习资料 LRH1993


java中集合主要分为四种:
List,Set,Queue,Map

Set

Set是无序的,不可重复的集合。实现Collection接口。一定意义上来说,Set就是Collection,只是行为上不同(不允许重复元素存在)。

List

List是有序的,可重复的集合。也是Collection的子接口,由于有序,即存在下标索引,所以存在一些根据索引进行操作的方法。

Queue

Queue是一种队列数据结构,即先进先出。队列不允许随机访问队列中的元素,即Queue对数据处理的方法都是获取队列的头部。

Map

Map用于保存具有映射关系的数据,所以存有两组数据:key、value。Map的Key不可重复,Key与Value存在单向的一对一关系,即通过唯一Key,必然会获取唯一的Value。

Map与Set的关系

Map中的Key值放在一起,很像Set集合:无序,不可重复。并且Map确实有一个keySet()方法返回Map中所有Key组成的Set集合。

Map与List的关系

Map中所有的Value值放在一起,又很像List集合:可重复,通过索引获取。只是Map中不是以整数值索引,而是使用另外的一个对象来作为索引。

以上四种集合,也是接口形式,下面介绍一下四种集合常用的实现类

ArrayList

ArrayList是以数组形式实现的List,优点以数组实现,节约空间。并且通过下标访问元素的性能很高。缺点数组存在容量限制,每达到最大限容,会自动扩容50%

LinkedList

LinkedList是链式结构,没有熔炼限制,但是双链表本身就需要更多的容量。插入或删除时,只需要修改上下指针就可以,但是通过索引访问元素时,需要遍历所有的数据。虽然做了优化(判断索引是在前半区间还是后半区间,决定从头还是尾搜索)。

HashMap

1. 什么时候会使用HashMap?他有什么特点?
是基于Map接口的实现,存储键值对时,它可以接收null的键值,是非同步的,HashMap存储着Entry(hash, key, value, next)对象。

2. 你知道HashMap的工作原理吗?
通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

3. 你知道get和put的原理吗?equals()和hashCode()的都有什么作用?
通过对key的hashCode()进行hashing,并计算下标( n-1 & hash),从而获得buckets的位置。如果产生碰撞,则利用key.equals()方法去链表或树中去查找对应的节点

4. 你知道hash的实现吗?为什么要这样实现?
在Java 1.8的实现中,是通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h >>> 16),主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销。

5. 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
如果超过了负载因子(默认0.75),则会重新resize一个原来长度两倍的HashMap,并且重新调用hash方法。

LinkedHashMap

即链式结构的HashMap,主要功能是保存了存入顺序。继承HashMap之后,所做的一些额外操作,也都是对顺序逻辑的调整。

TreeMap

TreeMap可以保持Key的大小顺序。它是使用红黑树的数据结构。

红黑树性质

性质1. 节点是红色或黑色

性质2. 根是黑色

性质3. 所有叶子都是黑色(叶子是NIL节点)

性质4. 如果一个节点是红的,则它的两个儿子都是黑的

性质5. 从任一节点到其叶子的所有简单路径都包含相同数目的黑色节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值