hashcode

Java——hashCode 与 equals

≯℡__Kan透↙ 提交于 2020-02-17 14:21:31
hashCode 与 equals (重要) 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” hashCode()介绍 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。 散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象) 为什么要有 hashCode 我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。

hashCode()和equals()的区别和联系

谁都会走 提交于 2020-02-17 11:27:07
在Java中任何一个对象都继承Object类,所以都具备hashCode()方法和equals(Object obj)方法。 equals(Object obj)方法是用来判断两个对象是否相同,相同就返回true,不相同就返回false。 hashCode()方法返回一个int数值。 JDK对hashCode()方法和equals()方法有一定的规范: 若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“ 如果两个对象相同,那么他们的hashcode应该 相等” 。如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。 如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。 根据这两个规范,可以得到如下推论: 1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。 2、如果两个对象不equals,他们的hashcode有可能相等。 3

Java_Map集合接口

♀尐吖头ヾ 提交于 2020-02-16 10:02:31
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。 Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。 Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。 Map接口中常用的方法: HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。 Map接口中的常用方法 : import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Map<Integer, String> m1 = new HashMap<Integer, String>(); Map<Integer, String> m2 = new HashMap<Integer, String>(); m1.put(1, "张三"); m1.put(2, "李四"); m1.put(3, "王五"); m2.put(1, "一

DotNet源码学习-HASHSET(初探)

浪尽此生 提交于 2020-02-15 01:16:32
命名空间:System.Collections.Generic 先看一下官方说明: 类提供了高级的设置操作。 集是不包含重复元素的集合,其元素无特定顺序 。 HashSet <T>对象的容量是对象可以容纳的元素数。当向对象添加元素时,HashSet <T>对象的容量会自动增加。 HashSet<String> hashSet = new HashSet<string>(); hashSet.Add("test"); hashSet.Add("test"); Console.WriteLine(hashSet.Count); 打印结果:1 HashSet的默认构造方法: public HashSet() : this((IEqualityComparer<T>?)null) { } 注:: this语法为调用自身对象的其他构造方法。 public HashSet(IEqualityComparer<T>? comparer) { if (comparer == EqualityComparer<T>.Default) { comparer = null; } _comparer = comparer; _lastIndex = 0; _count = 0; _freeList = -1; _version = 0; } 第二中创建方式,将集合作为参数。 List<string>

java设计模式4——原型模式

你离开我真会死。 提交于 2020-02-14 11:30:07
java设计模式4——原型模式 1、写在前面 本节内容与C++语言的复制构造函数、浅拷贝、深拷贝极为相似,因此建议学习者可以先了解C++的该部分的相关知识,或者学习完本节内容后,也去了解C++的相应内容,进行比对学习。 2、原型模式介绍 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 3、java实现克隆的核心 1、实现一个接口(Cloneable) 2、重写一个方法(clone()) clone()方法的源码分析 protected native Object clone() throws CloneNotSupportedException; 由方法声明的放回值类型=>native,可知该方法实际上是一个C++封装好的方法,由java来进行调用,相当于C++语言的复制构造函数,但是又有所区别。 4、第一种原型模式实现(浅拷贝) 4.1、建立视频的原型类 package com.xgp.company.创建型模式.第四种

Unique hashCode with two fields without order

孤街浪徒 提交于 2020-02-13 05:20:21
问题 I need a hashCode implementation in Java which ignores the order of the fields in my class Edge . It should be possible that Node first could be Node second, and second could be Node first. Here is my method is depend on the order: public class Edge { private Node first, second; @Override public int hashCode() { int hash = 17; int hashMultiplikator = 79; hash = hashMultiplikator * hash + first.hashCode(); hash = hashMultiplikator * hash + second.hashCode(); return hash; } } Is there a way to

Netty任务队列中的Task有三种典型使用场景

时光毁灭记忆、已成空白 提交于 2020-02-12 12:20:06
每个NioEventLoop里都有一个selector与TaskQueue,当我们在进行一些耗时的操作的时候,会产生阻塞,这时候我们就可以用到TaskQueue 具体实现有三种: 1.用户程序自定义的普通任务:在自定义的handler的channelRead方法中: // 比如这里我们有一个非常耗时的业务,异步执行,提交该channel 对应的NioEventLoop的TaskQueue中 // 解决方案1: ctx . channel ( ) . eventLoop ( ) . execute ( new Runnable ( ) { public void run ( ) { try { Thread . sleep ( 10000 ) ; ctx . writeAndFlush ( Unpooled . copiedBuffer ( "hello,客户端1" , CharsetUtil . UTF_8 ) ) ; } catch ( InterruptedException e ) { System . out . println ( "发生异常" ) ; } } } ) ; 2.用户自定义定时任务,该任务提交到scheduleTaskQueue中 ctx . channel ( ) . eventLoop ( ) . schedule ( new Runnable ( )

Java中多种集合类

旧城冷巷雨未停 提交于 2020-02-11 12:11:40
Java 中ArrayList和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口   Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java

数组

ⅰ亾dé卋堺 提交于 2020-02-10 04:27:23
1.List接口 ArrayList(查询快,增删慢,查询快)    内部通过数组实现,当数组大小不满足时需要增加存储能力,将已有的数组的数据复制到新的存储空间,当插入或者删除元素时候,需要对数组进行复制移动,代价高,   默认容量时10,扩容1.5倍 Vector(数组实现,线程同步)   支持线程同步,即某一时刻只有一个线程能够写vector,因为访问比ArrayList慢 LinkList(双链表结构,增删慢,查询快)    不支持高效的随机元素访问,LinkedList 是一个实现了 List 接口和 Deque 接口的双端链表。使得 LinkedList 类也具有队列的特性; LinkedList 不是线程安全的,如果想使   LinkedList 变 成 线 程 安 全 的 , 可 以 调 用 静 态 类 Collections 类 中 的 synchronizedList 方 法 : List list=Collections.synchronizedList(new LinkedList(...)); 2.Set接口     hashCode存储,如果想让两个不同的对象相等,必须覆盖object的hashCode方法和equals方法 HashSet(无序,哈希表)    按照哈希值存取数据,通过hashcode方法来获取,HashSet首先判断两个元素的哈希值

if two objects have same hashcode then what about their memory addresses

余生颓废 提交于 2020-02-08 07:26:26
问题 If two objects of the same class have the same hashCode in Java then how would they be stored in a HashMap / HashTable ? What is the actual architecture for hashcode and memory address. Where does hashCode reside in memory? Example: There is a class A . when creating objects a1 and a2 then they will represent some memory address but I overrode hashcode every time same. When I read an article then I found that hashcode functions generate a hashcode from the memory address. this means the