宝安区做外贸网站的公司百度网址提交
一、Map
之前学习的Collection集合体系是单列集合,即一次存取一个元素
Map是双列集合,一次存取一对元素,这一对儿称为键值对,key-value,且key是映射到value
所谓键映射到值,是指只能通过键找到值,无法通过值找键
Map中键不能重复!值允许重复
Map中一个键,只能对应一个值
Map是根接口,常用有2个实现类
HashMap
TreeMap
二、HashMap【重点】
2.1 介绍
HashMap是Map的实现,也是键不能重复,值可以重复,只能通过键找值
底层是使用哈希表实现,所以存储的元素是无序的
允许存储null值,null键
不保证线程安全
Hashtable是线程安全的,不允许null值null键,除此之外与HashMap一样
2.2 api演示
public class Demo1 {
public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>( );map.put(1,"A");map.put(2,"B");map.put(3,"C");map.put(4,"D");
// 判断是否包含该键System.out.println(map.containsKey(4));// 判断是否包含该valueSystem.out.println(map.containsValue("D"));
// get(Object key) ,通过键找值的String s = map.get(1);System.out.println("s = " + s);
System.out.println("删除前:" + map );// V remove(Object key),通过键删除整个键值对String v = map.remove(2);System.out.println("v = " + v);System.out.println("删除后:" + map );
// 集合大小System.out.println(map.size() );
// 集合清空map.clear();
// 集合为空System.out.println(map.isEmpty( ));}
private static void show1() {// 创建空mapHashMap<Integer, String> map = new HashMap<>( );// 存储// map.put(33,"C");// map.put(33,"C");// map.put(11,"A");// map.put(44,"D");// map.put(22,"B");// map.put(55,"D");
// 存储元素无序,key不允许重复,value可以重复// System.out.println(map );
// put方法的返回值,返回的是该键所对应的旧值,如果没有返回nullString a = map.put(1, "A");System.out.println("a = " + a);
String a2 = map.put(2, "B");System.out.println("a2 = " + a2);
String a222 = map.put(2, "BBB");// 这个BBB会将之前的B覆盖System.out.println("a222 = " + a222);
System.out.println(map);}
}
2.3 map的遍历
Map没有直接遍历的手段,但是提供了三种Collection的方式来查看Map,分别
键集(keySet),即集合中只有键
值集(values),即集合中只有值
键值映射集(entrySet),即集合中键值都有
public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>( );map.put(1, "A");map.put(2, "B");map.put(3, "C");map.put(4, "D");
// 键集Set<Integer> keySet = map.keySet( );for (Integer key : keySet) {System.out.println(key);}
// 值集Collection<String> values = map.values( );for (String v : values) {System.out.println(v);}
// 键值映射集Set<Map.Entry<Integer,String>> entrySet = map.entrySet();for (Map.Entry<Integer,String> entry: entrySet) {Integer key = entry.getKey( );String value = entry.getValue( );System.out.println(key+"-->"+value );}}
Entry,是Map的内部类,代表的是键值项,即一个Entry对象代表一个键值对对象
这个Entry类中提供了单独获得键,和值的方法 ,例如 getKey(),getValue
2.4 去重原理
HashMap只有键能去重
将元素存储在键上,先调用元素的hashcode方法,判断地址值是否相同
如果地址值不同,直接存储
如果地址值相同,再调用equals方法
调用equals方法,如果
结果是true,即相同,不存储
结果是false,即不相同,即存储
2.5 扩容原理[重点]
HashMap初始容量,默认是16,也可以通过构造方法设置初始容量,但是一般不用改
还有一个影响性能的,是加载因子,默认值是0.75
当存储的元素> 0.75(加载因子) * 16(初始容量) ,就要扩容,扩容成2倍
但是,JDK1.8以后,HashMap底层变成有hash表(数组)+链表+红黑树实现
详情: 参考其他资料
这样底层设计的目的是为了查询更快!!!
三、TreeMap
TreeMap,是双列集合,也是键不允许重复
底层是红黑树,会根据存储的键默认进行自然顺序排序,也可以根据创建TreeMap时传入的比较器进行排序
它与我之前写过的treeset几乎一样,这里不再过多介绍
四、LinkedHashMap
LinkedHashMap,保证存储的元素有序(遍历顺序和插入顺序一致),且去重
public static void main(String[] args) {LinkedHashMap<Integer, String> lhm = new LinkedHashMap<>( );lhm.put(3,"C");lhm.put(2,"B");lhm.put(4,"D");lhm.put(5,"E");lhm.put(4,"D");lhm.put(1,"A");lhm.put(1,"A");
System.out.println(lhm );
}