Map集合

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;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值