集合类
集合类是一种有用的工具类,可以存储数量不等的多个对象,并且可以动态分配大小。Java中的集合类可以分成三大类,分别是Set,List和Map。对应数学上的三个相关概念。
set就是数学意义上的集合,元素不可重复出现,元素之间没有顺序。List是有序的集合,因为有顺序,元素可以重复。Map存储key-value对,关键在于映射关系。
在Java中,Set,List和Map都是接口,他们还有一个共同的父接口,Collection。如果我们不使用泛型,所有Collection中的对象都会被当成是Object对象。
遍历:可以使用Iterator来遍历Collection中的元素,1.5之后,还可以使用foreach语句类实现遍历。在遍历的过程中,不要对Collection进行删除操作,会报异常的。
Set:
Set的主要实现类是HashSet和TreeSet。HashSet值得关注的点是hashCode和equal方法,在重写这两个方法时,保证equal和hashCode拥有一致的行为。
HashSet还有一个叫做LinkedHashSet的子类,LinkedHashSet遍历速度会比HashSet快一些。
TreeSet中的元素是有序的,可以通过Comparator接口实现自己想要的排序方式。
List:
List就是我们经常说的线性表。线性表有两种不同的实现方式,一种通过数组来实现,一种通过链的方式来实现。List是有序的,这里的有序和TreeSet的有序是不一样的,这里的有序其实说的是索引。
ArrayList和Vector是通过数组实现的List,其内部维护的都是一个Object类型的数组,Vector是一个非常古老的类,是线程安全的,ArrayList不是线程安全的。一般推荐使用ArrayList。
Queue是一种数据结构,LinkedList实现了List,也实现了Dqueue接口,Dqueue是一个双端队列,所以LinkedList是线性表,同时也可以作为队列来使用,还可以作为栈来使用。
遍历:在遍历线性表的时候根据实现的不同,选择不同的遍历方法,基于数组的实现,采用随机访问的get方法比较好,就像数组的下标,基于链的实现,采用ListIterator遍历比较好。
Collections工具类提供了很多有用方法对List集合元素进行操作,排序之类的。还可以将指定集合包装成线程安全的。
基于数组的实现删除、增加元素的效率肯定不会高,基于链的实现效率会比较高。
Map:
Map:主要的实现类有HashMap和HashTable,类似于ArrayList和Vector之间的关系。TreeMap会根据key值排序,类似于TreeSet。