集合:
- 集合里面存储对象的引用,集合本身是一个容器,也是一个对象,常见的集合: 数组(ArrayList)、双链表(LinkedList)、二叉树(TreeMap)、哈希表(HashMap)。
- 集合分两大类:第一:以单个方式存储元素:超级父接口是Collection(有迭代器),第二:以键对的形式存储元素:超级父类接口是Map。
Collection:
Map:
(上面两图转载动力节点Java零基础)
Collection:有iterator()方法返回Iterator对象迭代遍历集合(List和Set)。
当集合的结构发生改变,集合的迭代器对象必须重新获取。如果使用迭代器对象的 remove方法,则不需要重新获取。
注意:contains()和remove()底层调用了equals()方法。
List:存储的元素是有序可重复的,存入时和取出的顺序一样,有下标(index),元素可 以重复。
1、ArrayList:
实现的接口Serializable(序列化)、Cloneable(克隆)、底层是一个数组的存储结构,无参构造方法时给一个空的数组,初始容量是在添加第一个元素时扩大容量至10,当容量超出时,扩容为原来的1.5倍。线程不安全,可以通过调用工具类Collections.synchronizedList(List list)来保证线程安全。
2、LinkedList:底层是一个双链表,默认初始节点的frist和last为null。
3、Vector:底层也是一个数组,无参构造函数调用自身有参构造方法,传入一个容量为10的参数。Vector有synchronized关键字修饰,线程安全,但是因为解决线程安全问题,导致效率低。
Set:存储的元素是无需不可重复的,元素存入和取出的顺序不一样,元素不能重复
1、HashSet:无参构造方法创建了一个HashMap对象。
2、SorteSet:自动按照元素的大小排序。
Map:以键值对的方式存储元素,无序不重复的,存入没有顺序,key部分是无序不可重复。
1、HashMap:在JDK1.7之前是数组+单链表,JDK1.8之后引入了红黑树,在链表的长度达到8时,链表转化为红黑树,当红黑树的长度为6时,转换回链表,不设置在8可能是怕频繁转换会影响性能。HashMap初始容量为16,因子为0.75,扩容会扩容为原来的2倍,key和value可以存储null。
2、Hashtable:初始容量为11,因子为0.75,扩容会扩容为原来的2倍+1,线程是安全的,但是效率低,不能存储null。
Propreties:key和value部分只支持String类型,线程是安全的,常用方法 setProprety(String key,String value)、getProprety(String key)
3、 TreeMap:底层是一个二叉树,采用中序遍历,有Comparable和Comparator两种比较接口,前者适合固定一个比较公式,后者适合灵活的多种比较方式。
集合的遍历:
List:
- 使用集合的迭代器Iterator对象,调用方法hasnext()、next()遍历。
- For(:){},进行遍历。
- 使用for循环、List中的get(index)遍历。ArrayList使用此方式遍历性能高
Set:
- 使用集合的迭代器Iterator对象,调用方法hasnext()、next()遍历。
- For(:){},进行遍历。
Map:
- 使用map中的entrySet()转换为Set<Map.Entry>,然后for遍历。
2.将Map中的key部分转换为Set,通过遍历Set中key,然后传入到Map.get()