java集合 详解
首先分享一张来自古月人伟IT之家的思维导图认识一下集合的框架构成,方便理解和记忆。
一 Iterable
- 在介绍java Collection之前 先介绍一下 Clloection的父接口Iterable。
Iterable与集合不同的是,Iterable在java.lang目录下,而Iterator,Collection及其子接口,子类都位于Java.util目录下。
Iterator
- 1:next(): 最初迭代器在所有元素的左边,调用next()之后,迭代器移到第一个和第二个元素之间,next()方法返回迭代器刚刚经过的元素。
- 2:hasNext(): hasNext()若返回True,则表明接下来还有元素,迭代器不在尾部。
- 3: remove(): remove()方法必须和next方法一起使用,功能是去除刚刚next方法返回的元素。
- 4: 遍历方式:for-each循环可以与任何实现了Iterable接口的对象一起工作,而Collection接口扩展了Iterable接口,故标准类库中的任何集合都可以使用for-each循环
二 Collection接口
Collection
Collection接口 是集合的顶级接口.Collection接口继承Iterable接口,Collection接口在java.util目录下,
Collection接口的方法列表 | 结果 |
size() | 返回集合中的项数 |
isEmpty() | 判断是否为空 |
contains(Object) | 检测是否存在某个元素 |
clear() | 清除 |
add(E) | 添加元素 |
remove(Object) | 删除元素 |
Iterator() | 迭代器 遍历集合 |
Collection接口的remove()方法和Iterator接口的remove()方法区别?
- 首先最直观的不同就是参数:Collection接口的remove()方法带参数,Iterator接口的remove()方法不带参数
- 然后在性能方面:Collection的remove方法必须首先找出要被删除的项,采用的是单链表结构查询,单链表查询效率比较低,需要从集合中一个一个遍历才能找到该对象;而 Iterator的remove方法结合next()方法使用,有下一项就删除,没有就不删,比如集合中每隔一项删除一项,所以Iterator的remove()效率更高。
- 最后在容错方面看:前提,在使用Iterator遍历时,使用Collection的remove()会报异常,用Collection的remove()的时候会调用到父类Iterable的Iterator,就有两个集合遍历,遍历移除的时候是移除Iterable里面的,没有移除Collection里面的所以会出现ConcurrentModificationException,因为集合中对象的个数会改变而Iterator 内部对象的个数不会,不一致则会出现该异常;但是在使用Iterator遍历时,不会报错,因为iterator内部的对象个数和原来集合中对象的个数会保持一致。
List、Set、Queue接口
- List、Set、Queue接口都继承于Collection,而各有各自的特色;
- List
list有两个实现类 ArrayList,LinkedList
ArrayList | 数组结构 | get和set调用,查询的速度快;但是添加删除的速度慢。 |
LinkedList | 链表结构 | get和set的调用花费昂贵,不适合做查询;添加和删除的速度快。 |
- Set
Set有三个实现类 HashSet,TreeSet,LinkedHashSet
HashSet | 效率最高 | 速度最快,没顺序保存元素,集合元素可以保存null,但只可以存一个null,存储对象 |
TreeSet | 有序 | 升序保存对象 |
LinkedHashSet | 有顺序 | 按照被添加的顺序保存对象 |
- Queue
Queue队列,先进先出
- Array与ArrayList有什么区别?
其实问的就是数组与集合的区别?看懂这个就好办事儿了,Array是Java中的数组,ArrayList是集合,也就是动态数组,数组的复杂版本,可以动态的添加和删除元素。首先要搞懂数组的声明有三种方式,定义一个数组的时候,必须指定这个数组的数据类型及数组的大小,也就是说数组中存放的元素个数固定并且类型一样。而这个ArrayList的声明,在不使用泛型的情况下,这个list是可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数据了
不同点:
ArrayList是Array的复杂版本 |
存储的数据类型:Array只能存储相同数据类型的数据,而ArrayList可以存储不同数据类型的数据 |
长度的可变:Array的长度是固定的,而ArrayList的长度是可变的 |
- 数组与list之间的相互转换
(1).数组转list,可以使用Arrays.asList(数组)
(2).List转数组,使用list.toArray()
Map
Map接口 不继承于Collection接口,Map接口下有三个实现类
HashMap | 效率最高 | 提供了最快的访问技术,没有按照明显的顺序保存元素,键值对 |
TreeMap | 升序保存键 | |
LinkedHashMap | 有顺序 | 按插入保存键,同时保留HashMap的查询速度 |
- HashMap的实现原理
1.存储对象时:将键值对传给put方法,调用hashcode计算hash 得到bucket(容器,比喻成桶)位置,进一步存储。
2 .获取对象时:我们将K传递给get,他调用hashcode计算hash从而得到bucket位置,并进一步调用equals()方法确认键值对 - HashMap和HashSet区别
HashMap相对于HashSet较快,因为它是使用唯一的键获取对象
HashMap | 实现了Map接口 存储键值对 调用put()向map中添加元素 使用key计算hashcode |
HashSet | 实现了Set接口 存储对象 调用add()向set中添加元素 使用成员对象计算hashcode |
- List、Set、Map之间的区别
List | 可重复;多个null值;有顺序,插入的顺序和输出的顺序一样 |
Set | 不重复;只可以一个null值;无序 |
Map | 键值对,键唯一,值可重复;键一个null值,值可以多个null值;无序 |
*未完待续*