Java : 类集框架 (Map 接口概述) (HashMap + Hashtable)

Map 接口

public interface Map<K, V>

Collection 集合的特点是每次进行单个对象的保存, 那么如果现在要进行一对对象的保存(偶对象), 就只能是使用 Map 集合的完成, 所以Map 集合中会一次性的保存两个, 两个对象的关系 : key -> value 的结构, 那么这种结构最大的特点是可以通过key找到对应的value 内容.

Map 接口里面的常用方法

方法名称 类型 描述
1 public V put(K key, V value) 普通 向集合中追加数据
2 public V get(Object key) 普通 根据 key 取得对应的 value, 如果没有 返回 null
3 public Set<`K> keySet() 普通 取得所有 key 的信息, 返回set 类型, 则表示不能重复
4 public Collection<`V> values() 普通 取得所有 value 的信息, 返回Collection 类型, 则表示不关注重复与否
5 public Set<Map.Entry<K,V>> entrySet() 普通 将Map集合变为Set集合

Map 本身是一个接口, 要使用Map必须使用子类进行对象的实例化, 而子类有如下几个常用的:

  1. HashMap
  2. Hashtable
  3. TreeMap : 用于排序
  4. ConcurrentHashMap

HashMap 子类 (90%) (无序)

HashMap 是在使用Map 集合中最为常用的子类了, 下面先通过观察Map的使用操作:

范例: Map 基本处理

package com.beyond.nothing;

import java.util.*;

public class test {
    
    
    public static void main(String[] args) {
    
    
        Map<Integer,String> map = new HashMap<Integer, String>();
        map.put(1, "Hello");
        map.put(1, "World");  // key 重复
        map.put(2, "World2");
        System.out.println(map);
        System.out.println(map.get(1));  // 根据 key 取得数据
//        System.out.println(map.get(99));  // null

        //取得Map中所有key的值和value的值,  这种输出操作只是一种娱乐, 实际并不会使用
        Set<Integer> set = map.keySet(); // 取得所有的Key信息
        Iterator<Integer> iter = set.iterator();
        while (iter.hasNext()){
    
    
            Integer key = iter.next();
            System.out.println(key +"= "+map.get(key));

        }

    }

}

此种输出操作没有任何的实际意义, 只是为了对其做一个功能使用的说明, 因为这样的输出操作复杂度太高: N*N 的复杂度

面试题: 请解释 HashMap 原理

在数据量小的时候, HashMap 是按照链表模式存储的. 当数据量变大之后, 为了进行我们快速的查找, 那么我们会将这个链表变为红黑树(均衡二叉树), 用 hash 码作为数据的定位, 来进行保存.

Hashtable 子类 (1%)

JDK 1.0 提供有三大主要类: Vector, Enumeration, Hashtable.
Hashtable 是最早实现这种元偶对象数据结构, 后期设计的时候也让其于 Vector 类一样多实现了 Map 接口而已.

范例: 观察 Hashtable (无序)

package com.beyond.nothing;

import java.util.*;

public class test {
    
    
    public static void main(String[] args) {
    
    
        Map<Integer,String> map = new Hashtable<>();
        map.put(1, "Hello");
        map.put(1, "World");  // key 重复
        map.put(2, "World2");
        System.out.println(map);
        System.out.println(map.get(1));  // 根据 key 取得数据

        //取得Map中所有key的值,  这种输出操作只是一种娱乐, 实际并不会使用
        Set<Integer> set = map.keySet(); // 取得所有的Key信息
        Iterator<Integer> iter = set.iterator();
        while (iter.hasNext()){
    
    
            Integer key = iter.next();
            System.out.println(key +"= "+map.get(key));

        }
    }
}

HashMap 与 Hashtable 区别

  1. Hashtable 不允许值为空 (NPE)
  2. HashMap 可以设置

在这里插入图片描述
在这里插入图片描述

面试题: 请解释 HashMap 与 Hashtable 的区别

区别 HashMap Hashtable
推出版本 JDK 1.2 JDK 1.0
性能 异步处理, 性能高 同步处理处理, 性能相对较低
安全性 非线程安全 线程安全
存放 null 允许存储null Key 和 Value 都不允许为 null, 否则出现 NullPointerException

以后使用的时候多使用 HashMap

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Beyond_Nothing/article/details/113096008
今日推荐