Java集合框架的整体概览图:
如下(摘自w3school Java集合框架)
上图中,Map
、Collection
和Iterator
是三个接口,List
和Set
是Collection
接口的子接口,ArrayList
和LinkedList
是实现了List
的类,HashSet
和TreeSet
是实现了Set
接口的类,HashMap
和TreeMap
是实现了Map
接口的类。
Collection接口的常用方法:
方法 | 描述 |
---|---|
boolean add(Object c) | 向集合类中添加一个新元素,返回值表示集合的内容是否改变了(就是元素有无数量、位置等变化) |
boolean addAll(Collection<? extends E> c) | 将c所引用集合对象中的所有对象加入现有集合中。 |
boolean remove(Object o); | 从集合类中删除一个指定对象的引用。 |
boolean removeAll(Collection c); | 从本集合中删除参数c所引用集合对象中的所有对象。 |
boolean retainAll(Collection c) | 保留本集合中参数c所引用集合对象中的所有对象。(取交集) |
Iterator< E > iterator() | 通过该方法返回一个实现Iterator接口的对象,之后可利用该对象对集合类对象进行遍历。 |
Object[] toArray() | 将集合中的所有元素以数组对象引用形式返回。 |
Object[] toArray(Object[] a) | 首先,将集合的所有元素以对象数组的形式来描述,且类型与参数a的类型是相同的。例如,String[] o = (String[])c.toArray(new String[0]);得到的o实际类型是String[]。其次,如果参数a的大小装不下集合的所有元素,返回的将是一个新的数组;如果参数a的大小能装下集合的所有元素,则返回的还是a,但a的内容用集合的元素来填充;如果填充后a还有剩余,则剩余部分全部被置为null |
Map接口的常用方法
方法 | 描述 |
---|---|
V put(K key, V value) | 将key和value存入Map对象中,若该key对应的值已存在于Map中,则用value替换该值并返回旧的值 |
V get(Object key) | 获取key对应的value |
Set< K > keySet() | 返回Map对象所有的键,不能包含重复元素 |
Collection< V > values() | 返回Map对象的所有的值 |
public Set<Map.Entry<K,V>> entrySet() | 返回一个Set,Set中的每一个元素都代表了Map中的一个独立的关键字/值对,其操作由Map.Entry接口规定 |
作业题
书上的7个题所考察的知识点之间各有重叠,因此此处按照知识点的前后逻辑顺序来作答。
第一题:Map、Collection、Iterator之间的关系如何?
Map
是以键值对的形式存储数据,可以通过该接口的values
方法获得一个Collection
接口,也可以通过Map
的keySet
方法获取Collection
接口的子接口Set
;
Collection
中所存储的是一种线性元素集合,可以通过其iterator
方法获取一个Iterator
接口,从而实现Collection
的实现类中元素的遍历;
Iterator
接口通过hasNext
方法来判断当前迭代是否还有后续元素,通过next
方法获取下一个元素。
第二题:遍历一个集合对象有哪些方法?
for循环,调用get方法
foreach语句
使用Iterator接口实现向后遍历,ListIterator接口实现向前遍历;
使用Enumeration接口(该接口已被Iterator接口替代)
第三题:Vector与ArrayList、LinkedList与ArrayList、Hashtable与HashMap、TreeMap与HashMap之间的共同点和区别是什么?
-
Vector与ArrayList:
-
LinkedList与ArrayList:
-
Hashtable与HashMap
-
TreeMap与HashMap
第四题:同数组相比,Vector有何特点?
Vector在创建时不需要指定元素个数,并且可以自动扩容,而数组则无法自动扩容。
第五题:现需要选择集合类,它存储的对象集合可以被多个线程维护(增加、删除),请问应该选择什么样的集合类,为什么?如果多个线程只是读取,而不维护,应该选择什么样的集合类,为什么?
-
线程安全的集合类(同步):
Collection:Vector
Map:Hashtable, ConcurrentHashMap -
线程不安全的集合类(异步):
Collection:ArrayList, LinkedList
Map:HashMap,
第六题:Collection和Collections各自的功能是什么?
Collection是一个接口,其定义了集合所需要具备的属性和方法,Collections是一个类,其包含了许多对集合进行操作的方法。
第七题:如何实现集合对象排序?定义一个复数类并按照复数的实部大小对复数对象进行排序。
实现Comparator接口并覆盖其compare方法来对集合对象进行排序,
compare方法声明:int compare(Object o1, Object o2);
返回值是-1,0或1,-1表示o1在o2前面,1表示o1在o2后面;
排序代码示例:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(10);
list.add(-2);
list.add(20);
System.out.println(list); // [3, 10, -2, 20]
// 使用Collections.sort排序,默认升序排序
Collections.sort(list);
System.out.println(list); // [-2, 3, 10, 20]
// 使用Comparator接口,降序排序
Collections.sort(list, new Comparator<Integer>(){
public int compare(Integer i1, Integer i2){
return i2 - i1; //
}
});
System.out.println(list);
第八题(补充题):编写程序测试Java集合框架中各种常用类的基本操作(包括添加元素,删除元素,遍历集合元素等)
- ArrayList
public static void testArrayList() {
/** 测试ArrayList的常用方法 */
List<Integer> list = new ArrayList<Integer>();
// 增加元素
list.add(10);
list.add(20);
// 遍历集合并打印
Iterator<Integer> iterator;
iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next()+" ");
}
// 删除元素
list.remove(Integer.valueOf(10)); // 这里不能用list.remove(10),因为remove的参数类型是Object,是一个对象,而基本数据类型不是对象
list.add(30);
list.remove(Integer.valueOf(30)); // 同上
iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next()+" ");
}
}
- LinkedList
public static void testLinkedList() {
/** 测试LinkedList的常用方法 */
LinkedList<String> list = new LinkedList<String>();
// 增加元素
list.add("10");
list.add("20");
// 遍历集合并打印
Iterator<String> iterator;
iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next()+" ");
}
// 删除元素
list.remove("10");
list.add("hello");
list.remove("20");
iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next()+" ");
}
// LinkedList的addFirst, addLast, removeFirst, removeLast
System.out.println(list); // [hello]
list.addFirst("f1");
list.addFirst("f2");
System.out.println(list); // [f2, f1, hello]
String tmp;
tmp = list.removeLast();
System.out.println(tmp);
tmp = list.removeFirst();
System.out.println(tmp);
System.out.println(list); // [f1]
}
- HashMap和TreeMap的操作(增加元素与遍历):
以下代码中用的是HashMap,TreeMap与其操作一样。
// 增加元素
HashMap<String, String> map = new HashMap<String, String>();
map.put("10/31/01", "Halloween");
map.put("01/01/01", "New Years");
// 遍历map中的键值对
//1 keySet遍历
Set<String> keySet = map.keySet();
Iterator<String> iter;
String k, v;
iter = keySet.iterator();
while (iter.hasNext()) {
k = iter.next();
v = map.get(k); // 根据key来取出value
System.out.println("key = "+k+", value = "+v);
}
//2 entrySet遍历
Set<Map.Entry<String, String>> entries = map.entrySet();
Iterator<Map.Entry<String, String>> iterEntry = entries.iterator();
Map.Entry<String, String> anEntry;
while (iterEntry.hasNext()) {
anEntry = iterEntry.next();
k = anEntry.getKey();
v = anEntry.getValue();
System.out.println("key = "+k+", value = "+v);
}