Collection框架是java中非常重要的基础部分。
1. Collection框架层次的顶层是Collection接口。Collection接口有两个非常重要的子接口:List接口和Set接口。ArrayList,LinkedList,Vector是接口List的实现类;HashSet和TreeSet是Set接口的实现类。
2.Collection框架另一个顶层接口是Map接口。Map接口重要的子接口:Hashtable,HashMap,TreeMap
Collection接口
Collection接口是顶层接口,其中定义了集合框架共有的方法。(一下省略返回值和传入参数,详细可查看java API)
基本方法:
增:add()
删:remove()
改:Link和Set有区别
查:contains() isEmpty()
集合操作方法:
交:retainAll()
并:addAll()
差:removeAll()
迭代器方法:
iterator()
其他方法:
equals() size() clear()...
List接口
特点:元素是有序的,而且可以重复。
特有方法:(对索引的操作)
增:add(index, element)
删:remove(index)
改:set(index,element)
查:get(index) subList(from, to)
迭代器:
listIterator()
这个迭代器非常重要,它是List的专属迭代器,可以在遍历集合的同时对其进行修改,而不会出现ConcurrentModificationException.
一般由iterator()得到的迭代器是不允许在集合遍历时对其修改的
ArrayList
特点: 底层是数组数据结构,可以看成是可变长度的数组。线程不同步(与Vector比较)
优势:查询速度快
劣势:增删操作较慢
LinkedList
特点:底层是链表数据结构
优势:增删较快
劣势:查找较慢
特有方法:
增:addFirst() addLast()
查:getFirst() getLast() 如果集合为空,抛出NoSuchElementException
删:removeFirst() removeLast() 如果集合为空,抛出NoSuchElementException
jdk6.0后出现替代方法
增:offerFirst() offerLast() 增加
查:peakFirst() peakLast() 获取不移除,如果集合为空,返回null
删:pollFirst() pollLast()获取并移除,如果集合为空,返回null
Vector
功能与ArrayList相同,但Vector线程同步。Vector是jdk1.0就有的,但Collection框架是jdk1.2才出现的,由于Vector效率较低,所以Vector基本上已被ArrayList代替。
Set接口
特点:元素是无序的(存取顺序不一致),而且不允许重复。
Set的方法与Collection基本一致。HashSet
特点:底层数据结构是hash表结构
HashSet利用hashCode()和equals()两个方法来保证元素的唯一性
如果元素的hashCode相同,才会判断equals方法是否为true;
如果元素的hashCode不同,则不会判断equals方法。
一般在建立类时,如果其对象需要存放在HashSet中,一般都要重写hashCode()和equals()。因为在Object中equals()比较的是地址值。TreeSet
特点:底层数据结构是二叉树,可以对集合中的元素进行排序
TreeSet排序实现:
第一种方式:
让元素自身具备比较性,必须要继承Comparable接口,实现compareTo方法,这种方式被称为自然排序或者默认排序。
第二种方式:
让集合本身具备比较元素的能力。定义比较器类继承Comparator接口,实现compare(object1, object2)方法。然后创建比较器对象作为参数传入到TreeSet中。
当两种排序方式都存在时,以比较器为主。
Map接口
Map<Key, Value>属于双列集合,数据一对一对往里存,而且要保证键是唯一的。
方法:
增加:put() putAll()
删除:clear() remove()
判断:containsKey() containsValue()
获取:get() size() values()
entrySet() keySet()
Map集合的两种重要的取出方式:
1.将map中的所有键存到Set集合中,可以用Set的迭代器取出所有的键,然后用get(Key)获取所有的值。
Map<String,String> map = new HashMap<String,String>();
map.put("a","hello");
map.put("b","world");
Set<String> keySet = map.keySet();
for(Iterator<String> it = keySet.iterator(); it.hasNext(); ){
String key = it.next();
System.out.println("key: "+key+"--value:"+map.get(key));
}
2.将map集合中的映射关系存入到Set集合中,这个关系的数据类型是Map.Entry(这是Map接口的内部接口),这个接口提供了getKey()和getValue()方法。
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<String, String> me = it.next();
System.out.println("key:"+me.getKey() + "--value:"+me.getValue());
}