分类标准:
1)线程是否安全(单线程还是多线程中使用)?
2)单列还是双列集合?
3)底层结构是链表、数组还是哈希表?
4))是否是有序集合?
继承关系:
Collection<--List<--Vector、ArrayList、LinkedList
Collection<--Set<--HashSet<--LinkedHashSet
Vector : 基于Array的List,实际上就是封装了Array所不具备的一些功能方便我们使用,它不可能不受Array的限制。性能也就不可能超越Array。所以,在可能的情况下,我们要多运用Array(线程安全的集合,与ArrayList相比)。
ArrayList:线程不安全的集合,所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题(需要自己处理)。
LinkedList:它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
List总结(单列集合):
1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有[ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基于Array的List(Vector,ArrayList)适合查询,通过索引进行遍历,而LinkedList(链表)适合添加,删除操作。
HashSet:虽然Set同List都实现了Collection接口,但是实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的(底层数据结构不一样),这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项(不能有重复项)。
在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
Set总结:
1. Set实现的基础是Map(HashMap);
2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象
Map集合
HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。 线程安全的集合
HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。(允许空键存在),线程不安全的集合。
几个面试常见问题:
1.ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?
A:Vector和HashTable是线程同步的(synchronized)。性能上,ArrayList和HashMap分别比Vector和Hashtable要好。
2.大致讲解java集合的体系结构
、Set、Map是这个集合体系中最主要的三个接口。
其中List和Set继承自Collection接口。
Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。
基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
3.Collection 和 Collections的区别
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
List、Map、Set三个接口,存取元素时,各有什么特点
List 以特定次序来持有元素,可有重复元素;
Set 无法拥有重复元素,内部排序(无序);
Map 保存key-value值,value可多值。