hashcode

HashCode on decimal with IEqualityComparer in a ConcurrentDictionary

这一生的挚爱 提交于 2020-02-08 06:53:09
问题 I made a class to be used as a key in a dictionary. public class FourUintsOneDecimalKeyInfo { public uint IdOne { get; set; } public uint IdTwo { get; set; } public uint IdThree { get; set; } public uint IdFour { get; set; } public decimal DefinitionOne { get; set; } public class EqualityComparerAssetTableInfo : IEqualityComparer<FourUintsOneDecimalKeyInfo> { public bool Equals(FourUintsOneDecimalKeyInfo x, FourUintsOneDecimalKeyInfo y) { return x.IdOne == y.IdOne && x.IdTwo == y.IdTwo && x

Java之集合

寵の児 提交于 2020-02-08 00:16:21
前言:   在写程序当中,集合会经常使用,今天听了马老师的课,写一些自己的总结 正文:   集合最重要的就是一个图,一个类,三个知识点,六个接口   说到图就是上面的图,这个图可以帮我们理解这些接口的继承关系 1.容器 API Collection接口   定义了存取一组对象的方法,其子接口Set和List分别定义了储存方式:     Set中的对象没有顺序可以重复     List的对象有顺序不可重复   Collection接口定义的方法(一个一个往里面存)(可以在API中查到,在这就不一一阐述了,仅仅列举一些) 1 import java.util.*;; 2 3 public class TestCollection{ 4 int i; 5 public TestCollection(int i) { 6 this.i=i; 7 8 } 9 public static void main(String[] args) { 10 Collection c=new ArrayList(); 11 c.add("hello"); 12 c.add(new Integer(1)); 13 System.out.println(c.size()); 14 System.out.println(c); 15 } 16 17 } 输出: 2 [hello, 1]   问题1

面试专题 HashMap如何在Java中工作

萝らか妹 提交于 2020-02-07 15:35:47
通过优锐课的java学习分享中,了解了企业的面试题型,分享给大家学习。 HashMap问题在工作面试中很常见。 这是HashMaps在Java内部如何工作的一些深入说明。 HashMap在内部如何工作已成为几乎所有访谈中的一个普遍问题。 几乎每个人都知道如何使用HashMap或HashMap与Hashtable之间的区别。 但是,当问题为“ HashMap如何在内部工作?”时,许多人会失败。 这个问题的答案是,它基于哈希原理工作,但听起来并不那么简单。 哈希是一种使用算法将唯一代码分配给变量或属性的机制,从而可以轻松进行检索。 真正的哈希机制在应用于同一对象时应始终返回相同的hashCode()。 然后是一个问题:“哈希如何帮助存储和检索HashMap中的值?” 许多人会说该值将存储在存储桶中,并使用键进行检索。 如果你认为这是有效的,那么你绝对是错误的。 为了证明这一点,让我们看一下HashMap类: /** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry[] table; 那么HashMap中Entry []的用途是什么? HashMap将对象存储为Entry实例,而不是键和值。 什么是入门班? HashMap有一个称为Entry

Java中HashMap和TreeMap

牧云@^-^@ 提交于 2020-02-07 05:08:19
Java中HashMap和TreeMap **HashMap 非线程安全 TreeMap 非线程安全 ** 在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。 HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 线程安全 关于线程以及线程安全的相关知识有待笔者继续学习,敬请关注。 在Java里,线程安全一般体现在两个方面: 多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样 两种常规Map实现 HashMap: 基于哈希表实现

Sorting objects with the same hashcode in java

£可爱£侵袭症+ 提交于 2020-02-07 01:58:20
问题 For example, if I am hashing integers and my hashing function is simply (n % 10) then the number 17 and the number 27 will produce the same result. This does not mean that those numbers are the same. Now, assuming the n%10 is my hashing function, my question is: If I input the following numbers by the following order, how will the numbers be outputed since they are sorted by their hashcode ? Numbers: 10, 27, 17, 38, 58, 28, 43 回答1: I think you may be confused as to what hashCode() is used for

hashMap关键知识点

☆樱花仙子☆ 提交于 2020-02-06 20:13:10
1、数据结构 jdk1.7是数组加链表,jdk1.8是数组加链表加红黑树(链表太长了查询也慢,所以链表长度超过8时就使用红黑树咯) 2、hashMap的初始化大小 1)不给长度时,默认初始化为16,创建map时尽量给个长度,防止不断扩容影响效率。 2)大小为2的n次幂时,散列得比较均匀,那么查询就比较快 3、hashMap的put原理 1)把key值通过hash函数(hashcode与map长度减一的二进制做与运算,这样得出0到长度减一的下标)计算一个位置index 例如: 初始化长度为8 hashcode为11001 那么下标就为0 0111&11001=0 0001 那么下标就为1 初始化长度为8 hashcode为11111 那么下标就为0 0111&11111=0 0111 那么下标就为7 2)检测index所在位置是否有值,有值得话就比较key值是否相等, 不等的话直接把值接在所在对象的链表的后面,相等的话就覆盖原有的值 4、hashMap的扩容原理 1)当map中的元素个数等于map长度乘以加载因子时,就需要扩容了;扩容到原来长度的两倍 2)扩容使用的是头插法,扩容之后链表的顺序为倒序,这也是导致多线程扩容时出现环路导致线程不安全的原因 5、hashMap的get原理 1)把key值通过hash函数计算一个位置index 6、hashMap的加载因子 1

原型模式

为君一笑 提交于 2020-02-06 07:36:43
问题描述 现在有一只羊tom,姓名为tom,年龄为1,颜色为白色,请编写程序创建和tom属性完全相同的10只羊 传统思维 直接new出一个对象 优点:比较好理解,简单易操作 缺点: 在创建新的对象的时候,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率低。 总是需要重新初始化对象,而不是动态的对象运行时的状态,不够灵活 使用原型模式 概括 原型模式是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式。允许一个对象再创建另一个可制定对象,无需知道如何创建的细节 工作原理:通过一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实现创建,即 对象.new() 思路:利用Object超类的clone()方法,可以将对象复制一份,但是实现clone()的java类必须要实现一个接口Cloneable,该接口表示该类能够复制且具有复制能力。 缺点:如果需要对一个类配备一个克隆方法,这对全新的类不难,但对已有的类进行改造的时候,需要修改源代码,违背了OCP(开闭)原则。 优点:简化对象创建过程,同时也能够提高效率;不用重新初始化对象,而是动态获取对象运行时状态;但对象发生变化时,克隆对象也会发生变化,无需修改代码。 实现 创建可以clone的类,实现Cloneable接口,显示重写clone方法

Java 14 有哪些新特性?

白昼怎懂夜的黑 提交于 2020-02-05 19:35:51
记录为 Java 提供了一种正确实现数据类的能力,不再需要为实现数据类而编写冗长的代码。下面就来看看 Java 14 中的记录有哪些新特性。 作者 | Nathan Esquenazi 译者 | 弯月,责编 | 郭芮 以下为译文: Java 14 即将在 2020 年 3 月正式发布。 Java 以 6 个月作为新版本的发布周期,和之前的版本发布一样,JDK 14 预计将在语言本身和 JVM 级别上带来一些新特性。 如果我们看一下特性列表,我们会注意到一些开发者非常期待的语言特性:记录 (records)、 switch 表达式(在 JDK 13 中就已经存在,不过仅仅是预览模式),模式匹配。下面让我们看下其中比较有趣的记录这一特性。 前提条件 我们需要 OpenJDK 网站中的 JDK 14 先期预览版本(https://jdk.java.net/14/)。 什么是一条记录? 记录表示“数据类” ,是用于保存纯数据的一种特殊的类。 其他语言中已经有类似记录的结构,比如 Kotlin 的数据类。 通过将类型声明为记录,通过类型即可表达意图,即只表示数据。 声明记录的语法比使用普通类要简单得多,普通类通常需要实现核心 Object 方法,如 equals 和 hashCode (通常称为“样板”代码)。 在对于模型类 (可能通过 ORM 持久化) 或数据传输对象 (DTOs)

Can I use hashcode of class member for class?

北城以北 提交于 2020-02-05 03:59:21
问题 I have class with final String as unique ID. Of course I want to override equals so comparison is based on ID only. Is it correct practice then to just return hash code of ID, like below? class ItemSpec{ final String name; ... @Override public boolean equals(Object o){ if(o != null && o instanceof ItemSpec){ return name.equalsIgnoreCase(((ItemSpec)o).name); } else{ return false; } } @Override public int hashCode(){ if(name == null){ return 0; } else{ return name.hashCode(); } } } 回答1: Not if

Can I use hashcode of class member for class?

此生再无相见时 提交于 2020-02-05 03:59:10
问题 I have class with final String as unique ID. Of course I want to override equals so comparison is based on ID only. Is it correct practice then to just return hash code of ID, like below? class ItemSpec{ final String name; ... @Override public boolean equals(Object o){ if(o != null && o instanceof ItemSpec){ return name.equalsIgnoreCase(((ItemSpec)o).name); } else{ return false; } } @Override public int hashCode(){ if(name == null){ return 0; } else{ return name.hashCode(); } } } 回答1: Not if