集合
集合API简介
- collection接口
- List接口。特点:有序,可重复
- ArrayList类,Object数组实现的。特点:查询快,增删慢
- LinkList类,链表数据结构实现的。特点:查询慢,增删快
- Vector类,Object数组实现的。特点:查询快,增删慢,线程安全的,操作效率低
- Set接口。特点:无序,不可重复。Set.iterator()遍历
- HashSet类,哈希表实现。特点:存取速度快。HashSet存储元素的原理
- TreeSet类,红黑树(二叉树)实现。特点:对集合中的元素进行排序存储
- Map接口。存储的数据都是以键值对的形式存在的,键可以不可重复,值可重复。Map.entrySet()遍历
- HashMap类,底层哈希表实现
- treeMap类,底层红黑树实现
- List接口。特点:有序,可重复
HashSet存储元素的原理:
- 往HashSet添加元素的时候,首先会调用hashCode方法计算得到哈希码值,然后根据哈希码值计算出元素存储在哈希表中的位置
- 如果算出的位置还没有没有其他元素,那么直接添加到哈希表中
- 如果该位置目前已经存在其他元素,那么还会调用元素的equal方法,如果equal返回的是true,说明是重复元素不能添加,如果返回是false,说明该元素可以添加
TreeSet使用时注意事项:
- 往TreeSet添加元素的时候,如果元素具备自然顺序的特点,那么TreeSet会根据元素的自然顺序特性进行排序存储。
- 往TreeSet添加元素的时候,如果元素不具备自然顺序的特点,那么元素所属的类就必须要实现Comparable接口,把比较的规则定义在CompareTo方法上。
往TreeSet添加元素的时候,如果元素不具备自然顺序的特点,而且元素所属的类就也没有实现Comparable接口,那么在创建TreeSet对象的时候必须要传入比较器对象。
比较器的定义格式:
class 类名 implements Comparator{ }
两种比较特别的集合遍历方式
Set.iterator()
遍历
HashSet<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
Iterator<String> it = set.iterator();//获取迭代器
while(it.hasNext()){
System.out.print(it.next()+",");
}
Map.entrySet()
遍历
HashMap<String, String> map = new HashMap<String, String>();
map.put("张三","001");
map.put("李四","002");
map.put("王五","003");
//得到Set<Map.Entry<K,V>>
Set<Entry<String,String>> entrys = map.entrySet();
for (Entry<String,String> entry : entrys) {
System.out.println("键:"+entry.getKey()+" 值:"+entry.getValue());
}