当前位置: 首页 > 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() {}
}

http://www.mrgr.cn/news/15908.html

相关文章:

  • 十分钟弄懂最快的APP自动化工具uiautomator2
  • 【面试经验】美团基础研发部产品经理面试经验
  • 如何五分钟使用 Cocos Creator 快速部署 TON 游戏(第一部分)
  • 去除重复字母(LeetCode)
  • 您下一款项目管理工具何必是它,10款软件推荐
  • Google play应用老包突然被暂停和删除了,什么原因?
  • IPython 使用技巧整理
  • 基于医学图像配准软件 ANTs(Advanced Normalization Tools)提取脑图像数值并与临床量表计算相关
  • 基于Spring的Uniapp自动更新实现方法
  • Vue -- 总结 02
  • 202408830使用python3给BGR3的裸图加上BMP图的文件头
  • 第 8 章 数据的家——MySQL的数据目录
  • 【Shell】在 Linux 中,如何查看服务器上僵尸进程的数量
  • DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3)
  • 视觉Mamba综述——Visual Mamba: A Survey and New Outlooks论文总结
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
  • 【C++ 面试 - 内存管理】每日 3 题(十)
  • 安嘉空间:智慧科技守护空间健康
  • 华为云征文|Flexus云服务器X,云上性能新飞跃,开启业务增长新纪元
  • 快速掌握GPTEngineer:用AI创建网页应用的实用教程