(一)Iterable接口
1.实现Iterable接口的类可以拥有增强for循环。
2.实现Iterable接口的集合类必须提供一个叫iterator()的方法,该返回值为Iterator。
3.Iterable :存在于 java.lang 包中,Iterator :存在于 java.util 包中。实现了Iterable接口的类,就可以使用Iterator迭代器。
Iterator方法:
1.boolean hasNext():判断容器内是否存在下一项
2.Object next():获取下一项,返回值是 Object,需要强制转换成自己需要的类型
3.void remove():该方法可以删除由next()最新返回的项,此后不能调用 remove(),直到对next()再一次调用以后
(二)Collection接口
1.Collection接口继承Iterable接口,Collection接口java.util包
2.Collection是集合类的上级接口,继承与他的接口主要有Set 和List。
Collections是Collection的帮助类,Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。例如:Collections.sort()方法排序 Collections.shuffle() 打乱集合。(应用场景:手机通讯录)
3.Collection接口的方法列表:
size():返回集合中的项数
isEmpty():判断是否为空
contains(Object):检测是否存在某个元素
clear():清除
add(E):添加元素
remove(Object):删除元素
Iterator():迭代器 遍历集合
Collection接口的remove()方法和Iterator接口的remove()方法区别?
1.首先肉眼可见的不同就是参数:Collection接口的remove()方法带参数,Iterator接口的remove()方法不带参数
2.然后在性能方面:Collection的remove方法必须首先找出要被删除的项,采用的是单链表结构查询,单链表查询效率比较低,需要从集合中一个一个遍历才能找到该对象;而 Iterator的remove方法结合next()方法使用,有下一项就删除,没有就不删,比如集合中每隔一项删除一项,所以Iterator的remove()效率更高。
- 3.最后在容错方面看:前提,在使用Iterator遍历时,使用Collection的remove()会报异常,用Collection的remove()的时候会调用到父类Iterable的Iterator,就有两个集合遍历,遍历移除的时候是移除Iterable里面的,没有移除Collection里面的所以会出现ConcurrentModificationException,因为集合中对象的个数会改变而Iterator 内部对象的个数不会,不一致则会出现该异常;但是在使用Iterator遍历时,不会报错,因为iterator内部的对象个数和原来集合中对象的个数会保持一致。
(三)List、Set、Queue接口
List、Set、Queue接口继承Collection接口
List接口
1.有重复有顺序有下标(三有)
2.ArrayList:(数组结构)get和set调用,查询的速度快;但是添加删除的速度慢。
LinkedList:(链表结构)get和set的调用花费昂贵,不适合做查询;添加和删除的速度快。
(1)Array与ArrayList有什么区别?
其实问的就是数组与集合的区别?看懂这个就好办事儿了,Array是Java中的数组,ArrayList是集合,也就是动态数组,数组的复杂版本,可以动态的添加和删除元素。首先要搞懂数组的声明有三种方式,定义一个数组的时候,必须指定这个数组的数据类型及数组的大小,也就是说数组中存放的元素个数固定并且类型一样。而这个ArrayList的声明,在不使用泛型的情况下,这个list是可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数据了
不同点:
1.ArrayList是Array的复杂版本
2.存储的数据类型:Array只能存储相同数据类型的数据,而ArrayList可以存储不同数据类型的数据
3.长度的可变:Array的长度是固定的,而ArrayList的长度是可变的
(2)数组与list之间的相互转换
1.数组转list,可以使用Arrays.asList(数组)
2.List转数组,使用list.toArray()
Set接口
1.无重复无顺序无下标(三无)
2.HashSet:速度最快,没顺序保存元素,集合元素可以保存null,但只可以存一个null,存储对象
TreeSet:升序保存对象
LinkedHashSet:按照被添加的顺序保存对象
(1)HashSet、TreeSet、LinkedHashSet区别?
1.需要速度快的集合,使用HashSet
2.需要集合有排序功能,使用TreeSet
3.需要按照插入的顺序存储集合,使用LinkedHashSet
Queue接口
它的特点就是先进先出,也就是队列的特点,这里就会联想到堆栈的特点跟队列的特点是相反的,堆栈的特点是先进后出
(四)Map接口
1.HashMap:提供了最快的访问技术,没有按照明显的顺序保存元素,键值对
TreeMap:升序保存键
LinkedHashMap:按插入保存键,同时保留HashMap的查询速度
HashMap的实现原理
通过put和get存储和获取对象
1)存储对象时,将键值对传给put方法,调用hashcode计算hash 得到bucket(容器,比喻成桶)位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量。16*0.75=12(16指的是集合默认初始值,0.75扩容因子,12表示一个条件,就是说在往集合里面加数据的时候,当加到16的0.75倍 也就是12,就开始扩容,扩16,集合长度就是32,然后继续往集合里面加数据加到32*0.75的时候也就是24,继续扩容32,这时候集合总长度是64……)
new XXX(默认初始值,扩容因子)这个默认值和扩容因子是可以自定义的,不过是有条件的,扩容因子在修改的时候注意写2的几次幂。
2)获取对象时,我们将K传递给get,他调用hashcode计算hash从而得到bucket位置,并进一步调用equals()方法确认键值对。
(1)HashMap和HashSet区别
HashMap:实现了Map接口 存储键值对 调用put()向map中添加元素 使用key计算hashcode
HashSet:实现了Set接口 存储对象 调用add()向set中添加元素 使用成员对象计算hashcode
HashMap相对于HashSet较快,因为它是使用唯一的键获取对象
HashSet较HashMap来说比较慢
List、Set、Map之间的区别
1.List:可重复;多个null值;有顺序,插入的顺序和输出的顺序一样
2.Set:不重复;只可以一个null值;无序
3.Map:键值对,键唯一,值可重复;键一个null值,值可以多个null值;无序