* 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();
}
}