java基础--hashmap面试题

mxh-java mxh-java     2022-12-21     277

关键词:

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实现线程安全呢&#x 查看详情

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之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高... 查看详情