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. Hibernate(二)__简单实例入门

    首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...

  2. 如何利用BI实现人力资源可视化管理

    随着通信行业改革的不断深化,行业的发展形势和生存环境正发生巨大变化,通信和信息的边界越来越模糊,市场竞争也随之愈演愈烈.近年来,某通讯运营商在业务的转型.网络的转型取得了巨大的突破,但人力资源管理的转 ...

  3. Scala override

    var 变量不能在子类中重写,除非父类是抽象类 在抽象类中var变量不能赋初值 abstract class Person{ val name="" def name1=" ...

  4. 消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer

    按照官网提供的订阅型写法( Retrieving Messages By Subscription ("push API")) 我发现,RabbitMQ服务器会在短时间内发送大量的 ...

  5. PostgreSql性能测试

    # PostgreSql性能测试 ## 1. 环境+ 版本:9.4.9+ 系统:OS X 10.11.5+ CPU:Core i5 2.7G+ 内存:16G+ 硬盘:256G SSD ## 2. 测试 ...

  6. 后记:IT软件人员学习的书籍 - IT软件人员书籍系列文章

    1年了,软件人员学习书籍系列总算是写完了.虽然文字篇幅不多,主要对各个角色的一些基本内容做了介绍,但是更重要的是能够提供相关的人员学习书籍进行下载,让更多的人能够从中学习到更多的知识. 这个系列,从项 ...

  7. SQL Server 2014 Database Mail重复发送邮件特殊案例

    在一数据库服务器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))发现有个作业调用Database Mail发送邮件时, ...

  8. WPF 自定义窗口

    在WPF中,经常需要对窗口进行设置,下面讲讲常用的几个设置. 1.无边框窗口 WindowStyle="None" 窗口样式无 AllowsTransparency="T ...

  9. windows10的第一天使用总结

    一.快速开机设置 我的电脑配置如图,装有VS2015 2010 OFFICE等常用开发工具,在线升级后开机速度并没有明显提升. 1.保证windows font cache service服务启动,3 ...

  10. ubuntu-Linux系统读取USB摄像头数据(gspca)

    将摄像头图像保存为jpg格式.摄像头需要是gspca免驱的.uvc若用uvc格式的需要在图像中插入Huffman表.否则无法正常显示. 程序代码: #include <stdio.h> # ...