hashcode

Did I implement equals and hashCode correctly using Google Guava?

蓝咒 提交于 2019-12-05 17:29:08
问题 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 ==

一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

柔情痞子 提交于 2019-12-05 16:47:30
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void main(String[] args) { User user1 = new User(); User user2 = new User(); System.out.println(user1.equals(user2)); System.out.println(user1.hashCode()); System.out.println(user2.hashCode()); HashMap<User,String> map = new HashMap<User,String>(); map.put(user1,"123"); map.put(user2,"456"); System.out.println(map.get(user1)); System.out.println(map.get(user2)); } } class User{ private String name; private String password; private String address; @Override public boolean equals(Object o) { if (this =

为什么要重写hashCode()和equals()方法

可紊 提交于 2019-12-05 16:32:29
1、剖析 equals() //Object类中的equals() public boolean equals(Object obj) { return (this == obj); } 内部是使用“==”比较引用是否指向同一个对象。所以在不覆盖equals方法时,使用equals方法和==的比较结果是一样的 2、什么时候应该覆盖equals方法呢? 当我们希望知道它们在逻辑上是否相等,而不是想知道它们是否指向同一个对象时,我们便需要覆盖equals方法了。 覆盖equals方法的通用约定: 1、自反性 对于任何非null的引用值,x.equals(x) == true 2、对称性 对于任何非null的引用值x,y,x.equals(y) == y.equals(x) 3、传递性 对于任何非null的引用值x,y,z,x.equals(y) ==true,y.equals(z)==true,------>x.equals(z)==true 4、一致性 对于任何非null的引用值x,y,只要equals的比较操作在对象中所用的信息没有被改变,多次调用x.equals(y)返回的值不变。 5、对于任何非null的引用值x,x.equals(null)必须返回false。 实现equals()方法的小技巧: 1,使用==操作符检查 参数是否为这个对象的引用,是则直接返回true。 2

Why chose 31 to do the multiplication in the hashcode() implementation ? [duplicate]

青春壹個敷衍的年華 提交于 2019-12-05 16:03:08
Possible Duplicate: Why does Java's hashCode() in String use 31 as a multiplier? Why use a prime number in hashCode? From Effective Java Item 9: Always override hashCode when you override equals consider the following relevant code snippet that overrides the hashcode() defined in Object class. public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; ......//Rest ignored on purpose ..... private volatile int hashCode; // (See Item 71) @Override public int hashCode() { int result = hashCode; if (result == 0) { result = 17; result

Hash a double in Java

懵懂的女人 提交于 2019-12-05 13:31:15
问题 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

关于“==” && equals()&&hashcode

喜你入骨 提交于 2019-12-05 12:43:45
在面试的时候很多时候会问到“==”和equals()对于很多人来说都已经很了解了,对于我来说似乎和新的知识点一样。下面就来分析一下: “==”是干什么的呢? 答案:是比较两个变量的值是否相等,在java中有8中基本类型:byte,short,int,long,chart,boolean,float,double;对于基本类型的数据使用“==”的时候就会比较的是他们本身的值。此处不再举例便很容易明白。 有人会很奇怪String类型,它不是基本数据类型,在使用“==”的时候为什么有时候返回的是true有时候返回的是false呢?接下来进行说明一下: String str1 = "test"; String str2 = "test"; System.out.println(str1==str2); 这个时候的结果是true;为什么呢?这个时候可以肯定的时候比较的时候依然比较的是内存地址,说明此刻str1和str2指向的是同一对象所以此处相等。 String str3 = new String("test"); String str4 = new String("test"); System.out.println(str3==str4); 这个时候的结果是false;这个时候str3和str4比较内存地址的时候不同所以返回的是false,那么在使用“==”做比较的时候结果是对的呢

HashMap,LinkedHashMap,TreeMap的区别

余生长醉 提交于 2019-12-05 12:40:00
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关

Java基础知识

走远了吗. 提交于 2019-12-05 11:21:29
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点: 没有面向对象易维护、易复用、易扩展 面向对象 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点: 性能比面向过程低 2. Java 语言有哪些特点 简单易学; 面向对象(封装,继承,多态); 平台无关性( Java 虚拟机实现平台无关性); 可靠性; 安全性; 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便); 编译与解释并存; 3. 什么是 JDK 什么是 JRE 什么是 JVM 三者之间的联系与区别 这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。 JDK: 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime

java源码 -- AbstractSet

匆匆过客 提交于 2019-12-05 10:57:04
AbstractSet抽象类属于Set集合分支的顶层类,它继承了AbstractCollection,实现了Set接口。   public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> 这个抽象类中没有定义抽象方法,有且只有3个方法(实现其父类的)。分别为equals、hashCode、removeAll。 1.删除指定集合的所有元素 public boolean removeAll(Collection<?> c) { Objects.requireNonNull(c); boolean modified = false; if (size() > c.size()) { //如果本集合个数 大于 指定集合c元素个数,则遍历集合c并删除现有集合相同元素 for (Iterator<?> i = c.iterator(); i.hasNext(); ) modified |= remove(i.next()); } else { //否则,如果本集合个数 小于 指定集合c元素个数,则遍历集合c并删除现有集合相同元素 for (Iterator<?> i = iterator(); i.hasNext(); ) { if (c.contains(i.next())) { i

java源码 -- AbstractMap

时光怂恿深爱的人放手 提交于 2019-12-05 09:24:31
AbstractMap抽象类实现了一些简单且通用的方法,本身并不难。但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以值的学习。   抽象类通常作为一种骨架实现,为各自子类实现公共的方法。上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究。   Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。   抽象类不能通过new关键字直接创建抽象类的实例,但它可以有构造方法。AbstractMap提供了一个protected修饰的无参构造方法,意味着只有它的子类才能访问(当然它本身就是一个抽象类,其他类也不能直接对其实例化),也就是说只有它的子类才能调用这个无参的构造方法。   在Map接口中其内部定义了一个 Entry接口 ,这个接口是Map映射的内部实现 用于维护一个key-value键值对 ,key-value存储在这个 Map.Entry 中。AbstractMap对这个 内部接口进行了实现 ,一共有 两个 :一个是可变的 SimpleEntry 和一个是不可变的 SimpleImmutableEntry 。 (A) SimpleEntry   public static class