HashMap的常用方法和储存方式
HashMap实现了Map接口。
保存的值是散列的,按照key的hash排列.
数据保存的是Key-Value键值对.Key不允许重复.
若key保存的自定义对象,则该对象的类必须重写hashCode和equals方法
HashMap非线程安全。
所有实现Map接口的类,key不允许重复,如果新增元素key重复,则新元素覆盖旧元素
常用操作
HashMap<Integer, String> testHashMap = new HashMap<>();
testHashMap.put(1, "覆盖前");
testHashMap.put(1,"覆盖后");
testHashMap.put(2, "Two");
testHashMap.put(3, "Three");
System.out.println(testHashMap.remove(1));//删除元素并返回元素
System.out.println(testHashMap.replace(2, "2"));//修改元素并返回修改前的元素
System.out.println(testHashMap.get(3)); //通过键查询值
//通过键查值如果键不存在,返回默认值
System.out.println(testHashMap.getOrDefault(4, "这是默认值"));
System.out.println(testHashMap);
结果
覆盖后
Two
Three
这是默认值
{2=2, 3=Three}
Process finished with exit code 0
遍历值value
Collection<String> values = testHashMap.values();
for (String s:values) {
System.out.println(s);
}
遍历key和value
方法1
testHashMap.forEach((key,value)->{
System.out.println(key+":"+value);
});
方法2
testHashMap.entrySet().forEach(o->{
System.out.println(o.getKey()+":"+o.getValue());
});
方法3
Iterator<Integer> iterator = testHashMap.keySet().iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next+":"+testHashMap.get(next));
}
HashMap的储存方式
HashMap采用的是数组+链表的储存方式
元素的key的hash值 除以 集合的长度 的余数。
余数为该元素所在数组的下标,如果计算出现两个下标一样的,则使用单链表指向后一个元素,后一个元素不在该数组内。
所以当HashMap的key为引用类型时,必须确保它的所在类重写了hashCode和equals方法,否则插入元素时一定会出现异常。