hashmap简单理解

hashmap

1. 什么是 HashMap?

HashMap 是基于哈希表Map 接口是实现的。

此实现提供所有可选操作,并允许使用 null 做为值(key)和键(value)。

HashMap 不保证映射的顺序,特别是它不保证该顺序恒久不变。此实现假定哈希函数将元素适当的分布在各个桶之间,可作为基本操作(get 和 put)提供稳定的性能。

在jdk1.7中的HashMap是基于数组+链表实现的,在jdk1.8中的HashMap是由数组+链表+红黑树实现的。

2. HashMap的简单使用

哈希映射是java中的一种数据结构,它使用对象来检索另一个对象,第一个对象是键,第二个对象是值,它们是作为java.util包中的HashMap类来实现的

1.new初始化

1.可以通过调用其无参的构造函数来创建哈希映射:

HashMap map = new HashMap();
  1. 使用泛型来指明键和值的类,它们放在"<“和”>"字符内,而且类名使用逗号分隔,如下所示
HashMap<String, Integer> map = new HashMap<>();

2. put存储(写)

put(Object,Object)

通过调用带有两个参数(键和值)的put(Object,Object)方法,将对象存储到哈希映射中

map.put("Tom", 18);

这将一个键为Tom,值为18的条目存储到哈希映射中

3.get查询(取)

get(Object)

通过调用get(Object)方法,同时将键作为其唯一的参数,可以从映射中检索对象

HashMap<String, Integer> map = new HashMap<>();

map.put("Tom", 18);

int age = map.get("Tom");

System.out.println(age);

getOrDefault(Object,Object)

如果没有发现匹配该键值,get()方法将返回一个null,处理这一潜在问题的另外一种方式是调用getOrDefault(Object,Object),如果作为第一个参数的键没有被找到,则默认范围第二个参数,如下面的语句所示

HashMap<String, Integer> map = new HashMap<>();

map.put("Tom", 18);

int number = map.getOrDefault("Tom", -1);

System.out.println(number);

remove(Object key)

4. remove删除

通过调用remove(object)方法删除属性值,只要传入对应的key即可

HashMap<String,Integer> map = new HashMap<>();

map.put("Tom",18);

map.put("lisa",17);

System.out.println("调用remove方法之前 "+map);
//调用remove方法之前 {Tom=18, lisa=17}

map.remove("lisa");

System.out.println("调用remove方法之后 "+map);
//调用remove方法之后 {Tom=18}

5.foreach遍历

foreach()

下面用for循环语句使用条目集合和条目来访问map哈希映射中的所有键和所有值:

HashMap<String, Integer> map = new HashMap<>();

map.put("Tom", 18);

for (Map.Entry<String, Integer> entry : map.entrySet()) {

String key = entry.getKey();

Integer value = entry.getValue();

System.out.println("key:"+key);

System.out.println("value:"+value);

}

四种遍历的方法
https://blog.csdn.net/yaomingyang/article/details/78748130

6.containsKey 存在

containsKey(key)与containsValue(value)

通过containsKey(key)与containsValue(value)可以判断是否有键值,返回的是true或false的布尔值

HashMap<String, Integer> map = new HashMap<>();

map.put("Tom", 18);

System.out.println(map.containsKey("Tom"));

System.out.println(map.containsValue(2));

输出结果为:

true

false

7. isEmpty 空 判断

isEmpty()

该方法用于判断是否有哈希值,返回的是一个布尔值

HashMap<String, Integer> map = new HashMap<>();

map.put("Tom",18);

System.out.println(map.isEmpty());

3.简单实现方法

public interface Map < K, V >
    {
        V put(K k, V v);
        V get(K k);
        int size();
        interface Entry < K, V >
            {
                K getKey();
                V getValue();
            }

    }

public class HashMap < K, V > implements Map < K, V >
{
    Entry < K, V > table[] = null;
    int size = 0;

    //构造方法
    public HashMap()
        {
            table = new Entry[16];
        }

        /****     
         *  1、hash》hashcode》取模
         *  2、拿到下标值 对应Entry数组去找到当前下标值
         *  3、如果为空 直接存储》数组
         *  4、如果不为空 用链表
         *   @param k     * @param v     * @return
         *    */
    
    @Override 
    public V put(K k, V v)
    {
        int index = hash(k);

        Entry < K, V > entry = table[index];

        if(null == entry)
        {
            table[index] = new Entry < > (k, v, index, null);
            size++;
        }
        else
        {
            table[index] = new Entry < > (k, v, index, entry);
        }
        return null;
    }

    private int hash(K k)
        {
            int i = k.hashCode() % 16;
            //return i>=0?i:-i;        
            return Math.abs(i);
        }
        /***     
         * 1、k 去hash
         * 2、数组下标
         * * 3、当前下标 和我查询的下标值是否相等、
         * * 4、相等》直接放回 说明查询到
         * * 5、不相等》判断当前next是否为空
         * * 6、为空直接返回null 相等不为空 直接返回
         *  * @param k
         *  * @return     */
    
    @Override
    public V get(K k)
    {
        int index = hash(k);
        Entry < K, V > entry = table[index];
        if(null == entry)
        {
            return null;
        }
        return findValue(k, entry);
    }

    private V findValue(K k, Entry < K, V > entry)
    {
        if(k == entry.getKey() || k.equals(entry.getKey()))
        {
            return entry.getValue();
        }
        else
        {
            if(entry.next != null)
            {
                return findValue(k, entry.next);
            }
        }
        return null;
    }

    @Override

    public int size()
    {
        return size;
    }

    class Entry < K, V > implements Map.Entry < K, V >
    {
        K k;
        V v;
        int hash;
        Entry < K, V > next;
        public Entry(K k, V v, int hash, Entry < K, V > next)
        {
            this.k = k;
            this.v = v;
            this.hash = hash;
            this.next = next;
        }
        @Override
        public K getKey()
        {
            return k;
        }
        
        @Override
        public V getValue()
        {
            return v;
        }
    }
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » hashmap简单理解