Collection体系
Collection
Collection是Java所有集合类的父类。 常见的有:List、Set、Map、Tree。
- 常用方法:
retailAll(Collection t); 取两个集合的交集。
contains(T t); 是否包含某个值。 - 对应的工具类:Collections
常用方法:
1. csort(Collection t); 对实现了Comparable接口的集合元素排序,默认是升序。
2. reverse(Collection t); 对集合逆序排列。如:915689 —> 986519
hashCode(Object o); 此方法是继承与Object类的可以重写,也可以通过工具类调用。
1.List
- 常见的有:ArrayList、HashList、LinkedList。
- 常用方法:
Collection的方法ArrayList也有。 - 对应的工具类: Lists
这个需要额外的导包:Guava。
ArrayList
- 常用方法:
new ArrayList(Collection t); 可以将Collection的子类直接转换为List集合。 - ArrayList的动态扩容:
ArrayList的底层其实是数组,如果当我们添加的元素超出原有的底层数组长度时,他会重新创建一个是原来数组长度1.5倍的数组。并通过Arrays.copyOf()方法复制原来数组的数据。
2.Set
- 特性:无序、元素唯一。
- 常见的有:HashSet、LinkedHashSet
- 常用方法:
Collection的方法HashSet也有。 - 对应的工具类: Sets
这个需要额外的导包:Guava。
HashSet
1. 元素唯一:
HashSet元素唯一并不是我们每插入一个元素就调用方法contains(Object o),这样效率太低下。他是通过Objects.hashCode()方法将元素们分类如下图。这样在hashCode值相同的列中去找可以有效的提高效率。
2. 常用方法:
new HashSet(Collection t); 可以将Collection的子类直接转换为Set集合,且去掉Collection集合中重复的元素只保留一个。
通过查看源码发现HashSet本质就是HashMap的‘key’,他们的Iterator(迭代器)是同一个。
如图:
因此这里需要额外的注意,如果通过的Map.keySet();获取的set集合,如果改变Map的key也会跟着改变。 Map.values()方法返回Map的值集合,以Collection 的形式返回,他的Iterator也是和Map Value的Iterator相同,如果添加或删除也是会直接影响Map的值
如图:
3. Iterator扩展:
当一个集合(Map、Collection)创建成功并赋值,Iterator(迭代器)就和值绑定了。因此我们需要改变集合中的某个数据底层都是通过Iterator改变的。虽然List集合可以通过“for循环”遍历,但是绝对不能通过“for循环遍历”改变、删除集合中的某个值。ConcurrentModificationException(并发修改异常)。
LinkedHashSet
1. 特性:
* 他是有序的。是按插入时的顺序排序。
* 元素唯一。
2. 常用方法:
new LinkedHashSet(Collection t); 可以将Collection的子类直接转换为linkedHashSet集合,且去掉Collection集合中的重复的元素只保留一个。
TreeSet
1. 特性:有序,默认是升序排序。
2. 常用方法:
new TreeSet(Collection t); 可以将Collection的子类直接转换为TreeSet集合,且默认的就会排序。 要求元素实现Comparable接口才能实现排序。
3. TreeSet 本质上也是TreeMap。
3.Map
1. 特性:使用的键值对的方式存储数据。 key不能重复value可以。
2. 常见的有:Properties、HashMap…。
常用方法:
* keySet(); 返回Map集合的key以Set集合的形式返回map的key。
* values(); 返回Map集合的值以Collection的形式返回map的value。
如果修改keySet()、values()方法的返回值会直接影响HasdMap集合的数据。因为他们的Iterator和Map的Iterator是同一个。
源码分析: