JavaSE——集合(五)Collection子接口Map

JavaSE——集合(五)Map接口

    • 1、Map结构
    • 2、Map常用方法
    • 面试题

1、Map结构

---------Map:双列数据,类似于函数
-----------------HashMap:作为Map的主要实现类,线程不安全,效率高,存储null的key和null的value。数组+链表(jdk7之前),数组+链表+红黑树(jdk8)
-----------------------LinkedHashMap:保证按照添加顺序进行遍历,对于频繁的遍历操作,此类执行效率高于HashMap
-----------------TreeMap:按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序或者定制排序
-----------------Hashtable:古老的实现类,线程安全效率低,不能存储null的key和null的value
------------------------Properties:常用来处理配置文件,key和value都是String类型

JavaSE——集合(五)Collection子接口Map_第1张图片注意
Map中的key是无序的,不可重复的,所以使用set存储,因此需要重写equals和hashCode(),value是无序的。可重复的,用Collection存储需要重写equals类

2、Map常用方法

//put()添加
HashMap map = new HashMap();
map.put("AA",1);
map.put("BB",1);
//put()修改
map.put("AA",2);
System.out.println(map);
//putAll()
HashMap map1 = new HashMap();
map1.put("CC",1);
map1.put("DD",2);
map.putAll(map1);
System.out.println(map);
//remove(key)
Object value=map.remove("BB");
System.out.println("移除的值为: "+value);
System.out.println(map);
//clear()
//        System.out.println(map);
//        map.clear();
//        System.out.println(map);

//get(key)
System.out.println(map.get("CC"));
//containsKey(key)
System.out.println(map.containsKey("CC"));
//containsValue(value)
System.out.println(map.containsValue("CC"));
//size()
System.out.println(map.size());
//isEmpty()
//equals()

//遍历所有key
//方法1
for (Object o : map.keySet()) {
    System.out.println(o);
}
//方法2
Set set = map.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

//遍历所有value
Collection values = map.values();
it = values.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

//遍历所有的key-value
//方式1
Set set1 = map.entrySet();
it = set1.iterator();
while(it.hasNext()){
    Object entry = it.next();
    Map.Entry e=(Map.Entry) entry;//注意Entry接口的使用
    System.out.println("得到的键是: "+e.getKey());
    System.out.println("得到的值是: "+e.getValue());
}
//方式2
for (Object o : map.keySet()) {
    System.out.println("方式2得到的值: "+map.get(o));
}

properties的应用场景

首先需要在工程下创建.properties文件
JavaSE——集合(五)Collection子接口Map_第2张图片JavaSE——集合(五)Collection子接口Map_第3张图片

public class test {

    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        FileInputStream f = new FileInputStream("jdbc.properties");
        properties.load(f);
        String name=properties.getProperty("name");
        System.out.println("name= "+name);
    }
}

中文乱码问题
按照下列设置
JavaSE——集合(五)Collection子接口Map_第4张图片

面试题

1.HashMap的底层实现原理

HashMap在实例化以后,底层创建了长度是16的一维数组Entry[] table.
可能已经执行了多次put() map.put(key1,value1)
首先,调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法后得到在Entry数组中存放的位置
如果此位置上的数据为空,此时entry添加成功
如果此位置上的数据不为空,意味着此位存在一个或多个数据(以链表的形式存放),比较key1和已经存在的多个数据的哈希值
如果哈希值不同,则添加成功,如果哈希值相同,继续调用key1的equal()方法进行比较,如果返回false则添加成功,反之使用新的value值替换旧的value值。
注意:数据是以链表的方式加入的,默认的扩容方式是,当超出临界值时(0.75倍的16)且要存放的位置非空,扩容到原来的2倍,扩容之后原来的数据放入新的数组中,可能原来形成的链表被破坏,会存放在数组上面。

jdk8 相较于jdk7底层实现的不同,
1.new HashMap()底层没有创建一个长度为16的数组
2.jdk8底层的数组是Node[]而不是Entry[]
3.首次使用put()方法时,底层创建长度为16的数组
4.jdk7底层解狗只有:数组+链表,jdk8中是数组+链表+红黑树
5.当数组的某一个索引位置上的元素以链表的形式存在的数据个数>8,且当前数组的长度>64时,此时此索引位置上的所有数据改为红黑树存储。

JavaSE——集合(五)Collection子接口Map_第5张图片
为什么要提前扩容呢?因为要保证形成链表的情况最少

2.HashMap和Hashtable的异同
3.CurrentHashMap和Hashtable的异同

你可能感兴趣的:(语言学习,java,链表)