2015年6月15日22:35:41
最近在学习java,每天做点笔记,整理一下今天学的东西。
Map 接口
Map 集合是键值(Key Value)对应的集合,一个值只能对应一个键。 Map 接口的常见实现
类有 HashTable 和 HashMap。 HashTable 的键和值都不允许为 null。 HashMap 的键和值都允
许为 null
(一)Hashtable
Hashtable 实现 Map 接口,任何非空( non-null)的对象都可作为 key 或者 value。添加数据使用 put(key, value),取出数据使用 get(key)
package javacourse.ch7;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
public class TestHshtable {
public static void main(String[] args) {
Hashtable<String,Integer> hashtable=new Hashtable<>();
Hashtable<String,Integer> hashtable1=new Hashtable<>();
hashtable.put("1", 1);
hashtable.put("2", 2);
hashtable.put("3", 3);
hashtable.put("7", 4);
hashtable.put("4", 4);
hashtable.put("5", 4);
hashtable.put("6", 4);
hashtable1.put("1", 1);
hashtable1.put("2", 2);
hashtable1.put("3", 3);
hashtable1.put("7", 4);
hashtable1.put("4", 4);
hashtable1.put("5", 4);
hashtable1.put("6", 4);
//hashtable.put(null, 1);//key不能为null
//hashtable.put("11", null);//value不能为null
System.out.println(hashtable.equals(hashtable1)); //比较两个hashTable是否相等
System.out.println(hashtable);
Integer n=hashtable.get("5");
System.out.println("two:"+n);
//System.out.println(hashtable);
//hashtable.clear();//清空
//System.out.println(hashtable);
//利用迭代器
Set<String> set=hashtable.keySet();
Iterator<String> it=set.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.print(hashtable.get(key)+"\t");
}
//System.out.println(hashtable1.contains(4));
}
}
(二)迭代器
迭代器(Iterator)模式能顺序访问集合中的各个元素,而又不需暴露该集合的内部表示。
java.util.Iterator 接口的方法有:
1. boolean hasNext(),在 next 方法之前调用,用于判断 next 方法是否能返回一个元素,以防止调用 next 方法时抛出异常。
2. E next(),返回当前容器中的元素引用。
3. void remove(),删除最后一次使用 next 方法返回的元素,需要注意每次调用 next方法后,此方法只能被调用一次,否则抛出 IllegalStateException 异常。如果进行迭代时调用此方法之外的其它方式修改了该迭代器所指向的集合,则迭代器的行为是不确定的。
上述例子中,就是使用了迭代器,
Set<String> set=hashtable.keySet();
Iterator<String> it=set.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.print(hashtable.get(key)+"\t");
}
如果不适用迭代器,而用
for(String str:hashtable)
{
System.out.println(str+"\t");
}
则会出现错误:
只能通过 java.lang.Iterable 的数组或实例进行迭代
如下方法可以通过value查找key
package cn.edu.javacourse.ch7;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestMapEnty {
public static void main(String[] args) {
Map<String, String> m=new HashMap<String, String>();
m.put("abc", "123");
m.put("cdf", "张三");
m.put("gef", "大学生");
Set<String> set=m.keySet();
Iterator<String> iterator=set.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
System.out.println(m.get(s));
}
Set<Map.Entry<String, String>> entrySet=m.entrySet();
Iterator<Map.Entry<String, String>> ite=entrySet.iterator();
String xString="张三";
while(ite.hasNext())
{
Map.Entry<String, String> me=ite.next();
String key=me.getKey();
String value=me.getValue();
if(value==xString)
{
System.out.println(key);
}
System.out.println("Key:"+key+"\tvalue:"+value);
}
}
}
entrySet 将 Map 集合中的映射关系存入一个 Set 集合中,该 Set 集合的类型是 Map。
因为 entrySet 取出的是键值关系, 它既不是键,也不是值。
注意:
- 在使用 Iterator 访问集合时,不可以通过集合对象同时操作集合中的元素,否则会发生异常,只能用迭代器自己的方法来操作集合中的元素。
- 如果想要添加、修改等就需要使用 ListIterator,它是 List 特有的迭代
器,是 Iterator 的子接口。