集合(四)

文章介绍了Java集合中的Map接口,强调其作为双列集合存储键值对的特点。HashMap是主要的实现类,非线程安全但效率高,允许存储null。JDK1.7和1.8的HashMap底层实现区别在于1.8引入了红黑树。另外,文章对比了HashMap和HashTable,指出HashTable线程安全但效率较低,不允许null值。
摘要由CSDN通过智能技术生成

接上篇Set接口之后,聊一聊集合中的Map接口
一.Map接口
1.Map接口的定义
是双列集合,用来存储一对(Key,Value)值的一对数据
key:无序的,不可重复的,使用set存储的所有的Key值------>key所在的类重写equals和hashCode()
value:无序的,可重复的,使用Collection存储Value值------->Value所在的类要重写
2.

Map子类概括
HashTable---->Peoperties常用来处理配置文件,key和value都是String 类型
HashMap -------> LinkedHashMap保证在遍历map元素的时候,可以按照添加的顺序去遍历
sortedMap----->TreeMap保证按照添加的key-value进行排序实现排序遍历

3.HashMap作为Map的主要实现类,是线程不安全的,效率比较高,存储null的key和value
4.Hashtable作为Map的古老实现类,是线程安全的,效率低,不能存储null和value值

5.HashMap的底层实现原理

JDK1.7的时候使用的是数组和链表
JDK1.8的时候使用的是数组+链表+红黑树

以JDK1.7为例
①HashMap map= new HashMap();在实例化之后,底层底层已经创建了长度是16的一维数组Entry[] table
②在经历过多次put之后。map.put(key1,value1);
首先调用的是key1所在的hashCode(),计算出Key1的值,此哈希值经过哈希算法之后,得到Entry数组存放的位置
如果在此位置上计算的数据为空,此时的key1-value1就会添加成功
如果此位置上有其他的元素b(或者链表的形式存在的多个元素),则比较元素key1和b中的hash值

如果hash值不同,则元素key1添加成功
如果hash值相同,则需要比较key1的所在类的equals()方法

equals()返回true,则key1添加成功
equals()返回false,则key1添加失败

在Hashmap中JDK8与JDK7的不同
①在new HashMap()的时候底层并没有创建一个长度为16的数组
②JDK8底层的数组是链表,而并非是Entry[]
③在首次使用的时候底层会创建长度为16的数组
④JDK8的底层是数组+链表+红黑树,当数组的某一个索引位置上的元素以链表的形式存放。
⑤当存放的数据个数>8且当前的数组的长度是>64时,索引位置上的数据改为使用红黑树存储

注意点:
HashMap的默认容量是16;默认的加载因子是0.75;扩充的临界值是12【16*0.75】

6.HashMap中的常用方法的应用

	public static void main(String[] args) {
		//1,创建HashMap
		HashMap<String, Double> menus = new HashMap<String, Double>();
		//2.添加数据
		menus.put("雪菜包子", 1.5);
		menus.put("萝卜包子", 1.5);
		menus.put("豆腐包子", 1.5);
		menus.put("猪肉粉条包子", 2.5);
		menus.put("牛肉包子", 3.0);
		System.out.println(menus);
		//3. 键值对数量
		System.out.println(menus.size());
		//4.根据key查询value
		System.out.println(menus.get("牛肉包子"));
		//5.是否包含键
		System.out.println(menus.containsKey("牛肉包子"));
		//6.是否包含值
		System.out.println(menus.containsValue(1.5));
		 //7.获取所有的key
		Set<String> keys = menus.keySet();
		System.out.println(keys);
		//8.获取所有的value
		Collection<Double> values = menus.values(); 
		System.out.println(values);

		//9.获取所有的键值对
		Set<Entry<String, Double>> entrySet = menus.entrySet(); 
		System.out.println(entrySet);
	}
HashMapHashTable之间的一些异同?
1.HashTable是线程安全的,HashMap是非线程安全的
2.Hashtable不允许null值(key和value都不可以),hashMap允许null3.二者的遍历方式大同小异,hashTable仅仅比HashMap多了一个elements方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值