本文主要对java中集合相关的知识点做一个汇总,后续会分析相关的常用子类
继承关系图
java集合继承关系如下所示:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
│
└Set
├HashSet
├TreeSet
└LinkedHashSet
Map
├Hashtable
├HashMap
├TreeMap
├LinkedHashMap
└WeakHashMap
复制代码
-
Collection没有直接的实现类,让其被继承产生了两个接口,如上图所示,就是Set和List。
- Set中不能包含重复的元素,同时数据的存储并不是有序的(存入和取出的顺序不一定相同)。
- List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
-
集合中的另一个接口就是Map。Map包含了key-value对,Map不能包含重复的key,但是可以包含相同的value。
-
集合中所有的类都实现了Iterator接口,用于遍历、操作集合中的数据,主要有如下几个方法:
- hasNext();是否还有下一个元素。
- next();返回下一个元素。
- remove();删除当前元素。
集合子类之间的区别
-
List :list数据有序,可重复。可以通过索引进行数据的增、删、改。
- Arraylist使用数组实现,相对应的查询快,修改慢。适用于经常查询的场景
- LinkedList使用双向链表实现,相对应的查询慢,修改快。适用于经常修改数据的场景
-
Set:Set数据存放无序,不可重复。
- HashSet通过hashCode()和equals()来保证数据的唯一性;
- TreeSet通过对元素实现Comparable接口或者TreeSet指定排序规则,让元素可排序,并通过这个比较元素是否是唯一的
-
Map:Map已键值对的形式存放数据,键不能重复,值可以重复。
- HashMap:根据key的hashCode值和equals方法来区分不同的key,同时因为这个遍历时取到的key是无序的。线程不同步,相对于HashTab效率高。能存放一个null值的key(hashcode),同时不限制null值的value数量
- HashTable:相对于HashMap,线程安全,同时效率也对于HashMap低。存储时键值都不能为null。
- TreeMap:遍历时默认按key的升序排列,这意味着key不能为null。线程不同步。
- LinkedHashMap:遍历时按key插入的顺序取出,有序,相对于HashMap效率略低。线程不同步,可存放一个key为null值,value不做限制。
总结
看到Array,就要想到角标,查询快。
看到Link,就要想到first,last,有序。
看到Hash,就要想到hashCode,equals,无序。
看到Tree,就要想到两个接口。Comparable,Comparator,可排序。