Java Map

本文详细介绍了HashMap的数据结构、存储原理及常用操作方法。包括哈希表的实现机制、扩容策略、链表到红黑树的转换条件等核心内容。通过具体实例展示了如何使用HashMap存储和检索数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashMap


  • Map父接口
  • 特点:存储一对数据,无序、无下标,键值不可以重复,值可重复;允许用null或者Value作为key值
  • 方法:
  • (1) put(key,value)
  • (2) get(key)
  • (3) keySet*
  • (4) Collection values
  • (5) entrySet*

Set:

public class Demo01 {
    public static void main(String[] args) {
        // 创建Map
        Map<String, String> m1 = new HashMap<>();

        // 添加元素
        m1.put("1","zzk");
        m1.put("2","gyx");
        m1.put("3","sb");
        m1.put("4","2+3=gyxsb");
        System.out.println(m1);

        // 删除
        m1.remove("1");
        System.out.println(m1);

        // 遍历
        // 1 keySet
        Set<String> keyset = m1.keySet();
        for (String s : keyset) {
            System.out.println(s +"---"+m1.get(s));
        }
        // 2 entrySet
        for (Map.Entry<String, String> entry : m1.entrySet()) {
            System.out.println(entry.getKey() +"==="+entry.getValue());
        }

        // 判断
        System.out.println(m1.containsKey("1"));
        System.out.println(m1.containsValue("asd"));
    }
}

HashSet:

package com.mapDemo.hashMapDemo;

import com.setDemo.hashSetDemo.Person;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * HashMap【重点】:
 * 存储结构:哈希表(数组+链表+红黑树)
 * 使用 key 可 hashcode 和 equals 作为重复
 * 注意:
 * (1)默认初始容量是16,默认加载因子0.75
 * 方法:
 * (1)
 */
public class Demo02 {
    public static void main(String[] args) {
        HashMap<Student,String> students = new HashMap<>();

        students.put(new Student("zzk",20),"第一个学生");
        students.put(new Student("nzk",22),"第二个学生");
        students.put(new Student("czk",23),"第三个学生");
        students.put(new Student("gzk",24),"第四个学生");
        students.put(new Student("gzk",24),"第五学生");
        System.out.println(students);

        // 删除
        students.remove(new Student("czk",23),"第三个学生");
        System.out.println(students);

        // 遍历
        // 使用 keySet
        for (Student key : students.keySet()) {
            System.out.println(key+"===="+students.get(key));
        }
        // 使用entrySet
        Set<Map.Entry<Student, String>> et1 = students.entrySet();

        for (Map.Entry<Student, String> sse : et1) {
            System.out.println(sse.getKey()+"--------"+sse.getValue());
        }

        // 判断
        System.out.println(students.containsKey(new Student("gzk",24)));
        System.out.println(students.containsKey(new Student("g2",24)));
        System.out.println(students.isEmpty());

    }
}

源码总结:

  1. HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16。
  2. 当元素个数大于阈值(16*0.75 =12 ) 时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
  3. jdk1.8 当每个链表长度大于8,并且数组元素个数大于64时,会调整为红黑树,目的提高执行效率。
  4. jdk1.8 当链表长度小于6时,调整成链表。
  5. jdk1.8 以前,链表时头插入,jdk1.8以后时是尾插入。

HashTable

  • JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value

Properties

  • Hashtable的子类,要求key和value都是String。通常用于配置文件的读取

TreeMap

  • 实现了SortedMap接口(是Map的子接口),可以对key自动排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值