之前的文章我们介绍过数组的用法,今天的集合可以说是“增强版数组”。集合的功能要比数组强大的多,可以应对更复杂的场景,所以集合在程序开发中应用非常广泛。
集合与数组的区别
集合的容量不确定,可以根据需要动态扩充;数组的长度是固定的
集合只能存放引用类型的数据,数组既可以存放基本类型也可以存放引用类型的数据
集合里面的数据可以是不同类型,数组里面的数据必须是相同的类型
集合架构体系
集合的三种类型
List:集合中对象按照索引位置进行排序,可以有重复对象,允许按照对象在索引中的位置检索对象Set:集合中对象没有顺序,并且不能有重复对象Map:集合中的每一个元素都包含一个键对象和值对象,集合中的键对象不能重复,但值对象可以重复
集合类的顶级接口
1、Collection:定义了集合的基本功能(方法)
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来保证元素的唯一性。
迭代器(Iterator)
Iterator接口提供了遍历各种类型的集合的统一接口。
Iterator声明了下面几个方法:
hasNext(),判断集合中的元素是否遍历完毕,如果没有,就返回true,否则返回falsenext(),返回下一个元素remove,从集合中删除上一个next()返回的元素
2、Map接口
Map特点:
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
简单说就是:集合里的每一个元素都由key和value组成;Key不能重复,value可以重复。
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集合的遍历方法:
第一种遍历方法
好了,关于java集合的知识先介绍这么多,更多内容欢迎继续关注。
精品推荐:
一起学JAVA——异常处理
一起学JAVA——面对对象(其他)
一起学JAVA——数组和函数
编辑技术笔记——JavaScript开发桌面应用(续)