首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java - HashMap不能使用新对象作为搜索关键字

Java中的HashMap是一种基于哈希表实现的数据结构,用于存储键值对。它使用键的哈希码来确定存储位置,从而实现快速的插入、删除和查找操作。

在HashMap中,搜索关键字是通过键的哈希码来确定存储位置的。当我们使用HashMap的get()方法来搜索一个键时,它会首先计算该键的哈希码,然后根据哈希码找到对应的存储位置,最后返回该位置上的值。

由于HashMap使用哈希码来确定存储位置,因此搜索关键字必须具有正确的哈希码。如果我们使用一个新对象作为搜索关键字,它的哈希码可能会与之前存储的键的哈希码不同,导致无法正确找到对应的值。

为了正确使用HashMap,我们应该遵循以下几点:

  1. 键的哈希码应该是不可变的:如果键的哈希码发生变化,那么在HashMap中就无法找到对应的值了。因此,我们在实现自定义类作为HashMap的键时,应该确保哈希码是基于键的不可变属性计算得出的。
  2. 重写hashCode()方法和equals()方法:为了保证HashMap能够正确地根据键的哈希码找到对应的值,我们需要在自定义类中重写hashCode()方法和equals()方法。hashCode()方法用于计算键的哈希码,equals()方法用于判断两个键是否相等。
  3. 不要使用可变对象作为键:如果我们使用可变对象作为键,并且在将其放入HashMap后修改了对象的属性,那么该键的哈希码可能会发生变化,导致无法正确找到对应的值。

总结起来,HashMap不能使用新对象作为搜索关键字,因为新对象的哈希码可能与之前存储的键的哈希码不同,导致无法正确找到对应的值。为了正确使用HashMap,我们应该遵循上述几点,并确保键的哈希码是不可变的、重写了hashCode()方法和equals()方法,并且不使用可变对象作为键。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

(七)Java并发学习笔记--并发容器(J.U.C)

比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。   数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

18920

Java哈希表以及哈希冲突

,若关键码相等,则搜索成功 该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(HashTable)(或者称散列表) 冲突 不同关键字通过相同哈希哈数计算出相同的哈希地址...避免冲突 *由于我们哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,这就导致一 个问题,冲突的发生是必然的,但我们能做的应该是尽量的降低冲突率。*而不能完全避免哈希冲突。...,因此搜索的速度比较快 平方取中法–(了解) 假设关键字为1234,对它平方就是1522756,抽取中间的3位227作为哈希地址; 再比如关键字为4321,对它平方就是18671041,抽取中间的3位...:闭散列和开散列 解决哈希冲突两种常见的方法是:闭散列和开散列 哈希表和 java 类集的关系 HashMap 和 HashSet 即 java 中利用哈希表实现的 Map 和 Set java使用的是哈希桶方式解决冲突的...所以如果要用自定义类作为 HashMap 的 key 或者 HashSet 的值,必须覆写 hashCode 和 equals 方 法,而且要做到 equals 相等的对象,hashCode 一定是一致的

1.1K20
  • 面试官扎心一问:知道 CopyOnWriteArrayList 吗?

    比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 「数据一致性问题」。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    35520

    面试官扎心一问:知道 CopyOnWriteArrayList 吗?

    比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 「数据一致性问题」。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    27820

    技术总监:你个P7, CopyOnWriteArrayList 都没听过,

    例如白名单,黑名单,商品类目的访问和更新场景,假设我们有一个搜索网站,用户在这个网站的搜索范围,输入关键字搜索内容,,但是某些关键字例外被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    28330

    技术总监:你个P7 连 CopyOnWriteArrayList 都没听过!我:确实没听过

    例如白名单,黑名单,商品类目的访问和更新场景,假设我们有一个搜索网站,用户在这个网站的搜索范围,输入关键字搜索内容,,但是某些关键字例外被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    23830

    面试官:换人!赶快换人!连 CopyOnWriteArrayList 都没听过!

    比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。 当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...「内存占用问题」,因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 「数据一致性问题」,CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    31900

    面试官:换人!赶快换人!连 CopyOnWriteArrayList 都没听过!

    比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。 当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...「内存占用问题」,因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 「数据一致性问题」,CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    30520

    漫谈原型模式

    1.2 最快速地clone一个HashMap散列表 以如何最快速地clone一个HashMap散列表为例。 当需要将数据库存储的搜索关键字信息存入内存以备后续需求调用。...可以直接使用Java语言中提供的 HashMap 容器来实现。其中,HashMap 的 key 为搜索关键词,value 为关键词详细信息(比如搜索次数)。...当另一个系统B同时需要操作该关键字信息数据时,为了保证系统 A 中数据的实时性,只需要在系统 A 中,记录当前数据的版本 Va 对应的更新时间 Ta,从数据库中捞出更新时间大于 Ta 的所有搜索关键词,...当存在更新的需求,如1、 任何时刻,系统 A 中的所有数据都必须是同一个版本的;2、同时在更新内存数据的时候,系统 A 不能处于不可用状态,也就是不能停机更新数据时,解决方案如下:把正在使用的数据的版本定义为...对于需要更新的 SearchWord 对象,我们再使用深度拷贝的方式创建一份对象,替换 newKeywords 中的老对象 需要更新的数据是很少的。

    41820

    面试:知道 CopyOnWriteArrayList 吗?

    比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...,而旧容器的对象还在使用,所以有两份对象内存)。...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 「数据一致性问题」。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    18510

    【面试虐菜】—— JAVA面试题(1)

    面向对象编程的三大特性是什么,请简要阐述 (1).继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个类可以从现有的类中派生,这个过程称为类继承。...Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 5. ...,效率上可能高于HashtableJAVA中文站社区门户oC)| g| ax ,HashMap允许将Null作为一个entryde key 或者value,而Hashtable不允许 HashMap把...如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。    ...1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

    79590

    Java基础

    当创建一个String对象时,它的值就不能再被修改。如果对String对象进行操作(如拼接、替换等),实际上是创建了一个的String对象。...Java8有哪些特性Java 8引入了许多的特性和改进,以下是其中一些主要的特性:Lambda表达式:Lambda表达式是一种的语法,简化了匿名内部类的使用,使得代码更加简洁和易读。...JAVA static 关键字Java中,使用 static 关键字修饰的方法和不使用 static 关键字修饰的方法有以下区别:静态方法(使用 static 修饰):属于类本身,不依赖于类的实例对象...键和值可以是任意非空对象,但键不能重复(根据equals()和hashCode()方法进行判断)equals()和hashCode()方法:为了正确地使用HashMap,键对象必须正确地实现equals...链表转红黑树:当链表转换为红黑树时,首先会创建一个的红黑树节点作为根节点,并将链表的元素逐个转移到红黑树中。在转移过程中,会根据键的哈希值进行比较,按照二叉搜索树的规则将节点插入到红黑树的合适位置。

    22820

    JAVA面试备战(二)--集合

    Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。...也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。...Hashcode HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性 HashMap的底层实现 JDK1.8...当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。...因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。 场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

    48710

    Map和Set及哈希--的奥秘(详解)

    4.搜索java 类集的关系: 1.TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的二叉搜索树,...Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap 2. Map中存放键值对的Key是唯一的,value是可以重复的 3....TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的 (4) . Set最大的功能就是对集合中的元素进行去重 (5)....HashMap 和 HashSet 即 java 中利用哈希表实现的 Map 和 Set 2. java使用的是哈希桶方式解决冲突的 3. java 会在冲突链表长度大于一定阈值后...所以如果要用自定义类作为 HashMap 的 key 或者 HashSet 的值,必须覆写 hashCode 和 equals 方法,而且要做到 equals 相等的对象,hashCode 一定是一致的

    9510

    java面试题汇总-基础篇

    3.接口的子类是实现接口,关键字是implements,抽象类的子类是继承,关键字是extends。 4.接口不能定义成员变量,只能定义常量。抽象类可以定义成员变量。...equals()方法属于Object对象的,所以比较基础数据类型是不能使用equals()。必须使用==。 在默认情况下,equals()与==是一样的,都是比较内存地址。...Java 泛型是 JDK1.5中引入的一个特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。...OutOfMemoryError: Java heap space。在创建对象时, 堆内存中的空间不足以存放新创建的对象时发生。...会使用可达性分析算法进行判断,原理是从一系列被称为GC ROOT的对象开始,向下搜索搜索走过的路径称为引用链,当一个对象到GC ROOT之间没有引用链,说明这个对象不可用,那么就会被GC回收。

    79510

    Docker学习笔记之Copy on Write机制

    这样,在对对象执行读操作的时候,内存数据不发生任何变动,直接执行读操作;而在对对象执行写操作时,将真正的对象复制到的内存地址中,并修改对象的内存映射表指向这个的位置,并在的内存位置上执行写操作...比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。...这些不能搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建对象添加到容器里...或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap。 数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

    1.8K40

    来了,Facebook APP Feed流的内存优化实践

    作为一个解决方案,可以使用基本数据类型而不是对象类型的Set实现,但是结果并不像我们预期的那么简单。 目前的解决方案 有几个现有的Java库为原始数据类型提供了Set实现。...我们考虑是否可以创建一个的Set实现,并针对Android进行优化。在Java的HashSet中,使用单个HashMap来实现一个相对简单的实现。...意味着将其添加到内部HashMap,其中对象关键字,而HashSet的实例是该值。...要检查对象成员身份,HashSet将检查其内部HashMap是否包含对象作为键。可以使用Android优化的map和相同的原则来实现HashSet的替代方案。...使用的LongArraySet类和类似的IntArraySet作为原始int数据类型,我们能够在整个应用程序中减少大量的对象内存分配。 这个案例研究表明了我们选择数据结构的重要性。

    1K30

    Java 知识点总结篇(3)

    :一个类可以实现一个或多个接口,实现接口使用implements关键字。...,是不可变的,所谓的修改其实是创建了对象,所指向的内存空间不同; 每次new一个字符串就是产生了一个对象,即便两个字符串的内容相同,使用"=="比较时也为false,若只需比较内容是否相同,应使用...parse()方法时可能会出现转换异常,即ParseException,因此需要进行异常处理; 使用Date类时需要导入java.util包,使用SimpleDateFormat时需要导入java.text...; 有的集合接口,提供映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型; 数组与集合区别 数组长度固定,集合长度可变; 数组只能通过下标访问元素,类型固定...类 HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现; HashMap中的Entry对象时无序排列的; Key值和value值都可以为null,但是一个HashMap只能有一个

    97030

    作为Java开发,你一定要了解面向对象编程中为什么要使用get和set方法

    一、由一个问题开始 在进行面向对象开发中,在编写一个Class的时候,会定义这个Class的属性(字段)为Private,然后去生成对应的get和set方法,通过这样的方式去对属性进行操作,那你有没有思考过为什么要这样做呢...protected 可以被所有子类访问,可以被同一包中的所有类访问 子类没有在同一包中也可以访问 private 只能够被当前类的方法访问 缺省无访问修饰符 可以被同一包中的所有类访问 如果子类没有在同一个包中,也不能访问...由表格可知,设置成 private 只能够被当前类访问, 因为其他类不能够访问这个类中private 定义的属性,也就不能进行更改操作。...但是很多时候,一个类中的属性是需要被其他类所使用(获取值/修改值)的,那么其他类要使用这个类中私有属性,当前类就必须提供可供外部类使用的方法,如公共的public 的方法,此时外部的其他来就可以通过提供的方法来操作私有的属性了...使用类的人不关心你的类中有什么,只关心类提供了什么功能 所以设计类的时候要尽量不提供public的成员变量,最好一个都没有,只提供接口 提供类的人要尽量将类中有什么隐藏起来,只告诉使用者你能做什么 2、

    61130
    领券