Map 和 Set 集合的用法
迭代器(Iterator)的用法和使用
public interface Iterator<E>{
E next();
boolean hasNext();
void remove();
}
iterator接口包含了3个方法,可以反复调用next方法,遍历集合中每个元素,但如果达到集合的末尾,next方法就会抛出NoSuchElementException,所以要在调用next方法前调用hasNext方法,例如:
Iterator<String> i = list.iterator();
while (i.hasNext()){
String ilist=i.next();
System.out.print(ilist+" ");
} //迭代器
hashCode()方法以及hashtable(散列表)
有一种数据结构,可以快速查找对象,这就是散列表(hashtable),散列表为为每个对象计算出一个整数,称为散列码(hashCode),例如"Lee" 的散列码为 76268 "eel"的散列码为100300,他们是为String类的hashCode方法产生
hashCode方法与equals方法兼容,即如果a.equals(b) 为true,a与b的也必须含有相同分的散列码 即(hashCode).
哈希表(hashTable):
hashTable 就是对象数组和链表,每个链表称为桶(bucket)散列表,实际上是一种根据Key值而直接进行访问的数据结构
想要查找表中对象的位置,就要计算它散列码(hashCode),例如某个"Lee"这个对象 其hashCode是76269,并且表中有128个桶,则对象应保存在第108号桶中(76268除以128余108),数组的初始长度为16,即为有16个桶,当桶中的数量大于8时(链表长度大于8)链表转换为红黑树,当桶中元素数量减少到6时,红黑树转回为链表。
每个哈希表在开始时都是有16个桶和 0.75的散列值,意思就是假如现在有12个桶里都存放数据(16x0.75)那么数组就会扩容就会扩容到之前的两倍 即32个桶就是数组长度为32,那么取余运算不再是除16而是除32来寻找位置,以此类推。
hashSet和TreeSet
hashSet可以用add方法添加元素,contains方法查看是否出现在集中,不必遍历所有元素,散列集访问所有的桶,他们的顺序几乎是随机的(因为根据hashCode排序),只有不关心顺序时才会使用HashSet,例如:
HashSet hashSet = new HashSet(list); //添加对象
list.clear();
list.addAll(hashSet); //利用hashset 无重复性
Iterator<String> i = list.iterator();
while (i.hasNext()){
String ilist=i.next();
System.out.print(ilist+" ");
} //迭代器
System.out.println();
System.out.println("---------");
for (String ilist: list) {
System.out.print(ilist+" ");
}//增强for
TreeSet与散列值十分相似,不过它是一个有序集合,每个值讲自动排序,实现了Comparable接口(至于comparable和comparator方法我会单独拿出一章来讲)
用法与HashSet类似
Map(映射表)键/值
Map用来存放键/值对,如果提供了键,就能查找到值。例如键为员工ID,值则为员工对象。例如:
Map<String,Employee>staff=new HashMap<>();
Employee e1=new Employee("Zhang");
staff.put("员工id",e1);
Map 集合的遍历方式
首先先讲一下3个视图:
分别是
SetkeySet;//键集
Collection values(); //值集合(不是集
Set<Map,Entry<K,V>entrySet(); //键/值对集
keySet既不是HashSet,也不是TreeSet,而是实现了Set接口的某个其他类的对象,Set接口扩展了Collection接口因此可以像使用其他集合一样使用keySet
利用key 遍历查找
Set<String> keyset =map.keySet();
for (String key:keyset) {
System.out.println(key+map.get(key));
}
还可以枚举各个条目(entries)利用键值对集来查找key 和value
for (Map.Entry<String,Employee>entry:empolyee.entrySet()) {
String key=entry.getKey();
Employee value=entry.getValue();
}