本次主要说明hashMap的基本使用。虽然HashMap是线程不安全的,但是也有必要深入学习。map有键和值得概念,键和值是关联关系,map按照键存储和访问值,键不会重复,重复设置会覆盖前面的值
hashMap的创建
HashMap<Object, Object> map = new HashMap<>();
hashMap的元素添加
//添加元素
map.put("aaa", "123");
map.put("bbb", "111");
map.put("ccc", "222");
map.put("ddd", "333");
hash的几种遍历方式
/**
* 遍历map的方式有四种方式
* 1 在for循环中使用entries实现Map的遍历
* 2 在for循环中遍历key或者values
* 3 通过Iterator遍历
* 4 通过键找值遍历,这种方式的效率比较低,因为本身从键取值是耗时的操作
*/
// 第一种遍历
System.err.println("===========在for循环中使用entries实现Map的遍历===============");
for (Map.Entry<Object, Object> entries : map.entrySet()) {
Object key = entries.getKey();
Object value = entries.getValue();
System.err.println(key.toString() + "\t\t" + value.toString());
}
//第二种遍历
System.err.println("==========在for循环中遍历key或者values============");
for (Object key : map.keySet()) {
System.err.print("key\t" + key.toString() + "\t");
System.err.print(map.get(key) + "\n");
}
System.err.println("=======通过map.values()遍历值集==========");
for (Object value : map.values()) {
System.err.print(value.toString() + "\t");
}
//第三种遍历
System.err.println("\n===========通过Iterator遍历============");
Iterator<Map.Entry<Object, Object>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Object, Object> entry = iterator.next();
Object key = entry.getKey();
Object value = entry.getValue();
System.err.println(key.toString() + "\t\t" + value.toString());
}
//第四种遍历
System.err.println("=======通过键查找值遍历========");
for (Object key : map.keySet()) {
Object o = map.get(key);
System.err.println(key.toString() + "\t\t" + o.toString());
}
System.err.println("============lambda表达式===============");
map.forEach((k, v) -> {
System.err.println(k.toString() + "\t" + v.toString());
});
遍历结果:
hashMap的删除:如果在遍历中删除map则会报java.util.ConcurrentModificationException异常,原因就是因为迭代器内部维护一些索引位置相关的数据,在迭代的过程中,不能添加、插入和删除元素,只是修改的话则不会引发这种异常
To delete key aaa
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
at com.jiang.demo.map.ch01.main(ch01.java:40)
//删除map里面的值
Set<Object> keySet = map.keySet();
for (Object key : keySet) {
if (key.toString().equals("aaa")) {
System.err.println("To delete key\t" + key);
keySet.remove(key);
}
}
如果需要在遍历过程中进行删除操作,需要通过keySet或者entrySet的iterator来实现。
Iterator<Map.Entry<Object, Object>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Object, Object> next = iterator.next();
Object key = next.getKey();
if (StringUtils.equals(key.toString(), "aaa")) {
iterator.remove();
System.err.println("==============删除完成===============");
}
}