集合总览
集合,故名思义,一组相同类型的数据集。它们的类型是相同的,它们的每个元素可以是不同的实现类,但是一定继承了公共的父类和接口。其实数组也可以叫做数据的集合,但是和数组不同的是,数组的长度是固定的,而集合的长度是可以动态改变的。而数组的本身的结构比较单一,不能很好的适应各种场合。而集合其实就是对数组的一种包装,基于数组,封装了各种各样的集合,每种集合有各自的特性,根据这些特性,大大的丰富了它的功能。例如,判断集合是否为空,某个元素是否存在,当前集中的元素的个数,提供栈,队列这样的数据结构等等。
首先,可以从结构上把集合分为两大类,Collection和Map。Collection的每个元素是一个单一的对象,而Map的每个元素是一个键值对(key-value)。然后Collection又可以划分为List和Set。List的元素是可以重复的,而Set的每个元素是唯一的。而Map的话,key必须唯一,value可以不唯一。
List可以又可以分成两大类:ArrayList和LinkedList,它俩的区别在于底层的数据结构不同。ArrayList是数组结构,而LinkedList是链表结构。数组结构的地址是连续的,能快速的进行随机读取,缺点是在进行插入和删除的时候,可能需要进行元素的移动。而链表结构的优点是在插入和删除的时候,不需要进行插入和删除,但是不能进行随机访问。ArrayList元素的顺序是根据插入的顺序来的。而LinkedList还是双向链表,可以支持从头存取,从尾存取,所以它还可以用作栈或队列。
Set可以分成两大类:HashSet和TreeSet。它俩的区别在于是否有序。HashSet是无序的,而TreeSet是有序的,它的顺序是基于比较器来的,所以TreeSet的元素必须要么本身就实现类Comparable接口,要么在构造TreeSet集合的时候,传入一个该元素类型的Comparator比较器。这里补充一下Comparable和Comparator两个接口的区别:它俩都是用来实现两个不同元素之间进行大小比较。区别在于Comparable需要和元素对应的类型进行绑定,也就是该类必须实现Comparable接口,然后重写compareTo(Object o)方法。而Comparator是不需要和类型进行吧绑定的,它的比较方法是compare(Object o1,Object o2);compareTo是通过this进行调用的,所以必须要绑定类型,所以相比Comparable,Comparator更加灵活,但很多jdk中的元素,本身就已经实现了Comparable接口。
Map可以分成两大类:HashMap和TreeMap,它俩的区别也主要在于是否有序。HashMap无序,而TreeMap有序。其实TreeSet就是基于TreeMap去实现的。
除了上面用到的这些常见的类之外,还有一些集合:
Vector:和ArrayList差不多,区别在于Vector是线程安全的。它是通过在方法上添加synchronized修饰符实现的线程安全。
HashTable:和HashMap类似,也是线程安全的,也是通过添加synchronized关键字实现的线程安全。
ConcurrentHashMap:线程安全的Map集合,相比HashTable,它在并发情况下,性能更好。
CopyOnWriteArray,DelayQueue等等,这些后续再说。
附上常用的六种集合的UML图:
ArrayList

LinkedList

HashSet:

TreeSet:

HashMap:

TreeMap:

浙公网安备 33010602011771号