Java Map接口

* Map接口:


 * 1、键值对存储一组对象
 * 2、Key不能重复(唯一)Value可以重复
 * 3、具体的实现类:HashMap TreeMap Hashtable LinkedHashMap
 * 4、HashMap与HashTable有什么区别?

package com.chen;

import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * Map接口:
 * 1、键值对存储一组对象
 * 2、Key不能重复(唯一)Value可以重复
 * 3、具体的实现类:HashMap TreeMap Hashtable LinkedHashMap
 * 4、HashMap与HashTable有什么区别?
 * 
 * 
 * @author 11010
 *
 */
public class MapDemo {
	/**
	 * LinkedHashMap是HashMap的子类,由于HashMap不能保证顺序恒久不变,此类使用一个双重链表来维护
	 * 元素添加的顺序。间接来保证有序
	 */
	private static void linkedHashMap() {
		Map<String,String> table = new LinkedHashMap<>();
		table.put("one", "Tom");
		table.put("two", "Linda");
		table.put("three", "Bob");
		table.put("four", "Jacks");
		
		table.forEach((key,value)->System.out.println(key+"->"+value));
	}
	
	
	/**
	 * JDK1.0开始
	 * 基于哈希表实现(数组+链表)
	 * 默认数组大小为11,加载因子为0.75
	 * 扩充方式:原数组大小<<1+1 (乘2加1)
	 * 用在多线程访问时,线程安全的
	 */
	private static void hashTable() {
		Map<String,String>table = new Hashtable<>();
		table.put("one", "Tom");
		table.put("two", "Linda");
		table.put("three", "Bob");
		table.put("four", "Jacks");
		
		table.forEach((key,value)->System.out.println(key+"->"+value));
	}
	
	/**
	 * HashMap的实现原理
	 * 1、基于哈希表(数组+链表+二叉树(红黑树))1.8JDK
	 * 2、默认加载因子为0.75,默认数组大小是16
	 * 3、把对象存储到哈希表中,如何存储?
	 *   把Key对象通过hash()方法计算hash值,然后用这个hash值对数组长度取余数(默认16),来决定该对Key对象
	 *   在数组中存储的位置,当这个位置有多个对象时,以链表结构存储,JDK1.8后,当链表长度大于8时,链表将转换为
	 *   红黑树结构存储
	 *   这样的目的是为了取值更快,存储的数据量越大,性能的表现越明显
	 * 4、扩充原理:当数组的容量超过了75%,那么表示该数组需要扩充,如何扩充?
	 *   扩充的算法是:当前数组容量<<1(相当于是乘2),扩大1倍,扩充次数过多,会影响性能,每次扩充表示哈希表
	 *   重新散列(重新计算每个对象的存储位置),我们在开发中尽量减少扩充次数带来的性能损耗、
	 * 5、线程不安全,适合在单线程中使用
	 */
	private static void hashMap() {
		Map<Integer,String> map = new HashMap<>();
		map.put(1, "Tom");
		map.put(2, "Jack");
		map.put(3, "Vince");
		map.put(4, "Ben");
		map.put(5, "Logic");
		System.out.println("size="+map.size());
		//从MAP中取值
		System.out.println(map.get(1));//通过Key去取Value;
		
		//map的遍历
		//1 遍历Entry
		Set<Entry<Integer,String>> entrySet = map.entrySet();
		for(Entry e:entrySet) {
			System.out.println(e.getKey()+"->"+e.getValue());
		}
		System.out.println("_______________________");
		//2 遍历键
		Set<Integer> keys = map.keySet();
		for(Integer i:keys) {
			String value = map.get(i);
			System.out.println(i+"->"+value);
		}
		System.out.println("_______________________");
		//3 遍历值
		Collection<String> values = map.values();
		for(String value : values) {
			System.out.println(value);
		}
		System.out.println("_______________________");
		//4、foreach
		map.forEach((key,value)->System.out.println(key+"->"+value));
		//查找是否有这个Key 返回true false
		System.out.println(map.containsKey(7));
		//repalce 替换指定Key的Value
		map.replace(2, "chen");
		map.forEach((key,value)->System.out.println(key+"->"+value));
	}

	public static void main(String[] args) {
//		hashMap();
		hashTable();
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值