package java1;
import org.junit.Test;
import java.util.*;
/**
* 一、map实现类的实现情况:
* |---Map接口:双列数据,存储具有key-value特点的数据,类似于函数
* |---HashMap:作为map的主要实现类,线程不安全的,效率高:存储null的key和value
* |---LinkedHashMap:保证在遍历map元素时按照添加的顺序实现遍历
* 原因:在原有的HashMap底层结构基础上,添加了指针,指向前驱和后继
* 对于频繁的遍历操作,此类执行的效率高于HashMap
* |---TreeMap:保证按照添加的key value进行排序,实现排序遍历(按照key来排序)
* |---Hashtable:古老的实现类,线程安全的,效率低
* |---Properties:常用来处理配置文件,key和value都是string类型
*
*
* HashMap的底层:数组+链表(jdk 7之前)
* 数组+链表+红黑树(jdk 8)
*
* 面试题:
* 1.HashMap的底层实现原理?
* 2.HashMap和Hashtable的异同?
* 3.CurrentHashMap和Hashtable的异同?
*
*
* 二、map的结构理解:
* map中的key是无序的,不可重复的,即是使用set来存储key--->要求key所在的类
* 要重写equals方法和hashcode方法
* map中的value是无序的,可重复的,是使用collection存储的--->value的所在类
* 要重写equals
* 一个键值对构成了一个entry对象
* map中的entry:无序的,不可重复的,使用set存储
*三、HashMap的底层实现原理:以jdk 7 为例:
* HashMap map= new HashMap();
* 在实例化以后,底层创建了长度为16的数组 Entry[] table;
* map.put(key1,value1);
* 首先计算Key1的哈希值,经过算法计算以后,得到在entry数组中的存放位置
* 如果此位置上的数据为空,则key1-value1添加成功
* 如果此位置上的数据不为空,比较当前key1和当前位置数据的哈希值,如果key1的
* 哈希值和已存在的数据哈希值都不一样,就不用调用equals,键值对就直接添加成功
* key1和某一个数据的哈希值相同时,调用equals方法,如果不同则添加成功,如果相同
* 则使value1去替换当前key的value值(即:具有修改功能)。
*
* 默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来。
*
* jdk 8 相较于 jdk 7 在底层实现原理的不同:
* 1.new HashMap();//底层没有创建Entry数组
* 2.jdk 8 底层的数组是Node类型的数组,而不是Entry类型的。
* 3.首次调用put方法的时候底层才会创建长度为16的数组
* 4.jdk 7 的底层结构只有数组+链表,在jdk 8 当中有数组+链表+红黑树
* 当数组的某一个索引位置上的元素以链表形式存在的数据个数>8且当前
* 数组的长度超过64了,此时,此索引位置上的所有数据改为使用红黑树
*
*
* DEFAULT_INITIAL_CAPACITY:HashMap的默认容量:16
* DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
* threshold:扩容的临界值=容量*填充因子:16*0.75=12
* TREEIFY_THRESHOLD:Bucket中链表长度大于默认值就转化为红黑树:8
* MIN_TREEIFY_CAPACITY:Node被树化的时候最小的hash表容量:64
*
*
* 四、LinkedHashMap的实现原理(了解)
*
* 五、Map接口中定义的方法
*
*
* @author Baobao
* @create 2021-08-15 17:10
*/
public class MapTest {
@Test
public void test01(){
/*
添加,删除,修改操作:
*/
Map map=new HashMap();
map.put("AA",123);
map.put(45,123);
map.put("BB",123);
//修改
map.put("AA",87);
System.out.println(map);
Map map1=new HashMap();
map1.put("CC",123);
map1.put("DD",123);
map.putAll(map1);
System.out.println(map);
//remove(Object key)
Object value = map.remove("CC");
System.out.println(value);
System.out.println(map);
map.clear();//与map=null;不一样
System.out.println(map.size());
}
@Test
public void test02(){
/*
元素查询的操作:
*/
Map map=new HashMap();
map.put("AA",123);
map.put(45,123);
map.put("BB",56);
//Object get(Object key)
System.out.println(map.get(45));
boolean isExist = map.containsKey("BB");
boolean containsValue = map.containsValue(123);
}
@Test
public void test03(){
Map map=new HashMap();
map.put("AA",123);
map.put(45,123);
map.put("BB",56);
//遍历所有的key集:
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//遍历所有的value集:
Collection values = map.values();
for(Object obj:values){
System.out.println(obj);
}
//遍历所有的key-value
Set set = map.entrySet();
Iterator iterator1 = set.iterator();
while (iterator1.hasNext()){
Object obj=iterator1.next();
Map.Entry entry=(Map.Entry)obj;
System.out.println(entry.getKey()+"--->"+entry.getValue());
}
}
}
Java map通过key重新赋值 java map可以重复吗
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java交换map的key和value值
Java交换map的key和value值
键值对 Java System -
java map循环中remove
java map循环中remove
迭代 Java 迭代器 -
java 可以存重复key的map java可以重复声明吗
多态 定义:是指一个多态引用可以指向多个类的实列 ; java通过方法重写和方法重载来实现多态 extends &nbs
java 可以存重复key的map Java 多线程 thread 父类