Map集合
特点:键值对存储(key,value)
key不能重复,如果重复,会覆盖前面存储的
底层用transient Node<K,V>[] table;进行数据存储,是一个数组,数组中的元素是链表的结构结构如下:
第一步:计算id的hashcode的值如“id”.hashcode() =10 1110 0011 1010 1110
1001(二进制) 第二步:获取当前的长度,假设这是第一次添加元素,则它的长度为16, 第三步:计算index的位置:hashcode
& length -1 = 10 1110 0011 1010 1110 1001 & 1111(16-1的二进制) =
1001=9,那么该元素放到在数组中下标为9的位置。
假设如果在放一个元素map.put(“name”,"张三“);这个元素,并且计算出name的hashcode=11 1100 1011
1110 1110 1001这个值,它的hashcode & length -1 = 9,那么 这个要怎么办?
map.put(“id”,“123540”);和map.put(“name”,"张三“);这两个元素都放到位置为9的地方,HashMap是采用数组加链表的结构,将这两个元素都放到链表中。
假设现在放入的元素都已经放了很多了有16*0.75=12,再次放的时候,就需要扩容了,如果扩容,那么扩容16x2^1=32那么这个map的长度就为32了,那么原先存储在map中的位置就都要改变,重新计算位置。
HashMap集合
无序不可重复,底层数据结构是——哈希表
我认为比较常用的方法
int size();
boolean isEmpty();
object get(object key);
boolean containsKey(object key);
V put(K key,V value);
void putAll(Map m);
V remove(Object key);
void clear();
boolean containsValue(object value);
Set keySet();
Collection values();
Set<Map.Entry<K,V> entrySet();
V replace(K key,V value);
HashMap的遍历
Set keySet(); Collection values(); Set<Map.Entry<K,V> entrySet();
第一种
Map map = new HashMap();
Set set = map.keySet();
for(Object key : set){
system.out.println("key:"+key+" and value:"+map.get(key));
}
第二种
Map map = new HashMap();
Set<Map.Entry<K,V> set = map.entrySet();
for(Map.Entry entry : map.entrySet()){
system.out.println("key:"+entry.getKey()+" and value:"+entry.getValue());
}
第三种
Map map = new HashMap();
Set<Map.Entry<K,V> set = map.entrySet();
Iterator it = set.iterator();
while(it.hasNext()){
system.out.println("key:"+entry.getKey()+" and value:"+entry.getValue());
}
第四种:遍历值
Map map = new HashMap();
for(String v : map.values()){
system.out.println("value:"+v);
}
LinkedHashMap
LinkedHashMap的底层是哈希表+链表,所以可以有序。无论是键还是值都不允许为null。
题外知识:补充一些hashcode()方法的知识,如果一个类想要不存入相同的值,就要重写equals()和hashcode方法
public boolean equals(Object obj) {
if(!(obj instanceof Student)) {
return false;
}
Student stuObj = (Student) obj;
if (this == stuObj) {
return true;
}
if (stuObj.name.equals(this.name) && stuObj.sex.equals(this.sex) && stuObj.age.equals(this.age)) {
return true;
} else {
return false;
}
}