IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 关于哈希表 -> 正文阅读

[数据结构与算法]关于哈希表

package com.javase.map.hashmap;

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

/**
 * 关于HashMap:
 *     1.HashMap集合的底层是哈希表/散列表的数据结构。
 *     2.哈希表是数组和单向链表的结合体,充分发挥了它们各自的优点。
 *     3.HashMap集合底层源代码:
 *        public class HashMap{
 *            Node<K,V>[] table;//说明底层是一个一维数组
 *            //静态内部类HashMap.Node
 *            static class Node<K,V>{
 *                final int hash;//哈希值:是key的hashCode()方法执行的结果
 *                final K key;//存储到Map集合中的那个key。
 *                V value;//存储到Map集合中的那个value
 *                Node<K,V> next;//下一个节点的内存地址。
 *            }
 *        }
 *        哈希表/散列表:就是一维数组,在这个一维数组中每一个元素都是一个单向链表(数组和链表的结合体)
 *    4.最主要需要掌握的是:
 *        map.put(k,v);
 *        v = map.get(k);
 *        以上两个方法的实现原理,是必须掌握的。(哈希表的数据结构和put和get执行原理见下图)
 *    5.HashMap集合的key部分特点:
 *        无序不可重复
 *        为什么无序?因为元素不一定放到哪个单向链表上。
 *        不可重复是如何保证的? equals()方法保证HashMap集合的key不可重复。如果key重复了,value会覆盖。
 *
 *        放到HashSet集合中的元素实际上是放到了HashMap集合的key部分了,
 *        所有HashSet和HashMap集合中的元素都需要重写hashCode()和equals()方法
 *    6.假设将所有的hashCode()方法返回值固定为某个值,哈希表会变成单向链表,这种情况我们称为:散列分布不均匀。
 *      假设将所有的hashCode()方法返回值都设定为不一样的值,哈希表会变成一维数组,就没有了链表的概念。也叫散列分布不均匀。
 *
 *      若要散列分布均匀需要你重写hashCode()方法时有一定的技巧。
 *
 *    7.重点:HashSet集合中的元素和放到HashMap集合中key部分的元素需要同时重写hashCode()和equals()方法.
 *    8.HashMap集合的默认初始化容量是16,默认加载因子是0.75.
 *          意思是:当HashMap集合底层数组的容量达到75%的时候数组开始扩容。新容量是原容量的2倍。
 *
 *          需要记住:HashMap集合的初始化容量必须是2的倍数,这是官方推荐的,为了达到散列分布均匀,提高集合的存取效率。
 *
 *          有一个名词叫"哈希碰撞"意思是说:两个不相同的哈希值转换成的数组下标有可能相同。这种情况叫“哈希碰撞”
 *
 *    9.最终结论:放到HashSet与HashMap集合中的元素必须同时重写hashCode()与equals()方法。这两个方法不需要自己写,只需要利用
 *               IDEA工具自动同时生成即可。(无论你是否掌握哈希表是数据结构和原理,这一点必须记住)
 */
public class HashMapText {
    public static void main(String[] args) {
//        测试HashMap集合中key部分元素的特点(无序不可重复)
//        创建集合
//        集合中key部分元素采用Integer类型,Integer类型中hashCode()和equals()方法都已经重写了。
        Map<Integer,String> map = new HashMap();
//        向集合中添加元素
        map.put(11,"张三");
        map.put(55,"李四");
        map.put(77,"王五");
        map.put(66,"赵柳");
        map.put(66,"小明");

//        查看集合中元素的个数
        System.out.println(map.size());//4。key重复,value覆盖。因为有6666是重复的,所以对应的value被覆盖了
//        遍历集合
//        将Map集合转变成Set集合
        Set<Map.Entry<Integer,String>> set = map.entrySet();
//        使用增强for来遍历集合
        for (Map.Entry<Integer,String> node : set) {
            System.out.println(node.getKey() + "=" + node.getValue());
        }
    }
}
/*
输出结果:
        66=小明   取出顺序和存入顺序不同,叫无序;存放了两个"66",最后只保存了最后一个"66",前面的被后面的覆盖了这叫不可重复。
        55=李四
        11=张三
        77=王五
*/

?????????????????????????????????????????哈希表的数据结构和put和get执行原理

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:33:24  更:2022-12-25 11:38:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/21 4:55:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码