当前位置: 首页 > news >正文

JAVA_12

JAVA_12

  • JAVA容器HashMap
    • 1.HashMap
    • 2.数据结构中由数组和链表来实现对数据的存储,他们各有特点。
    • 3.equals和hashcode通常需要一起重写!
    • 4.手写HashMap
    • 5.手写MyHashMap


JAVA容器HashMap

1.HashMap

底层实现采用了哈希表,这是一种非常重要的数据结构。
对于我们以后理解很多技术都非常有帮助(比如:redis 数据库的核心技术和 HashMap 一样),因此,非常有必要理解。

2.数据结构中由数组和链表来实现对数据的存储,他们各有特点。

(1)数组:占用空间连续。寻址容易,查询速度快。但是,增加和删除效率非常低。
(2)链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。
那么,我们能不能结合数组和链表的优点(即查询快,增删效率也高)呢?答案就是“哈希表”。哈希表的本质就是“数组+链表”

3.equals和hashcode通常需要一起重写!

equals为true,那么hashcode必须相等(主要就是为了HashMap。如果不这么规定,HashMap存取的时候就有悖论了!)

4.手写HashMap

package obj.src.lz;import java.util.HashMap;/*** 自定义map接口* @param <K>* @param <V>*/
public interface MyMap<K,V> {public void put(K key,V value);public V get(K key);public boolean containsKey(K key);public boolean containValue(V value);public void remove(K key);public int size();public boolean isEmpty();}

5.手写MyHashMap

package obj.src.lz;import java.util.Arrays;/*** 手工实现HashMap** @param <K>* @param <V>*/
public class MyHashMap<K, V> implements MyMap<K, V> {private static final int INITIAL_CAPACITY = 16;private int size;private Entry[] table;public MyHashMap() {table = new Entry[INITIAL_CAPACITY];}public static void main(String[] args) {MyMap<String, String> map = new MyHashMap<>();System.out.println(map.size());map.put("a", "123");map.put("a", "124");map.put("b", "1234");map.put("c", "12345");String b = map.get("b");System.out.println(b);map.remove("b");System.out.println(map);}@Overridepublic String toString() {
//        return "MyHashMap{" +
//                "size=" + size +
//                ", table=" + Arrays.toString(table) +
//                '}';StringBuilder sb = new StringBuilder();sb.append("[");//思考:怎么去掉最后一个,
//        for (Entry e : table) {
//            while (e != null) {
//                sb.append("{" + e.key + ":" + e.value + "},");
//                e = e.next;
//            }
//        }boolean first = true;for (Entry<K, V> e : table) {while (e != null) {if (!first) {sb.append(", ");}sb.append("{").append(e.key).append(":").append(e.value).append("}");first = false; e = e.next;}}sb.append("]");return sb.toString();}@Overridepublic void put(K key, V value) {int index = hash(key);Entry entry = new Entry(key, value, index, null);if (table[index] == null) {table[index] = entry;} else {Entry e = table[index];Entry last = e;while (e != null) {if (e.key.equals(key)) {e.value = value;//key相等,则覆盖valuereturn;}last = e;e = e.next;}last.next = entry;}size++;}public int hash(Object key) {int hashcode = key.hashCode();//返回int,可能时负数hashcode = hashcode < 0 ? -hashcode : hashcode;//        int index = hashcode % table.length;//早期jdk就是这样做的int index = hashcode & (table.length - 1);//位运算,效率高return index;}@Overridepublic V get(K key) {int index = hash(key);while (table[index] != null) {Entry e = table[index];while (e != null) {if (e.key.equals(key)) {return (V) e.value;}e = e.next;}}return null;}@Overridepublic boolean containsKey(K key) {return false;}@Overridepublic boolean containValue(V value) {return false;}@Overridepublic void remove(K key) {int index = hash(key);if (table[index] != null) {Entry e = table[index];Entry previous = null;while (e != null) {if (e.key.equals(key)) {if (previous == null) {//说明是第一个节点table[index] = e.next;} else {previous.next = e.next;}size--;}previous = e;e = e.next;}}}@Overridepublic int size() {return size;}@Overridepublic boolean isEmpty() {return size == 0;}
}class Entry<K, V> {K key;V value;int hash;Entry next;public Entry(K key, V value, int hash, Entry next) {this.key = key;this.value = value;this.hash = hash;this.next = next;}public Entry() {}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一文搞懂Window、PhoneWindow、DercorView、WindowManage
  • C#计算模数转换器(ADC)的参数DNL、INL、SNR等
  • SQL Server Service Broker故障排除
  • InternVL 多模态模型部署微调实践
  • 骁龙CPU简介
  • Java-数据结构-时间和空间复杂度 (ಥ_ಥ)
  • 耦合和内聚
  • MySQL——多表操作(四)(2)带 EXISTS 关键字的子查询
  • 大数据分析与挖掘技术实训室解决方案
  • 【杂谈】新能源和智能车
  • 如何使用 Go 语言开发微服务
  • 3.4.1 爬取王者荣耀英雄皮肤实战
  • 如何禁止电脑访问网站
  • 音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息
  • 微信小程序客户端与服务端进行WebSocket通信
  • Google 是如何开发 Web 框架的
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • const let
  • Laravel核心解读--Facades
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • php的插入排序,通过双层for循环
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 代理模式
  • 分享几个不错的工具
  • 前嗅ForeSpider教程:创建模板
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用SAX解析XML
  • 系统认识JavaScript正则表达式
  • ​MySQL主从复制一致性检测
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (1)Android开发优化---------UI优化
  • (1)Hilt的基本概念和使用
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (四)opengl函数加载和错误处理
  • (算法)N皇后问题
  • (转)树状数组
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • *** 2003
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net Core和.Net Standard直观理解
  • .net 获取某一天 在当月是 第几周 函数
  • .NET简谈设计模式之(单件模式)
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [001-03-007].第07节:Redis中的管道
  • [20150707]外部表与rowid.txt
  • [4]CUDA中的向量计算与并行通信模式
  • [Android]使用Android打包Unity工程
  • [CLickhouse] 学习小计