关键词:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * HashMap问题 * @author 15735400536 * 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals() * 使用ArrayList,如果元素是自定义的类,要做相等判断,就必须重写hashCode()和equals() */ public class HashMapTest public static void main(String[] args) Map<User,Doc> hashMap = new HashMap<User,Doc>(); hashMap.put(new User("mxh","mxh"), new Doc("mxh","mxh")); hashMap.put(new User("root","root"), new Doc("root","root")); hashMap.put(new User("admin","admin"), new Doc("admin","admin")); //再不重写hashCode方法和equals方法的情况下get()方法拿到的结果为null //原因: new一个新的对象时,地址变了,不能保证hash值和equals结果还是一样。所以取不到对应的value。 Object object = hashMap.get(new User("admin","admin")); System.out.println(object); List<Doc> list = new ArrayList<Doc>(); list.add(new Doc("三国演义","罗贯中")); list.add(new Doc("红楼梦","曹雪芹")); list.add(new Doc("水浒传","施耐庵")); list.add(new Doc("西游记","吴承恩")); //Doc类未重写hashCode()和equals()方法前,结果为false boolean result = list.contains(new Doc("水浒传","施耐庵")); System.out.println("list集合是否存在该元素: " + result); /** * 用户 * @author 15735400536 * */ class User private String username; private String password; public String getUsername() return username; public void setUsername(String username) this.username = username; public String getPassword() return password; public void setPassword(String password) this.password = password; public User(String username, String password) super(); this.username = username; this.password = password; @Override public int hashCode() final int prime = 31; int result = 1; result = prime * result + ((password == null) ? 0 : password.hashCode()); result = prime * result + ((username == null) ? 0 : username.hashCode()); return result; @Override public boolean equals(Object obj) if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (password == null) if (other.password != null) return false; else if (!password.equals(other.password)) return false; if (username == null) if (other.username != null) return false; else if (!username.equals(other.username)) return false; return true; /** * 文档 * @author 15735400536 * */ class Doc private String title; private String content; public String getTitle() return title; public void setTitle(String title) this.title = title; public String getContent() return content; public void setContent(String content) this.content = content; public Doc(String title, String content) super(); this.title = title; this.content = content; @Override public String toString() return "Doc [title=" + title + ", content=" + content + "]"; @Override public int hashCode() final int prime = 31; int result = 1; result = prime * result + ((content == null) ? 0 : content.hashCode()); result = prime * result + ((title == null) ? 0 : title.hashCode()); return result; @Override public boolean equals(Object obj) if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Doc other = (Doc) obj; if (content == null) if (other.content != null) return false; else if (!content.equals(other.content)) return false; if (title == null) if (other.title != null) return false; else if (!title.equals(other.title)) return false; return true;
1.hashcode()和equals()是在哪里被用到的?什么用的?
HashMap是基于散列函数,以数组和链表的方式实现的。而对于每一个对象,通过其hashCode()方法可为其生成一个整形值(散列码),该整型值被处理后,将会作为数组下标,存放该对象所对应的Entry(存放该对象及其对应值)。equals()方法则是在HashMap中插入值或查询时会使用到。当HashMap中插入 值或查询值对应的散列码与数组中的散列码相等时,则会通过equals方法比较key值是否相等,所以想以自建对象作为HashMap的key,必须重写 该对象继承object的equals方法。
2.本来不就有hashcode()和equals()了么?干嘛要重写,直接用原来的不行么?
HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。
Doc doc1 = new Doc("三国演义","罗贯中"); Doc doc2 = new Doc("三国演义","罗贯中");
正常理解这两个对象存入到hashMap中应该是相等的,但如果你不重写 hashcode()方法的话,比较是其地址,不相等!
HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等 的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为 同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素 是否相等。
java经典面试题:hashmap和hashtable以及concurrenthashmap分析(代码片段)
...转载于:https://segmentfault.com/a/1190000038989327前言:HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。比如HashMap和HashTable以及ConcurrentHashMap,这个就是hashmap面... 查看详情
面试题:面试题归类!=!=未看2
..., 可能会降低程序的性能,所以String被定义成final。2.HashMap的源码,实现原理,底层结构。答:Java集合---HashMap源码剖析3.说说你知道的几个Java集合类 查看详情
java面试题
...ld区别?⑥异常怎么处理?2、集合篇①都有哪些集合?②Hashmap是线程安全的吗?为什么?③Hashmap装载因子?3、并发篇①程序、进程、线程概念?②线程的生命周期?③创建线程的方式?④为什么要使用线程池?举例几种 查看详情
java面试题-基础篇(代码片段)
...入排序5.希尔排序6.快速排序7.ArrayList8.Iterator9.LinkedList10.HashMap1)基本数据结构2)树化与退化3)索引计算4)put与扩容5)并发问题6)key的设计11.单例模式基础篇要点:算法、数据结 查看详情
java面试题之----hashmap常见面试题总结
“你用过HashMap吗?”“什么是HashMap?你为什么用到它?”几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对... 查看详情
java开发面试题整理(2019春招)(代码片段)
一、Java基础部分1.HashMap和Hashtable各有什么特点,它们有什么区别?(必背题,超级重要)HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及... 查看详情
面试题
...之双向链表)-[ArrayList与Vector区别](#arraylist-与-vector-区别)-[HashMap的底层实现](#hashmap的底层实现)-[JDK1.8之前](#jdk18之前)-[JDK1.8之后](#jdk18之后)-[HashMap和Hashtable的区别](#hashmap-和-hashtable-的区别)-[HashMap的长度为什么是2的幂次方](#hashmap-... 查看详情
java面试常见题
... 1、String类为什么是final的. 2、HashMap的源码,实现原理,底层结构. 3、说说你知道的几个Java集合类:list、set、queue、map实现类咯... 4、描述一下ArrayList 查看详情
java面试题之hashmap和treemap的区别
HashMap和TreeMap的区别相同点:都是以key和value的形式存储;key不可以重复;都是线程不安全的;不同点:HashMap的key可以为空TreeMap的key值是有序的(使用了红黑树的二叉树结构存储的Entry) 查看详情
java面试题-集合类(代码片段)
... 首先是集合类的面试题 1. HashMap排序题,上机题。 已知一个HashMap<Integer,User>集合,User有name(String)和age(int)属性。请写一个方法实现对HashMap的排序功能,该方法接收HashMap... 查看详情
java集合面试题总结
...ap的put过程(源码分析)5、得到一个线程安全的Map的方法6、HashMap的特点7、Jdk7和jdk8中HashMap的区别8、HashMap的扩容机制9、HashMap中循环链表的产生10、如何将HashMap实现线程安全呢 查看详情
java面试题2-自己整合的(代码片段)
1.HashMap的底层实现原理HashMap是数组+链表组成的实现了Map、Cloneable、Serializable接口,继承了AbstractMap类HashMap是否线程安全?HashMap是线程不安全的,在并发的环境下可以使用ConcurrentHashMap。基本方法的使用HashMap<Integer,String>map=n... 查看详情
为啥面试要问hashmap的原理
HashMap的工作原理HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求... 查看详情
面试题:大公司面试!=!=未看
一、Java基础 1.String类为什么是final的。 2.HashMap的源码,实现原理,底层结构。 3.反射中,Class.forName和classloader的区别 4.session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。 5.Java中的队列... 查看详情
每日十个面试题--(java基础篇)-(41-50)
...型的hash值。它常用于基于hash的集合类,如Hashtable、HashMap、LinkedHashMap等等。它与equals()方法关系特别紧密。根据Java规范,两个使用equal()方法来判断相等的对象,必须 查看详情
java面试题
面试宝典谈一下HashMap的底层原理是什么?谈一下HashMap中put是如何实现的?谈一下HashMap中什么时候需要进行扩容,扩容resize()又是如何实现的?谈一下HashMap中get是如何实现的?为什么不直接将key作为哈希值而... 查看详情
java面试题
面试宝典谈一下HashMap的底层原理是什么?谈一下HashMap中put是如何实现的?谈一下HashMap中什么时候需要进行扩容,扩容resize()又是如何实现的?谈一下HashMap中get是如何实现的?为什么不直接将key作为哈希值而... 查看详情
hashmap原理(转)
HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高... 查看详情