集合
Java的集合大致可以分成Set List 和 Map三种体系结构。其中Set代表无序不可重复的集合;List代表有序、重复的集合;而Map代表具有映射关系的集合。
Java的集合类主要由两个接口派生而来:Collection 和 Map,这两个接口是根接口。Set 和 List两个接口派生于Collection接口。根据Set List 和 Map三种类型的特点,可以得出这样的结论:
如果访问List集合中的元素,可以直接使用元素的索引;如果访问Map集合需要根据key来访问,访问Set集合则只能根据元素本身。使用比较多的是: HashSet TreeSet ArrayList ArrayDeque LinkedList HashMap TreeMap
Set
Set集合不允许包含相同的元素,如果把两个相同的元素添加到Set集合中,则会添加失败。Set判断两个对象相同不是使用==运算符,而是根据equals方法,也就是说两个对象用equlas方法判断返回false,则可以添加成功。Set的子类包含:HashSet 、 TreeSet 、 EnumSet
HashSet
HashSet具有以下几个特点:
不能保证元素的排列顺序,遍历的元素可能与添加的元素顺序可能不一样。
HashSet不是同步的,如果两个以上的线程来修改HashSet则需要手动的保证代码的同步。
集合元素可以为null
HashSet中存入一个元素的时候,系统会根据该元素的hashCode()返回的数字决定存储的位置。如果两个元素根据equals方法返回true,但是hashCode不一样,则HashSet同样会将两个对象添加成功。
因此HashSet判断两个对象是否相等,需要equals返回true,同时hashCode返回的数值也一样。应该在重写equlas方法的时候,应该也需要重写hashCode方法。
LinkedHashSet
LinkedHashSet 是HashSet的子类,它也是根据hashCode值来决定元素的存储位置,但是它不同的是需要使用链表来维护元素的次序。这样使得元素看起来是以插入的顺序保存的。
TreeSet
TreeSet是SortedSet接口的实现类,因此它可以确保TreeSet中的元素都是有序的。
TreeSet集合采用hash算法来决定元素的存储位置,同时TreeSet采用红黑树的数据结构来存储集合元素。TreeSet采用了两种排序方法:自然排序和定制排序。
自然排序是根据添加到TreeSet中的对象的compareTo(Object obj)来判断。因此在加入到TreeSet中的所有对象都要实现Comparable接口。
class Test implements Comparable {
...
public int comparaTo(Object obj) {
...
}
...
}
这个Test对象就可以添加到TreeSet集合中。
定制排序:
定制排序是创建TreeSet对象的时候指定比较方法,
TreeSet ts = new TreeSet(new Comparator() {
public int compare(Object o1, Object o2) {
...
}
});
这样在添加到TreeSet中的对象就不需要自己实现Comparable接口,因为TreeSet已经帮你实现了。
ArrayList Vector
ArrayList && Vector 都是基于数组实现的List类。他们都是内部封装了一个动态可分配的数组,使用initialCapacity参数来设置该数组的长度,当向ArrayList和Vector中添加的元素超过了数组的长度则initialCapacity将会自动增长。
ArrayList 与 Vector之间的主要区别是:ArrayList是线程不安全的,当多个线程修改同一个ArrayList集合的时候,需要手动的保证线程的安全。Vector是线程安全的。
在Arrays中提供了asList(….)方法,把指定的数组转成List集合。但是需要注意的是转成后的List对象是不可以使用add remove等操作的,只能遍历。
LinkedList
LinkedList 是List的一个集合,同时还实现了Deque接口,因此它可以被当成双端队列来使用。自然也可以被当成栈来使用。LinkedList内部使用的是链表的形式来保存集合中的元素。因此随机访问的性能不好,但是插入和删除的性能比较好。
-Xms 是设置JVM的堆内存初始值大小。 -Xmx 是设置JVM的堆内存最大大小。
总结:如果需要随机访问的性能,则考虑使用ArrayList,如果需要插入、删除的性能,则需要考虑使用LinkedList.
Hashtable && HashMap
两者之间的区别:
- Hashtable 是一个线程安全的类,HashMap线程不安全。
- Hashtable 不允许使用null作为key和value,但是HashMap是可以使用null作为key和value的。
因此 HashMap中只能有一个key位null,但是可以有无数的value值为null。
与LinkedHashSet一样,Map中也存在一个LinkedHashMap,用链表来记录map对象的添加顺序。
SortedMap 与 TreeMap 也是可以排序的:
- 自然排序: TreeMap 的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出异常信息。
- 定制排序: 创建TreeMap对象的时候,传入一个Comparator对象,该对象负责对TreeMap中所有的key进行排序。
Collections
Java 为 Set List Map 提供了一个工具类: Collections,它提供了大量方法对集合元素进行排序,查询和修改等操作。还提供了将集合元素对象设置为不可变、对集合对象实现同步的控制方法。
reverse / shuffle / sort / swap / rotate
Collections 提供了多个synchronizedXxx()方法,将集合包装成线程同步的集合。从而解决多线程并发的问题。
Collection c = Collecionts.synchronizedCollection(new ArrayList());
List list = Collecionts.synchronizedList(new ArrayList());
Set set = Collecionts.synchronizedSet(new HashSet());
Map m = Collecionts.synchronizedMap(new HashMap());