hashcode

Java类/接口的API

只谈情不闲聊 提交于 2019-12-05 00:43:41
本章节收集的类/接口API有: Object类,枚举,包装类,接口Comparable,类Arrays,异常, Object类 public String toString() :    【把一个对象的信息用一个字符串表示,尽量要能够简单易懂,建议子类重写】 public Class <?> getClass() :  【获取对象的“运行时”类型】 public void finalize(): 【 当一个对象被确定为垃圾时,由GC垃圾回收器来进行调用,每一个对象的finalize()方法只会被调用一次 】 public int hashCode() :      【返回一个对象的hashCode值】 常规协定: (1)如果一个对象的参与计算hashCode值的成员变量没有修改,那么在程序运行期间,每次获取的hashCode值不变。 (2)如果两个对象hashCode不同,那么这两个一定不“相等” (3)如果两个的hashCode值相同,那么这两个对象不一定“相等” (4)如果两个相等,那么他们的hashCode值一定要相同。 public boolean equals(Object obj):               【 用于判断当前对象与指定 对象是否相等】      默认的实现,等价于“==”,比较对象的内存地址。 子类可以选择重写,重写有一些要求及原则

Inconsistency in Equals and GetHashCode methods

百般思念 提交于 2019-12-05 00:25:49
After reading this question Why do "int" and "sbyte" GetHashCode functions generate different values? I wanted to dig further and found following behavior: sbyte i = 1; int j = 1; object.Equals(i, j) //false (1) object.Equals(j, i) //false (2) i.Equals(j) //false (3) j.Equals(i) //true (4) i == j //true (5) j == i //true (6) i.GetHashCode() == j.GetHashCode() //false (7) Difference between (3) and (4) breaks the requirement that Equals should be symmetric. Difference between (2) and (4) is not coherent with MSDN specification that says: If the two objects do not represent the same object

java面试题-Java集合相关

匆匆过客 提交于 2019-12-04 23:21:56
1. ArrayList 和 Vector 的区别    ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据   Vector是线程安全的,但是性能比ArrayList要低。   ArrayList,Vector主要区别为以下几点:    (1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;   (2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;    (3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。 2.说说 ArrayList,Vector, LinkedList 的存储性能和特性    ArrayList采用的数组形式来保存对象,这种方法将对象放在连续的位置中,所以最大的缺点就是插入和删除的时候比较麻烦,查找比较快;   Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.   LinkedList采用的链表将对象存放在独立的空间中

一致性hash以及python代码实现

戏子无情 提交于 2019-12-04 23:15:22
背景:自己之前的项目里面使用了redis作为KV存储,不仅是因为性能,主要是需要用redis的hash数据结构。后来随着业务发展,读写压力越来越大,一开始的做法是读写分离,接着一主多从,发现还是不能很好的解决写redis的压力,又因为自己使用的redis版本比较低还不支持分布式的功能,所以自己想去部署一套分布式的redis存储系统,开始想到的做法是简单的做个hash,hashcode=hash(key/machine_num),接着将对应的key放在对应的机器,可是考虑到机器异常宕机,或者新增机器,数据迁移的代价都比较大,所以自己了解了一下一致性hash,准备用它实现一套分布式的KV存储系统。 主要思想: 一致性hash的经典介绍网上有很多,我感觉下面这篇文章介绍的不错。 http://blog.csdn.net/cywosp/article/details/23397179/ 其实主要的思想我认为如下: 把机器按照某种hash算法(比如MD5)计算得到机器的hashcode值 对于存储的数据,根据数据的key,使用与机器相同的hash算法获取到相应的hashcode值,然后将key写入到顺时针最近的机器。 可以是hashcode(key) <= hashcode(machine)的机器 当有新机器加入时,只需要把新加入机器影响到的数据进行重新分配;当删除机器时

浅谈java hashCode

两盒软妹~` 提交于 2019-12-04 22:57:13
 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。 一、hashCode作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。   为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)   也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了

HashMap知识点

Deadly 提交于 2019-12-04 22:08:49
1.实现结构是hash表bucket,底层就是node,也有人称为段(segment) 2.put,通过对key执行hashcode()找到对应对索引,当hashcode相同是发生“碰撞”,采用链表方式存储,jdk8在量大时引入红黑树数据结构 3.get,通过对key执行hashcode()找到对应对索引,若索引对应多个值时才使用equals()进行比较取值 4.resize,当容量超过阀值(loadFactor默认0.75)时,进行翻倍扩张,resize将导致索引重排,大大影响性能 5.concurrent,通过CAS操作,对node进行分段锁,保证每个node对线程安全 来源: https://www.cnblogs.com/scaling/p/11886556.html

在编程中为所欲为[圣诞版]

断了今生、忘了曾经 提交于 2019-12-04 20:46:05
众所周知,在Java中final String中的值是一成不变的。大家都知道String的+(拼接)运算会丢弃内存引用并在内存中重新开拓地址,事实上也确实如此。但final的变量真的是一成不变的吗?谨以此文打开程序员思路,跳出定式思维,希望本文会给你的程序员生涯带来新的思考。 一个简单的例子 这个例子很久远,早有前辈做过,但并不是所有的程序员都接触过。通常喜欢“猎奇”的程序员对此不会陌生。 import java.lang.reflect.Field; public class ChangeFinalString { public static void main(String[] args) throws Exception { final String s = "12345: caiyongji"; System.out.println(s); System.out.println("hashcode: " + s.hashCode()); Field f = String.class.getDeclaredField("value"); f.setAccessible(true); char[] value = (char[]) f.get(s); value[0] = (char) 20851; value[1] = (char) 27880; value[2] =

Proof: why does java.lang.String.hashCode()'s implementation match its documentation?

◇◆丶佛笑我妖孽 提交于 2019-12-04 19:00:13
问题 The JDK documentation for java.lang.String.hashCode() famously says: The hash code for a String object is computed as s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] using int arithmetic, where s[i] is the * i *th character of the string, n is the length of the string, and ^ indicates exponentiation. The standard implementation of this expression is: int hash = 0; for (int i = 0; i < length; i++) { hash = 31*hash + value[i]; } return hash; Looking at this makes me feel like I was sleeping

Java学习:identityHashCode和hashCode方法

故事扮演 提交于 2019-12-04 18:35:02
System类提供了一个identityHashCode(Object x)方法,这个方法返回的是指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。 当某个类的hashCode()方法被重写之后,该类实例的hashCode方法就不能唯一地标识该对象,但是如果两个对象的identityHashCode值相同,则这两个对象是一个对象。 通过以下代码加深理解: 1 public class IdentityHashCodeTest{ 2 public static void main(String[] args){ 3 String s1=new String("Hello"); 4 String s2=new String("Hello"); 5 System.out.println(s1.hashCode()+"----"+s2.hashCode()); 6 System.out.println(System.identityHashCode(s1)+"----"+System.identityHashCode(s2)); 7 8 String s3="Java"; 9 String s4="Java"; 10 System.out.println(System.identityHashCode(s3)+"----"+System

hashcode() and equals() method [duplicate]

限于喜欢 提交于 2019-12-04 18:20:55
问题 This question already has answers here : What issues should be considered when overriding equals and hashCode in Java? (11 answers) Closed 6 years ago . so i have a question on hashcode() and equals() method Let's say I just write a very basic program overridng both the methodes import java.util.*; class Employee { private String name; private int empid; public Employee(String name,int empid) { this.name=name; this.empid=empid; } public int getEmpid() { return empid; } public String getName()