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());
}

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

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

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

  1. equals与hashcode分析

    我们经常在面经中看到这样的问题,为什么重写equals方法就一定要重写hashcode方法.本文就是分析这个问题. <!--more--> 在阿里巴巴java开发手册中就给出了这样的规则. ...

  2. 26_ArrayList_HashSet的比较及Hashcode分析

    实体类: package com.itcast.day1; public class ReflectPoint { private int x; public int y; public Reflec ...

  3. String的hashCode分析

    /** * Returns a hash code for this string. The hash code for a * {@code String} object is computed a ...

  4. java高新技术-反射

    一.反射的基石->Class类 定义一个类使用 class 有一个类叫Class Java程序中的各个Java类属于同一类事务,描述这类事物的Java类名就是Class. Person类代表人, ...

  5. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  6. == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable

    一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...

  7. java集合框架之HashCode

    参考http://how2j.cn/k/collection/collection-hashcode/371.html List查找的低效率 假设在List中存放着无重复名称,没有顺序的2000000 ...

  8. SpringMvc RequestMappingHandlerMapping

    RequestMappingHandlerMapping是SpringMvc中一个比较核心的类,查看下它的类结构图: InitializingBean是个很神奇的接口,在Spring每个容器的bean ...

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

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

随机推荐

  1. 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析

    1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...

  2. Java面试题整理二(侧重SSH框架)

    1.持久化对象的状态都有哪些? 答:瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要 ...

  3. Atitit java集成内嵌浏览器与外嵌浏览器attilax总结

    Atitit java集成内嵌浏览器与外嵌浏览器attilax总结 HTML5将颠覆原生App世界.这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟 ...

  4. JS高程4.变量,作用域和内存问题(1)

    1.基本类型和应用类型的值 ECMAScript变量可能包含两种不同数据类型的值: 基本类型值--简单的数据段.(5种基本的数据类型,按值访问,因为可以操作保存在变量中的实际的值.) 引用类型值--多 ...

  5. delphi连接sql存储过程

    针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...

  6. Android 7.0 Nougat牛轧糖 发布啦

    Android 7.0 Nougat牛轧糖 发布啦 Android 7.0 Nougat 牛轧糖于本月发布了. 从官方blog里可以了解到这个版本的新特性. Android 7.0 从2016年8月正 ...

  7. bitnami redmine版本由2.3.1升级至3.2.2过程

    环境: 操作系统为ubuntu13.**版本,非长期支持版. 安装目录:/opt/redmine-2.3.1-0/ 所有者用户:root 安装过程: 1. 备份2.3.1数据库 sudo /opt/r ...

  8. 原创 C++作用域 (二)

    2.3全局作用域 2.3.1概述 全局作用域是最大的名字空间作用域,不同于用户自定义的名字空间作用域,全局作用域不需要显示地定义,它天然存在于C++程序中.全局作用域是一个最外层的容器,是所有作用域的 ...

  9. MySQL 博客文章目录(2016-08-20更新)

    1 MySQL安装配置 Linux MySQL源码安装缺少ncurses-devel包 Linux平台卸载MySQL总结 Linux 卸载mysql-libs包出现错误 2  MySQL管理配置 My ...

  10. Python中对时间日期的处理方法简单汇总

    这篇文章主要介绍了Python实用日期时间处理方法汇总,本文讲解了获取当前datetime.获取当天date.获取明天/前N天.获取当天开始和结束时间(00:00:00 23:59:59).获取两个d ...