一起自学java_一起学JAVA——集合

之前的文章我们介绍过数组的用法,今天的集合可以说是“增强版数组”。集合的功能要比数组强大的多,可以应对更复杂的场景,所以集合在程序开发中应用非常广泛。

集合与数组的区别

集合的容量不确定,可以根据需要动态扩充;数组的长度是固定的

集合只能存放引用类型的数据,数组既可以存放基本类型也可以存放引用类型的数据

集合里面的数据可以是不同类型,数组里面的数据必须是相同的类型

集合架构体系

54b87d7f99f8335f8e8e112eefd322ba.png

集合的三种类型

List:集合中对象按照索引位置进行排序,可以有重复对象,允许按照对象在索引中的位置检索对象Set:集合中对象没有顺序,并且不能有重复对象Map:集合中的每一个元素都包含一个键对象和值对象,集合中的键对象不能重复,但值对象可以重复

3c693b9fee9ed755430c602a91573ecf.png

集合类的顶级接口

1、Collection:定义了集合的基本功能(方法)

a012a71c3e576aef36470aba6762b7ea.png

Collection下的子接口

List集合

特点:有序(存储和取出的元素顺序一致),可重复

List实现类:

ArrayList:1. 底层数据结构是数组,查询快、增删慢

2. 线程不安全,效率高

Vector:1. 底层数据结构是数组,查询快,增删慢

2. 线程安全,效率底

LinkedList:1. 底层数据结构是链表,查询慢,增删快

2. 和ArrayList一样线程不安全,效率高

Set集合

特点:无序(存储和取出顺序不一致,有可能会一致),但是元素唯一,不能重复

Set实现类

HashSet1. 底层数据是哈希表

2. 通过两个方法hashCode()和equals()保证元素的唯一性,方法自动生成

3. 子类LinkedHashSet底层数据结构是链表和哈希表,由链表保证元素有序,

由哈希表保证元素唯一。

TreeSet1. 底层数据是红黑二叉树

2. 排序方式:自然排序、比较器排序

3. 通过比较返回值是否为0来保证元素的唯一性。

73ceb2b9afc200c68eef23334d8c5250.png

迭代器(Iterator)

Iterator接口提供了遍历各种类型的集合的统一接口。

Iterator声明了下面几个方法:

hasNext(),判断集合中的元素是否遍历完毕,如果没有,就返回true,否则返回falsenext(),返回下一个元素remove,从集合中删除上一个next()返回的元素

eb381eaf150ece81e74dc13ea2282aa0.png

2、Map接口

Map特点:

将键映射到值的对象

一个映射不能包含重复的键

每个键最多只能映射到一个值

Map接口和Collection接口的不同

Map是双列的,Collection是单列的

Map的键唯一,Collection的子体系Set是唯一的

Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

简单说就是:集合里的每一个元素都由key和value组成;Key不能重复,value可以重复。

d61c3905b6ed09a9aa8c8111c68727df.png

Map接口的实现类

HashMap

结构:数组+链表+红黑树

原理:HashMap是基于hashing的原理,通过put(k,v)存储对象到HashMap中,通过get(k)方式获取对象。当使用put(k,v)传递key、value的时候,首先调用hashCode()方法,计算,bucket位置来存储Node对象。

put(k,v)过程:

对key求Hash值,计算下标。如果没有碰撞存入桶中,碰撞则放入bucket的链表或者红黑树中。如果链表超过阈值(默认链表数超过8,总Entry数超过64)则转换为红黑树,链表长度<6则转换回链表。key结点存在则替换旧值。如果桶满(容量*加载因子),就要resize(扩容2倍后重排)。get(k)过程:

首先将 key hash 之后取得所定位的桶。如果桶为空则直接返回 null 。否则判断桶的第一个位置(有可能是链表、红黑树)的 key 是否为查询的 key,是就直接返回 value。如果第一个不匹配,则判断它的下一个是红黑树还是链表。红黑树就按照树的查找方式返回值。不然就按照链表的方式遍历匹配返回值。LinkedHashMap

原理:LinkedHashMap的实现就是HashMap+LinkedList的实现方式,以HashMap维护数据结构,以LinkList的方式维护数据插入顺序。LinkedHashMap通过维护一个运行所有条目的双向链表,LinkedHashMap保证了元素的迭代顺序。迭代顺序可以是插入顺序或者是访问顺序。

TreeMap

是一个有序的key-value集合,它是通过红黑树实现的。继承于AbstractMap,所以它是一个Map,即一个key-value集合。实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。实现了Cloneable接口,意味着它能被克隆。实现了java.io.Serializable接口,意味着它支持序列化。基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。Map集合的遍历方法:

4f7917a65b0bcac3d723f95bff6a1500.png第一种遍历方法

17cc155896a40b12b2fa2781e0ee1d1e.png

好了,关于java集合的知识先介绍这么多,更多内容欢迎继续关注。

精品推荐:

一起学JAVA——异常处理

一起学JAVA——面对对象(其他)

一起学JAVA——数组和函数

编辑技术笔记——JavaScript开发桌面应用(续)

e494395216c5aeaf924bc18b597a767b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值