HashMap浅谈
首先HashMap是Map接口的实现类。
每次存储两个对象,一个为键key,一个为值value。
键key是没有重复的,是唯一的存在。
无序集合,非线程安全,key和value都可以存入null。
-----------------------------------------
常用方法:
put(key,value); 添加方法,有返回值,通常返回值为null,在存入的key已经存在时,返回值则返回被覆盖之前的value值。
get(key); 得到value值方法,通过key得到value值。
remove(key) 删除方法,通过key删除数据。返回被删除的数据中的value值,没有改key的数据删除失败则返回null。
keySet();得到所有的key,是一个Set集合。
entrySet();得到键值对的关系对象的集合,也是一个Set集合。
-----------------------------------------
遍历方法1:用迭代器
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap();
hashMap.put("1", 2);
hashMap.put("2", 3);
//开始遍历
Set set = hashMap.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Integer value = hashMap.get(key);
System.out.println(key + "," + value);
}
}
遍历方法2:用增强for循环
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap();
hashMap.put("1", 2);
hashMap.put("2", 3);
//开始遍历
for (String key:hashMap.keySet()){
Integer value=hashMap.get(key);
System.out.println(key+","+value);
}
}
遍历方法3:用增强for遍历Entry键值对关系对象集合
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap();
hashMap.put("1", 2);
hashMap.put("2", 3);
//开始遍历
for (Map.Entry<String,Integer> entry:hashMap.entrySet()){
String key=entry.getKey();
Integer value=entry.getValue();
System.out.println(key+","+value);
}
}
-----------------------------------------
需要注意的是:增强for不能遍历Map集合。
Entry到底是什么东东?她是Map集合接口里的一个内部静态接口,作用就是把key和value对应的关系封装成对象。
当用对象作为key时,注意该对象要重写equals方法和hashcode方法,确保key的唯一性。
-----------------------------------------
那么HashMap和Hashtable有什么区别呢:
HashMap:非线程安全,能存null,速度快。
Hashtable:线程安全,不能存null,速度慢。
因此,Hashtable几乎很少出现在编程的舞台,但是她有一个子类比她受欢迎得多,就是Properties集合,这个集合可以和流进行配合,实现持久存储。
-----------------------------------------
说到集合的线程安全的问题,让我想起一个集合操作类顺带题一下:
Collections类,注意,,不是Collection接口,是Collections,后面多了个s。
这个类全部是静态方法,直接调用即可,比如常用的方法有:
sort 排序,默认升序,只针对List集合,Set集合不行,因为Set集合没有索引。
shuffle 随机排序,把集合的位置随机打乱。
synchronizedSet,把非线程安全的Set集合变成线程安全的。
synchronizedList,把非线程安全的List集合变成线程安全的。
synchronizedMap,把非线程安全的Map集合变成线程安全的。