Java集合类的用途是保存对象,根据其概念的不同可以划分为两个不同的类别:
Collection:一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,Set不能有重复元素,Queue按照队列规则来确定对象顺序。
Map:保存一组成对的键值对且允许使用键来查找值。映射表允许我们使用作为键的对象来查找对应的值对象,在实际编程中的应用十分广泛。
List
List可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
有两种类型的List:
- ArrayList:基于可变长度数组实现的List,长于随机访问其中的元素,但增删元素时效率较低。
- LinkedList:基于链表实现的List,随机访问相对较慢,但增删元素效率高且对首尾操作方便。
Set
Set不保存重复的元素。如果试图将相同对象的多个实例添加到Set中,那么它不会保存后添加的元素。
Set具有和Collection完全一样的接口,因此完全没有任何额外的功能。
常用有三种类型的Set:
- HashSet:使用散列函数储存元素,为快速查找进行了专门的优化,所以拥有最快的查找速度。当
hashCode()
和equals(Object object)
都确认为true时,才会保证是重复元素。 - LinkedHashSet:在HashSet的基础上添加了链表以维护元素的顺序,它与LinkedList有类似的特性。
- TreeSet:将元素储存在红-黑树的数据结构中,会将存储进去的元素自然排序。因为其排序的特性,所以存储的元素类必须实现Comparable接口重写
compareTo
方法或持有一个Comparator接口的实现类。
Map
Map是一种把键对象和值对象进行关联的容器,在Map中键是唯一不可重复的,而值可以重复。因为采取了对象与对象的映射关系,所以Map是一个十分强大的编程工具。
常用有四种类型的Map:
- HashMap:基于哈希表的Map接口的实现。允许使用
null
值和null
键,线程不安全。 - HashTable:与HashMap基本类似,区别在于本实现是线程安全的。
- LinkedHashMap:在HashMap的基础上添加了链表以维护元素的顺序,它与LinkedList有类似的特性。
- TreeMap:基于红黑树的实现。根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。
Queue
队列(Queue
)是一个典型的先进先出(FIFO
)的容器。即从容器的一端放入事物,从另一端取出,取出的顺序与放入的顺序是完全一致的。队列在并发编程中特别重要,因为它保证了传输时的顺序。
- LinkedList:LinkedList也实现了Queue,具有先进先出的特性。
- PriorityQueue:优先级队列使得下一个弹出的元素是最需要的元素(拥有最高的优先级)。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator进行排序,具体取决于所使用的构造方法。
遍历
使用集合的时候,将集合存储的元素取出是一个很重要的操作。
Collection
Collection是List和Set的顶级父接口,该遍历方式也适用于List和Set。
// 填充元素 Collection<String> c = new ArrayList<String>(); for (int i = 0; i < 10; i++) { c.add("element[" + i + "]"); } // 使用迭代器遍历 Iterator<String> iterator = c.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // for-each(其实是迭代器的封装)遍历 for (String s : c) { System.out.println(s); }
List
List是有顺序的集合,除了按照Collection的遍历方式来遍历外,还可以使用索引遍历。
// 填充元素 List<String> list = new ArrayList<String>(); for (int i = 0; i < 10; i++) { list.add("element[" + i + "]"); } // 使用索引遍历 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
Set
Set的遍历方式完全与Collection一样。
Map
Map和Collection的遍历方式不一样,可以如下三种方式遍历
// 填充数据 Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < 10; i++) { map.put("key[" + i + "]", "value[" + i + "]"); } // 使用EntrySet进行遍历,EntrySet是一个Entry的Set集合,每一个Entry包含了Map中的一个键值对 for (Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } // 使用KeySet进行遍历,然后使用Key查找对应的Value for (String key : map.keySet()) { System.out.println(key + " = " + map.get(key)); } // 使用Values集合遍历,缺点是无法获取对应的key for (String value : map.values()) { System.out.println(value); }
来源:http://www.cnblogs.com/Loshine/p/4567375.html