hashcode

Java基础 -- 13 Map集合

烈酒焚心 提交于 2020-03-08 21:05:52
** Map集合** 定义: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map<K,V>接口。 java.util.Map<K,V>接口是最高接口,注意和Collection没有直接联系。 第一个泛型代表键是什么类型。 第二个泛型代表值是什么类型。 二者可以同类型,也可以不同类型。 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。 Collection中的集合,元素是孤立存在的,Map中的集合,元素是成对存在的,每个元素由键与值两部分组成。因此Collection中的集合称为单列集合 ,Map中的集合称为双列集合,这两个接口没有任何关系 Map集合使用时是通过键去获取值,每个键只能对应一个值。需要注意的是,Map集合不能包含重复的键,但值可以重复。 Map常用子类 认识Map中常用的子类知道其各自特点 HashMap<K,V>: 快,键唯一,自定义键重写hashCode和equals 不能保证才存取顺序 LinkedHashMap<K,V>: 继承了HashMap的特点,但是有存取顺序 HashMap<K,V>:存储数据采用的哈希表结构

hashmap学习笔记

♀尐吖头ヾ 提交于 2020-03-08 13:21:41
最近开始在阅读一些源码之类的学习,趁着周末,今天详细学习了一些HashMap底层的知识,遂记录下来。有很多理解或者描述不当之处,望请指正。 ## 一、数据底层结构图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190526213014826.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pYW9wYXMx,size_16,color_FFFFFF,t_70) 首先放一张HashMap底层结构图,由于现在JDK几乎都用8及以上了,因此本文记录的都是基于JDK8的HashMap。 在JDK8以后,HashMap底层采用数组+链表+红黑树的形式来进行存储。 HashMap底层用一个数组来存放节点,节点在数组中的位置是由一个特殊的算法计算出来的(下文会提到)。如果两个节点计算出来的hash值相同,那么就将新的节点以链表的形式,连接在已存在的节点的后面。如果同一位置的节点数超过8个,那么会将链表改成红黑树的形式进行存储。 这样说有点抽象,结合源码一起看吧。 ## 二、HashMap源码解读 首先我们来看HashMap中的基本单位,节点,包括链表节点和红黑树节点。 链表节点: ``` /**

HashSet存储自定义类型元素

二次信任 提交于 2020-03-08 13:17:23
HashSet存储自定义类型元素 给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一 创建自定义类 package com.learn.demo02.Set; import java.util.Objects; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age);

看完这篇文章,我彻底懂了 equals( ) 和 hashCode( )

流过昼夜 提交于 2020-03-07 13:11:27
总览equals( ) 方法 理解equals()方法和==运算符的区别是非常重要的。 默认情况下(即没有被重写时)equals()只能比较引用类型,"=="既能 比较引用类型又能比较基本类型。 equals()方法从Object类继承,即比较对象引用的值 一般都被子类方法覆盖,不再比较引用的值 "=="运算符: 比较基本数据类型:相当于算术等号。 比较引用数据类型:比较引用的值,不能被覆盖。 通常情况,子类要重写equals( ),改变它的含义。所以有的类中 equals( )是比较地址,有的类中该方法就不比较地址,具体的,就看子类新定义的该方法的规定。建议看看包装类中的equals()方法,蛮有趣的。 在Java中有个规定:如果equals( )返回两个对象是相等的,那这两个对象上调用hashCode( )返回的整数必须相等。否则在使用Hash类型集合时就会产生错误。 注意:覆盖equals( )方法同时,还要记得覆盖hashCode( )方法。 需要说明,如果equals( )返回两个对象不等,它们的hashCode( )也 可以返回相同的整数。但是最好让它们的hashCode( )返回不同的整 数,这有利于提高Hash类型集合的性能。 重写equals方法时,一定要重写hashcode()方法吗? hashcode的调用的条件: 想往map里面放一个类作为map的键值

Java中创建对象的5种方式

梦想的初衷 提交于 2020-03-07 08:20:50
使用new关键字 } → 调用了构造函数 使用Class类的newInstance方法 } → 调用了构造函数 使用Constructor类的newInstance方法 } → 调用了构造函数 使用clone方法 } → 没有调用构造函数 使用反序列化 } → 没有调用构造函数 如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。 1.使用new关键字 这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。 Employee emp1 = new Employee(); 0: new #19 // class org/programming/mitra/exercises/Employee 3: dup 4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."":()V 2.使用Class类的newInstance方法 我们也可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。 我们可以通过下面方式调用newInstance方法创建对象: Employee emp2 = (Employee) Class.forName("org

HashSet与HashMap的区别

孤者浪人 提交于 2020-03-06 05:57:52
面试中经常被问到HashMap与HashSet的区别。于是本渣静下心来总结了一下HashSet与HashMap的区别。   先了解一下HashMap跟HashSet HashSet:    HashSet实现了Set接口,它不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在 HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有 储存相同的对象。如果不重写上述两个方法,那么将使用下面方法默认实现:  public boolean add(Object obj)方法用在Set添加元素时,如果元素值重复时返回 "false",如果添加成功则返回"true" HashMap:    HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现 TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能。HashMap可以有空的键值对(Key(null)-Value(null)) HashMap是非线程安全的(非Synchronize),要想实现线程安全,那么需要调用collections类的静态方法synchronizeMap()实现。 public Object put(Object Key

java面试题

回眸只為那壹抹淺笑 提交于 2020-03-05 22:51:53
网上关于java的面试题随处可见,可比较宅的我仍然愿意总结到自己的博客中,希望对看到的小伙伴们有所帮助,答案仅供参考,也欢迎小伙伴们留言。。。 一、java基础 1.JDK 和 JRE 有什么区别? jdk是java开发工具包,提供了java开发环境和运行环境,它包含jre,还包含了很多java程序调试和分析工具。 jre为java运行提供了所需环境。 简而言之:如果需要运行java程序,只需安装jre就行,如果要编写java程序,需要安装jdk。 2.== 和 equals 的区别是什么? ==基本类型比较的的是值,引用类型比较的是地址值。 equals方法比较引用数据类型,所有的对象都会继承 Object 类中的方法,没有重写 Object 类中的 equals 方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性。 特例: 当用equals()方法进行比较时,对类File、String、Date及包装类(WrapperClass)来说,是比较类型及内容而不考虑引用的是否同一对象;因为这些类重写了Object类的equals()方法。 参考本人博客: https://blog.csdn.net/duan196_118/article/details/104092688 3.两个对象的 hashCode()相同,则 equals(

Lombok EqualsAndHashCode 的用法

吃可爱长大的小学妹 提交于 2020-03-04 17:22:30
https://www.jianshu.com/p/16571aad10a2 @EqualsAndHashCode 此注解会生成equals(Object other) 和 hashCode()方法。 它默认使用非静态,非瞬态的属性 可通过参数exclude排除一些属性 可通过参数of指定仅使用哪些属性 它默认仅使用该类中定义的属性且不调用父类的方法 当启动@EqualsAndHashCode时,默认不调用父类的equals方法,当做类型相等判断时,会遇到麻烦,例如: @Data public class People { private Integer id; } @Data public class User extends People { private String name; private Integer age; } public static void main(String[] args) { User user1 = new User(); user1.setName("jiangxp"); user1.setAge(18); user1.setId(1); User user2 = new User(); user2.setName("jiangxp"); user2.setAge(18); user2.setId(2); System.out

【Java基础】Java拷贝

╄→гoц情女王★ 提交于 2020-03-04 11:08:39
我是 啤酒就辣条,一个Java。 学而时习之,不亦说乎?希望通过博客的形式,总结、分享,梳理自己、帮助他人。 另外,啤酒就辣条,味道不错哦~ 浅拷贝和深拷贝 浅拷贝 是将基本数据类型复制一份, 共用引用类型的数据 。 深拷贝 是 在堆中完全创建一个新的对象 ,基本数据类型和引用数据类型都进行复制。 代码示例 浅拷贝 首先创建两个类 Father 和 Child public class Father implements Cloneable{ private String name; private Child child; // 此处省略get、set方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Child { private String name; // 此处省略get、set方法 } public class CopyTest { public static void main(String[] args) throws CloneNotSupportedException { Father father1 = new Father(); father1.setName("pjjlt");

HashMap常见面试题

感情迁移 提交于 2020-03-03 23:37:14
常见问题: 1、“你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”   HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。 2、“当两个对象的hashcode相同会发生什么?”   因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。(当向 HashMap 中添加 key-value 对,由其 key 的 hashCode() 返回值决定该 key-value 对(就是 Entry 对象)的存储位置。当两个 Entry 对象的 key 的 hashCode() 返回值相同时,将由 key 通过 eqauls() 比较值决定是采用覆盖行为(返回 true),还是产生 Entry 链(返回 false)。) 3、