HaspMap的简单使用
HashMap的简单增删改
package map集合;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map map = new HashMap();
//成对放入多对 key-value
map.put("java",109);
map.put("ios",10);
map.put("js",79);
//value值可以重复
map.put("python",99);
//放入重复的key时,输出的是被覆盖的key的value值
System.out.println(map.put("js", 29));
//输入集合中的所有键值对
System.out.println(map);
//判断是否包含某个key
System.out.println(map.containsKey("js"));//true
//判断是否包含某个值
System.out.println(map.containsValue(10));//true
//获取Map集合的所有key组成的集合,通过遍历key来实现所有的键值对
for(Object key:map.keySet()) {
System.out.println(key+"---"+map.get(key));
}
//删除某个键值对
map.remove("js");
System.out.println(map);
}
//当两个hashMap的键值相同时,比较他们的值
Map<Object,Object> mapOne= new HashMap<Object,Object>();
Map<Object,Object> mapTwo= new HashMap<Object,Object>();
mapOne.put(1, 1);
mapOne.put(2, 2);
mapTwo.put(3, 3);
mapTwo.put(4, 4);
for(Object key:mapOne.keySet()) {
System.out.println(mapOne.get(key)==mapTwo.get(key));
}
}
HashMap存储容器
HashMap<String,Vector<Object>> nowMessage =new HashMap<String,Vector<Object>>()
HashMap遍历时删除元素报错问题
Map<String,Object> searchMap = new HashMap<String,Object>();
searchMap.put("name", name);
searchMap.put("gender",gender);
searchMap.put("idcard",idcard);
searchMap.put("profession",profession);
for(Object key:searchMap.keySet()) {
if(searchMap.get(key).equals("")||searchMap.get(key).equals("请选择")) {
//删除对应的键值对
searchMap.remove(key,searchMap.get(key));
}
}
结果:
报错:
java.util.ConcurrentModificationException HashMap
报错原因:
HashMap不是线程安全的,ConcurrentHashMap是线程安全的。
解决措施
方法1:简单粗暴:将HashMap改成ConcurrentHashMap
Map<String,Object> searchMap = new ConcurrentHashMap<String,Object>();
searchMap.put("name", name);
searchMap.put("gender",gender);
searchMap.put("idcard",idcard);
searchMap.put("profession",profession);
for(Object key:searchMap.keySet()) {
if(searchMap.get(key).equals("")||searchMap.get(key).equals("请选择")) {
searchMap.remove(key,searchMap.get(key));
}
方法2:在修改HashMap的上下文进行加锁操作(不是很理解)
HashMap元素排序乱序问题
HashMap储存元素时是乱序的,而LinkedHashMap是按照顺序的。如果需要按照顺序时,可以将HashMap改为LinkedHashMap。
HashMap元素排序乱序和HashMap遍历时删除元素报错问题同时解决。
问题:
假如我要删除某个集合中的一些键值对,并且这个集合的顺序不能改变。但是LinkedHashMap删除时有安全问题,而ConcurrentHashMap又是乱序的。
解决方法:
采用不删除,而采用添加的操作。
新建一个集合,遍历之前的集合。遍历时添加选择条件,将符合条件的元素添加到新的集合中。
String name = this.nameSearch.getText();
String gender = this.genderSearch.getSelectedItem().toString();
String idcard= this.idcardSearch.getSelectedItem().toString();
String profession = this.professionSearch.getSelectedItem().toString();
//所有搜索内容的集合 此处用两个linkedMap的原因 因为用for循环删除不需要的内容时会爆安全问题,需要用ConcurrentHashMap,但是他是不排序的,所以只能用两个linkedHashMap
Map<String,Object> searchMap = new LinkedHashMap<String,Object>();
searchMap.put("name", name);
searchMap.put("gender",gender);
searchMap.put("profession",profession);
searchMap.put("idcard",idcard);
//可用于挑选的内容集合
Map<String,Object> searchMaps = new LinkedHashMap<String,Object>();
for(Object key:searchMap.keySet()) {
if(searchMap.get(key).equals("")==false||searchMap.get(key).equals("请选择")==false) {
searchMaps.put((String) key,searchMap.get(key));
}
}