hashcode

Java中常见数据结构:list与map 的底层实现

江枫思渺然 提交于 2019-12-04 03:54:50
Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率低 LinkedList 底层数据结构是链表,查询慢,增删快 线程不安全,效率高 Set(无序,唯一) HashSet 底层数据结构是哈希表。 哈希表依赖两个方法:hashCode()和equals() 执行顺序: 首先判断hashCode()值是否相同 是:继续执行equals(),看其返回值 是true:说明元素重复,不添加 是false:就直接添加到集合 否:就直接添加到集合 最终: 自动生成hashCode()和equals()即可 LinkedHashSet 底层数据结构由链表和哈希表组成。 由链表保证元素有序。 由哈希表保证元素唯一。 TreeSet 底层数据结构是红黑树。(是一种自平衡的二叉树) 如何保证元素唯一性呢? 根据比较的返回值是否是0来决定 如何保证元素的排序呢? 两种方式 自然排序(元素具备比较性) 让元素所属的类实现Comparable接口 比较器排序(集合具备比较性) 让集合接收一个Comparator的实现类对象 Map(双列集合) A:Map集合的数据结构仅仅针对键有效,与值无关。 B:存储的是键值对形式的元素,键唯一,值可重复。 HashMap

Java中常见数据结构:list与map -底层如何实现

浪子不回头ぞ 提交于 2019-12-04 03:54:36
1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率低 LinkedList 底层数据结构是链表,查询慢,增删快 线程不安全,效率高 Set(无序,唯一) HashSet 底层数据结构是哈希表。 哈希表依赖两个方法:hashCode()和equals() 执行顺序: 首先判断hashCode()值是否相同 是:继续执行equals(),看其返回值 是true:说明元素重复,不添加 是false:就直接添加到集合 否:就直接添加到集合 最终: 自动生成hashCode()和equals()即可 LinkedHashSet 底层数据结构由链表和哈希表组成。 由链表保证元素有序。 由哈希表保证元素唯一。 TreeSet 底层数据结构是红黑树。(是一种自平衡的二叉树) 如何保证元素唯一性呢? 根据比较的返回值是否是0来决定 如何保证元素的排序呢? 两种方式 自然排序(元素具备比较性) 让元素所属的类实现Comparable接口 比较器排序(集合具备比较性) 让集合接收一个Comparator的实现类对象 Map(双列集合) A:Map集合的数据结构仅仅针对键有效,与值无关。 B:存储的是键值对形式的元素,键唯一,值可重复。

Java中常见数据结构:Java容器 Collection与map -底层如何实现

戏子无情 提交于 2019-12-04 03:53:35
1 :集合 2 Collection(单列集合) 3 List (有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数组,查询快,增删慢 9 线程安全,效率低 10 LinkedList 11 底层数据结构是链表,查询慢,增删快 12 线程不安全,效率高 13 Set (无序,唯一) 14 HashSet 15 底层数据结构是哈希表。 16 哈希表依赖两个方法:hashCode()和 equals () 17 执行顺序: 18 首先判断hashCode()值是否相同 19 是:继续执行 equals (),看其返回值 20 是 true :说明元素重复,不添加 21 是 false :就直接添加到集合 22 否:就直接添加到集合 23 最终: 24 自动生成hashCode()和 equals ()即可 25 26 LinkedHashSet 27 底层数据结构由链表和哈希表组成。 28 由链表保证元素有序。 29 由哈希表保证元素唯一。 30 TreeSet 31 底层数据结构是红黑树。(是一种自平衡的二叉树) 32 如何保证元素唯一性呢 ? 33 根据比较的返回值是否是 0 来决定 34 如何保证元素的排序呢 ? 35 两种方式 36 自然排序(元素具备比较性) 37

Scala: lightweight way to put Arrays in a Set or Map

与世无争的帅哥 提交于 2019-12-04 03:21:44
Since == does not work with Arrays, I cannot effectively create a Set of Arrays (or Map with Array keys). I would rather not take the performance hit of converting my Arrays to a Vector or List or something. Is there a lightweight way to define natural comparison and hashcode on Arrays so I can stick them in a Set? Use WrappedArray from collection.mutable . It provides proper equality for arrays with a minimal overhead. apply , update etc calls are delegated to underlying array. Also there are special classes for primitive types (e.g. WrappedArray.ofInt ) to avoid boxing and unboxing. scala>

what is the preferred way of implementing hashCode()?

依然范特西╮ 提交于 2019-12-04 03:13:51
Sometimes I need to implement an obj's hashCode() method by combining the hashCodes of its several instance members. For example, if the combinational obj has members a, b, and c, I often see ppl implement it as int hashCode(){ return 31 * 31 * a.hashCode() + 31 * b.hashCode() + c.hashCode(); } Where does this magic number 31 come from? Is it the length of 4-bytes or just a prime number? Is there any other preferred/standard way of implementing hashCode()? Mark Peters See Effective Java's recipe . It's just the best source, hands down. The use of a prime number is just to try to get a

Did I implement equals and hashCode correctly using Google Guava?

浪尽此生 提交于 2019-12-04 02:32:25
I am using hibernate and need to override equals and hashCode(). I chose to use google-guava's equals and hashCode helpers. I wanted to know if I am missing something here. I have get/set methods for idImage and filePath . @Entity @Table(name = "IMAGE") public class ImageEntity { private Integer idImage; private String filePath; @Override public int hashCode() { return Objects.hashCode(getFilePath()); } @Override public boolean equals(final Object obj) { if(obj == this) return true; if(obj == null) return false; if(obj instanceof ImageEntity){ final ImageEntity otherImage = (ImageEntity) obj;

为什么重写equals时一定要重写hashcode

北城以北 提交于 2019-12-04 01:52:38
  我们开发时写一个类,默认继承Object类,Object类的equals方法是比较是否指向同一个对象(地址是否相同),   Object类 的hashcode方法返回的对象内存地址的值, 一个类只重写了equals方法,不重写hashcode,那么对象equals为true(比较内容),但是hashcode为false(因为不同对象,地址不同) 那么对于hash散列表结构的容器集合,就会出现问题。 例如:有类Person如下,只重写了equals方法 1 public class Person{ 2 private int id; 3 private String name; 4 5 public Person(int id,String name) { 6 this.id = id; 7 this.name = name; 8 } 9 10 public int getId() { 11 return id; 12 } 13 public void setId(int id) { 14 this.id = id; 15 } 16 public String getName() { 17 return name; 18 } 19 public void setName(String name) { 20 this.name = name; 21 } 22 23

Hash a double in Java

蹲街弑〆低调 提交于 2019-12-04 00:48:00
I was wondering how to hash a double in Java? I have hashed other primitive data and objects. I thought I could use the hashcode method? From what I have seen this looks quite complex. I came across something about creating a seed. I was wondering any ideas on how to go about this. Hoping to put in with the rest of my hashcode for the class that has the double? I was wondering if there are issues with me trying to hash arraylists, arrays and other objects in java. Some of my classes contain arraylists. Many Thanks Double.hashCode() complex? It basically converts double into a long (no magic

Java 8系列之重新认识HashMap

别来无恙 提交于 2019-12-04 00:00:38
摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类

Java8——重新认识HashMap

拟墨画扇 提交于 2019-12-04 00:00:20
摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类