一、背景
1.Map集合在实际的开发中用的是非常的广泛的,下面我们先讲下Map集合早实际的开发中怎么去使用以及要注意的一些知识点。本篇文章不研究底层了,掌握集合的使用就行了如果有兴趣的小伙伴可以自行去研究底层源码,很复杂。
二、UML类图
从上面的关系我们就可以看出HashMap的继承以及实现关系。
三、Map常见操作
1.学会Map的常见操作。
2.理解为什么为什么Map遍历中不能用Map自带的删除方法操作元素,
必须用Iterator的remove()
(注意Map、Set、List都有这个问题)。
四、遍历方式1、keyset(不可行)
1.测试类
public class HashMapTest {
public static void main(String[] args) {
Map<String,Person> persons = Maps.newHashMap();
persons.put("3",new Person("张三","河南"));
persons.put("2",new Person("李四","河北"));
persons.put("1",new Person("张三","北京"));
for (String id:persons.keySet()){
System.out.println(persons.get(id));
}
System.out.println("+++++++++++++++++++++++++++++++++++");
for (String id:persons.keySet()){
//persons.put("1",new Person("张三","北京1"));//修改没问题
persons.put("4",new Person("王五","重庆"));//新增有异常
System.out.println(persons.get(id));
//persons.remove("1");//移除有异常
}
}
}
2.结果:
Person{name='张三', address='北京'}
Person{name='李四', address='河北'}
Person{name='张三', address='河南'}
+++++++++++++++++++++++++++++++++++
Person{name='张三', address='北京'}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at com.example.demo.HashMapTest.main(HashMapTest.java:19)
3.总结:在做修改和移除的时候都存在问题。所以上面这种方法不可行,这种方法不能遍历移除和遍历新增,那我们就需要另外一个方法来满足我们的需求了。
五、遍历方式2、EntrySet
1.测试类
public class HashMapTest {
public static void main(String[] args) {
Map<String, Person> persons = Maps.newHashMap();
persons.put("3", new Person("张三", "河南"));
persons.put("2", new Person("李四", "河北"));
persons.put("1", new Person("张三", "北京"));
for (String id : persons.keySet()) {
System.out.println(persons.get(id));
}
System.out.println("+++++++++++++++++++++++++++++++++++");
Iterator<Map.Entry<String, Person>> it = persons.entrySet().iterator();
Map.Entry<String, Person> entry = null;
while (it.hasNext()) {
entry = it.next();
it.remove();
}
System.out.println(persons.get(entry.getKey()));
}
}
2.结果
Person{name='张三', address='北京'}
Person{name='李四', address='河北'}
Person{name='张三', address='河南'}
+++++++++++++++++++++++++++++++++++
null
3.总结:就这样就完成了循环删除的操作。
或者你也可以这么做
1.测试类
public class HashMapTest {
public static void main(String[] args) {
Map<String, Person> persons = Maps.newHashMap();
persons.put("3", new Person("张三", "河南"));
persons.put("2", new Person("李四", "河北"));
persons.put("1", new Person("张三", "北京"));
for (String id : persons.keySet()) {
System.out.println(persons.get(id));
}
System.out.println("+++++++++++++++++++++++++++++++++++");
Map.Entry<String, Person> entry = null;
for (Iterator<Map.Entry<String, Person>> it = persons.entrySet().iterator(); it.hasNext(); ) {
entry = it.next();
it.remove();
}
System.out.println(persons.get(entry.getKey()));
}
}
2.结果
Person{name='张三', address='北京'}
Person{name='李四', address='河北'}
Person{name='张三', address='河南'}
+++++++++++++++++++++++++++++++++++
null
3.和上面的结果是一样的。
六、遍历方式3、values
1.测试类
public class HashMapTest {
public static void main(String[] args) {
Map<String, Person> persons = Maps.newHashMap();
persons.put("3", new Person("张三", "河南"));
persons.put("2", new Person("李四", "河北"));
persons.put("1", new Person("张三", "北京"));
for (String id : persons.keySet()) {
System.out.println(persons.get(id));
}
System.out.println("+++++++++++++++++++++++++++++++++++");
for(Person p:persons.values()){
System.out.println(p);
}
}
}
2.结果
Person{name='张三', address='北京'}
Person{name='李四', address='河北'}
Person{name='张三', address='河南'}
+++++++++++++++++++++++++++++++++++
Person{name='张三', address='北京'}
Person{name='李四', address='河北'}
Person{name='张三', address='河南'}
3.跟上面讲的不太沾边,这顺便把它的遍历方式讲解出来了。
七、结束
想研究源码的自行百度吧,希望能帮到你们。
Always keep the faith!!!