ArrayList_HashSet的比较及Hashcode分析

ArrayList_HashSet的比较及Hashcode分析

  hashCode()方法的作用

  

   

public static void main(String[] args) {
        Collection collection = new HashSet<>();
        ReflectPoint pt1 = new ReflectPoint(3, 3);
        ReflectPoint pt2 = new ReflectPoint(5, 5);
        ReflectPoint pt3 = new ReflectPoint(3, 3);

        collection.add(pt1);
        collection.add(pt2);
        collection.add(pt3);
        collection.add(pt1);

//        pt1.y = 7;  //修改后hashCode值就不同了,导致找不到这个对象了,也无法删除
        collection.remove(pt1);

        /**      1.如果实体类只重写了equals(),没有重写hashCode() 则collection总的个数为3       因为,在存储一个对象进HashSet中时,如果没有重写hashCode方法,导致两个对象计算出来的hashCode值是不相同的(hashCode值是根据对象在内存中的地址计算出来的)       我在我的区域里边找,不在那个已经存储同样对象的区域里边找,所以这个对象还是会被存储进去

      为了让相等的对象找到在相同的区域,就有一个说法,如果两个对象的equals相等时,应该让他们的hashCode也应该相等      如果对象没有要存到hash集合里边,就没必要重写hashCode();
         * 如果要放入HashSet中的对象没有重写hashCode方法和equals方法,
         * 两个对象的引用不同,还是会存入HashSet中,默认的equals方法使用 == 比较两个对象的内存地址值
         * 如果重写hashCode与equals方法,会认为是相同的对象,后边要存入的存入不了
         *
         * 当一个对象被存进HashSet集合中后,就不能修改这个对象中参与计算哈希值的字段了,否则,对象
         * 修改后的哈希值与最初存进HashSet集合中的哈希值就不同了,在这种情况下,即使在
         * contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回
         * 不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。
         */
        System.out.println(collection.size()); 

        /**
         * 通常来说,一个类的两个实例对象用equals()方法比较的结果相等时,他们的哈希吗也必须相等,但
         * 反之则不成立,及equals方法比较结果不相等的对象可以有相同的哈希码,或者说哈希吗相同的两个对象,
         * equals方法比较的结果可以不相同,例如 字符串"BB"和"Aa"的equals比较结果不相同,但hashCode()结果相等。
         */
        System.out.println("BB".hashCode());  //
        System.out.println("Aa".hashCode());
    }

内存泄漏的问题也可以用此例子举例,

所谓内存泄漏,就是这个对象不再使用了可一直占用内存空间,无法释放掉。

时间: 2024-08-07 00:02:55

ArrayList_HashSet的比较及Hashcode分析的相关文章

ArrayList与HashSet比较及HashCode分析

  ArrayList与HashSet比较 ArrayList是一种有顺序的集合 HashSet通过比较两个对象是否相等,相同则不加入HashSet集合,不允许重复.如何比较? HashSet集合对象中必须重写equals()方法和hashCode()方法 HashCode分析 目的提高hash集合中查找元素的效率,这种方法将集合分成若干个存储区域,每个对象可以计算出一个哈希码.将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域. HashSet就是采

26_ArrayList_HashSet的比较及Hashcode分析

实体类: package com.itcast.day1; public class ReflectPoint { private int x; public int y; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * res

java基础巩固系列(五):ArrayList与HashSet的比较,以及HashCode分析

首先,我们需要知道的是ArrayList和HashSet类都在java.util包中,都是实现了Collection的类,Collection是一个标准. 然后,我们介绍下这两个类之间的区别: 1.ArrayList:相当于一个动态的数组,是一组有序的集合,当对象被添加到ArrayList时,对象会先找到第一个空缺的地方.这里有一点需要记得:放进去的是对象的引用,不是对象本身.然后,放入第二个对象,如果和第一个相同的话,依然按照顺序存放进去.也就是说,在这个有序集合里,每有一个对象就会放入一个引

黑马程序员——基础加强篇

------- android培训.java培训.期待与您交流! ---------- MyEclipse相关知识 Workspace与project 切换工作空间:File---Switch Workspace---Other 一个工作间包含多个工程,切换工作间之后,会影响里面的工程,例如快捷键什么的都要重新配置如果重新配了之后快捷键还没有用就要考虑下那个快捷键是不是冲突了    视图管理与程序调试 可以通过Window---Show View来添加各种透视图. 调试程序的时候可以在代码右边双

黑马程序员------Java反射学习总结(二)

----------------------------Java培训.Android培训.期待与您交流! ------------------------------- ArrayList_HashSet的比较及Hashcode分析 看以下三段代码: 1.定义一个点类(Point) 1 package com.itheima.day1; 2 3 public class ReflectPoint { 4 private int x; 5 public int y; 6 7 public Refl

黑马程序员——java高新技术(新特性、反射、泛型)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java高新技术 第一部分——JDK1.5新特性 1.增强for循环 格式: for(元素类型 变量名 : Collection集合 & 数组 ) { }//增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 高级for循环和传统for循环的区别: 高级for循环在使用时,必须要明确被遍历的目标.这个目标,可以是Collection集合或者数组,如果遍历Collec

java中的==、equals()、hashCode()源码分析(转载)

在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 Str

HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)

引言:我们都知道HashSet这个类有add   remove   contains方法,但是我们要深刻理解到底是怎么判断它是否重复加入了,什么时候才移除,什么时候才算是包括????????? add()方法 首先我们看下这个代码 1 package com.xt.set; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public class AddTest { 8

java中的==、equals()、hashCode()源码分析

在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 Str