hashcode

C#写算法之散列表

谁说胖子不能爱 提交于 2020-01-19 12:08:19
散列表也叫哈希表(hash table),这种数据结构提供了键(Key)和值(Value)的映射关系。 只要给出一个Key,就可以高效地查找到它所匹配的Value,时间复杂度接近于O(1)。 哈希表之所以查询效率这么高,是因为有一个中转站: 本质上,哈希表也是一个数组,但数组是通过下标访问值,所以,输入的key可以从一个中转站中,通过某种方式,把Key和数组下标进行转换。这个中转站就叫作哈希函数。 在不同的语言中,哈希函数的实现方式不一样。 在Java及大多数面向对象的语言中,每一个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识。无论对象自身的类型是什么,它们的hashcode都是一个整型变量。 既然都是整型变量,想要转化成数组下标就不难实现了。最简单的转化方式是:按照数组长度进行取模运算。 index = HashCode (Key) % Array.length 实际上,JDK中的哈希函数并没有直接采取取模运算,而是利用了位运算的方式来优化性能。在这里可以简单理解成取模操作。 通过哈希函数,我们可以把字符串或其他类型的key,转化成数组的下标index。 如给出一个长度为8的数组,则当 key = 001121时, index = HashCode ("001121")%Array.length = 1420036703 % 8 = 7

学习第十六天

筅森魡賤 提交于 2020-01-16 05:14:56
一: 1.存储键值对的数据 key value->在哈希表结构中 2.key获取hashcode()值一个int的整数,根据hash算法进行计算,算出桶的位置 hash算法: hashcode()值 % 数组的长度 hashcode()值 & 数组的长度-1 ---->数组的长度必须为2的整数幂 3.先判断对应桶中是否已经存在数据,有,判断桶中的数据是否与我当前的key相等,使用equals(),如果相等value覆盖,如果不相等,把数据放入链表的最后 对应桶中是否已经存在数据,没有,那就直接放入桶中 如果equals相等,hashcode一定要保证相等,保证相等的数据桶的位置一样,才会比较equals进行去重 hashcode相等,equals不一定相等,所以我才要放入桶的时候比较equals() 总结: 如果使用hashMap存储数据,key是自定义的引用的数据类型,一定要重写hashcode()和equals()方法 java8:哈希表(数组+链表+红黑树):当桶中的数据超过8个,把结构当前链表结构变为红黑树 初始容量:16 加载因子:0.75 当16*0.75达到临界点12进行扩容 扩容: 扩容位桶的大小 二: Arrays 操作数组的工具类 此类包含用来操作数组(比如排序和搜索)的各种方法 Collections 操作容器的工具类 HashMap 线程不安全,效率较高

HashMap的存储原因与比较器

∥☆過路亽.° 提交于 2020-01-16 01:06:39
一: 1.存储键值对的数据 key value->在哈希表结构中 2.key获取hashcode()值一个int的整数,根据hash算法进行计算,算出桶的位置 hash算法: hashcode()值 % 数组的长度 hashcode()值 & 数组的长度-1 ---->数组的长度必须为2的整数幂 3.先判断对应桶中是否已经存在数据,有,判断桶中的数据是否与我当前的key相等,使用equals(),如果相等value覆盖,如果不相等,把数据放入链表的最后 对应桶中是否已经存在数据,没有,那就直接放入桶中 如果equals相等,hashcode一定要保证相等,保证相等的数据桶的位置一样,才会比较equals进行去重 hashcode相等,equals不一定相等,所以我才要放入桶的时候比较equals() 总结: 如果使用hashMap存储数据,key是自定义的引用的数据类型,一定要重写hashcode()和equals()方法 java8:哈希表(数组+链表+红黑树):当桶中的数据超过8个,把结构当前链表结构变为红黑树 初始容量:16 加载因子:0.75 当16*0.75达到临界点12进行扩容 扩容: 扩容位桶的大小 二: Arrays 操作数组的工具类 此类包含用来操作数组(比如排序和搜索)的各种方法 Collections 操作容器的工具类 HashMap 线程不安全,效率较高

Java基础知识点

家住魔仙堡 提交于 2020-01-15 08:54:47
站在巨人们的肩膀上,此前已经有非常多这类的博文,再次感谢他们为我写这篇文章提供了创作动力和知识储备。本文在个人认为合理的答案后添加认为需要补充的知识点,若有错误希望指正,另外由于知识点多并且每个小点都需要翻阅大量资料故目前整理的知识点数量不是很多但是坚持每天至少更新一点。 侵删 一、Java基础 1. JDK 和 JRE 有什么区别? 两者是包含关系,JDK包含JRE,适用对象的不同,JDK是开发人员使用的开发工具,JRE是使用者需要的软件环境。 JDK包含JRE,是开发人员使用的软件开发工具,还包含了编译器javac,用于Java程序调试和分析的工具jconsole、jvisualvm等 。 JRE是Java程序使用者需要的运行环境,包含了Java虚拟机(jvm)和Java基础类库(lang,util等)的class文件,并且将基础类库打包成jar放在其目录的lib目录下。 扩展: JDK(Java Development Kit):Java开发工具。 JRE(Java Runtime Environment):Java运行环境。 JConsole和VisualJVM都是JDK自带的性能分析工具,.都可用来分析查看堆内存使用量、cpu占用率、线程数、已加载类数、VM概要。 2. == 和 equals 的区别是什么? 两者都用来比较两个变量是否相同,但是==是地址对比

Java集合

天大地大妈咪最大 提交于 2020-01-15 08:47:07
Java的集合类是一种特别强大的工具类,它可以用于存储数量不等的多个对象,并可以实现常用的数据结构,栈、队列等。Java集合还可以用于保存具有映射关系的关联数组。Java集合大致可分为:Set,List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。从JDK1.5以后,Java又增加了Queue体系集合,代表一种队列集合。Java集合就像一种容器,可以把多个对象放在容器里。集合类和数组不一样,数组元素既可以是基本类型,也可以是对象,而集合里只能保存对象。Java的集合类主要由两个接口派生:Collection和Map. Iterator也是Java集合框架的成员,主要用于遍历(迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。遍历Collection中的元素还可以用foreach循环。 一、Set接口不允许包含相同的元素,Set判断两个对象相同使用equals方法。除了这一点,几乎和Collection本身是一样的。   1,HashSet类   HashSet是Set接口的典型实现,大多数时候使用Set集合时是使用这个实现类。HashSet按Hash算法储存集合中的元素,因此具有很好的存取和查找性能。当向HashSet存入一个元素,HashSet会调用该对象的hashCode(

what is the impact over Collection implementations when hashcode() returns zero

久未见 提交于 2020-01-15 05:08:48
问题 Ok just for knowledge , what significance it would made on Collection implementation classes like hashmap , hashset etc if the object's hashcode method always returns 0 in a demoClass . I know it has something to do with putForNullKey of hashmap or other classes of Collection implementation, but dont know much in details. I know for null objects the hascode is 0 so it has specfic method for 0 hashcode. @Override public int hashCode() { return 0; } 回答1: It will make HashMap , HashSet and other

what is the impact over Collection implementations when hashcode() returns zero

倾然丶 夕夏残阳落幕 提交于 2020-01-15 05:08:25
问题 Ok just for knowledge , what significance it would made on Collection implementation classes like hashmap , hashset etc if the object's hashcode method always returns 0 in a demoClass . I know it has something to do with putForNullKey of hashmap or other classes of Collection implementation, but dont know much in details. I know for null objects the hascode is 0 so it has specfic method for 0 hashcode. @Override public int hashCode() { return 0; } 回答1: It will make HashMap , HashSet and other

Does singleton means hashcode always return the same?

一世执手 提交于 2020-01-15 03:31:05
问题 I have two objects, o1 and o2 from the same class. If o1.hashcode() == o2.hashcode() , can I tell they are the same object? Beside o1==o2 , is there any other way to tell the singleton. 回答1: If you have a single instance of the class, the == and the equals comparison will always return true . However, the hashcode can be equal for different objects, so an equality is not guaranteed just by having equal hashcodes. Here is a nice explanation of the hashcode and equals contracts. Checking the

Java set接口之HashSet集合原理讲解

試著忘記壹切 提交于 2020-01-15 01:56:15
Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection接口更加严格了。 set接口中元素是无序的,并且都会以某种规则保证存入的元素不出现重复。 简述其特点就是: 不允许存储重复的元素 没有索引,也没有带索引的方法,不能使用普通的for循环遍历 Set接口有多个实现类,java.util.HashSet是其常用的子类 下面介绍一下set接口的实现类HashSet HashSet集合的介绍 java.util.HashSet是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet底层的实现其实是一个java.util.HashMap支持 HashSet是根据对象的哈希值来确定元素在集合中的存储位置的,因此具有良好的存取和查找性能。 保证元素唯一性的方式依赖于:hashCode与 equals方法。 代码简单理解 import java.util.HashSet; import java.util.Iterator; public class DemoHashSet { public static void main(String[] args) { // 创建set集合

java List 学习

佐手、 提交于 2020-01-13 13:44:41
要学习List<E>接口,首先,我知道它还有一个父接口Collection<E>。而Collection<E>又有一个超级接口Iterable<T>。 我们从超级接口Iterable<T>开始看: // 实现这个接口允许对象成为 "foreach" 语句的目标。 public interface Iterable<T>   方法只有一个:   iterator() // 返回一个在一组 T 类型的元素上进行迭代的迭代器。 然后我们来看Collection<E>: public interface Collection<E> extends Iterable<E>   解释:     1、 Collection 层次结构 中的根接口。     2、Collection 表示一组对象,这些对象也称为 collection 的 元素 。     3、Collection 有些允许重复,有些不允许,有些有序,有些无序。     4、一般操作Collection没有任何的直接实现,都是通过具体的子接口(比如Set,List)来操作它。   所有API: add(E element) 确保此 collection 包含指定的元素。  addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中。 clear(