黑马程序员------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 ReflectPoint(int x, int y){
 8         super();
 9         this.x = x;
10         this.y = y;
11     }
12 }

2、将几个点存入ArrayList集合中的代码:

 1 public class ReflectTest6 {
 2
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         Collection co = new ArrayList();
 6
 7         ReflectPoint point1 = new ReflectPoint(3, 4);
 8         ReflectPoint point2 = new ReflectPoint(5,8);
 9         ReflectPoint point3 = new ReflectPoint(3, 4);
10
11         co.add(point3);
12         co.add(point2);
13         co.add(point1);
14         co.add(point3);
15
16         System.out.println(co.size());//结果:4
17
18     }
19
20 }

3、将同样的点存入HashSet集合中的代码:

package com.itheima.day1;
import java.util.*;
public class ReflectTest7 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection co = new HashSet();

        ReflectPoint point1 = new ReflectPoint(128, 128);
        ReflectPoint point2 = new ReflectPoint(5,8);
        ReflectPoint point3 = new ReflectPoint(128, 128);

        co.add(point3);
        co.add(point2);
        co.add(point1);
        co.add(point3);

        System.out.println(co.size());//结果:3

    }

分析:

1、我们都知道,HashSet集合中元素不能重复。

2、从第三段代码结果3可以看出,HashSet集合将point1和point3视为两个不同的点。原因是因为point1和point3的hashCode不一样。

  HashSet增加元素时判断是否有相同元素的方法:

  1)先判断要增加的元素的hashCode和集合中元素的hashCode是否相同,如果不相同,则直接将此元素加入集合中;

  2)如果hashCode相同,则在根据元素的equals方法进行判断是否有重复元素。

3、而我们一般认为如果两个点的坐标相同,我们就视为它们是同一个点。

  这就要我们重写点类的hashCode()和equals()方法。

代码示例:

package com.itheima.day1;

public class ReflectPoint {
    private int x;
    public int y;
   //public String str1 = "ball";
    //public String str2 = "basketball";
    //public String str3 = "java";
    public ReflectPoint(int x, int y){
        super();
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    @Override
    public String toString(){
        return str1+":"+str2+":"+str3;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ReflectPoint other = (ReflectPoint) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }
}

注意:

  当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。

  代码示例:

package com.itheima.day1;
import java.util.*;
public class ReflectTest7 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection co = new HashSet();

        ReflectPoint point1 = new ReflectPoint(128, 128);
        ReflectPoint point2 = new ReflectPoint(5,8);
        ReflectPoint point3 = new ReflectPoint(128, 128);

        co.add(point3);
        co.add(point2);
        co.add(point1);
        co.add(point3);

        point3.setY(0);
        co.remove(point3);
        System.out.println(co.size());//结果仍然为2
    }
}

  说明,此point3的hashCode已经被改变,所以在集合中已经检索不到这个对象,导致删除失败,这个对象就会一直存在,造成内存泄漏。

  

时间: 2024-08-01 21:33:28

黑马程序员------Java反射学习总结(二)的相关文章

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

-------------------------Java培训.Android培训,期待与您交流!----------------------------- 一.反射的概念 1) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2)一句话来讲,反射就是将Java类中的各个成分映射成相应的Java类. 3)即在Java中,描述事物的各种

黑马程序员--java基础学习笔记5

黑马程序员--java基础学习笔记6 一.笔记内容概述: 数组-第二种定义格式.数组-常见操作-遍历-最值-选择排序-冒泡排序-排序位置置换代码提取.数组-排序的性能问题.数组-常见功能-查找-折半查找.进制转换-查表法-整合. 二.常用内容介绍: 1.数组初始化的三种方式: int[] arr = new int[3]; int[] arr = new int[]{1,2,3}; int[] arr = {1,2,3}; 2.查表法: 如果数据中出现了对应关系,而且对应关系的一方是有序的数字编

黑马程序员-Java 反射

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!-- 一.概述 Java 反射机制是在运行状态中,对于程序中的任意一个类,通过反射机制都能够知道这个类的所有属性和方法,包括共有.包含.默认和私有.对于任意的一个对象,通过反射机制都可以去调用它的每一个方法,这种机制就称为Java的反射机制.一般的操作都在java.lang.reflect包中,常用到的类有Constructor,Field和Method三种.既然是对Java类的反射,当然也有个比不可少的类Class,

黑马程序员——JAVA面向对象学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 首先,面向对象是一种思想. 有一种面向过程的思想,面向对象就是基于面向过程的. 举个例子:把大象放进冰箱中. 面向过程: 用我们程序模拟 (java是纯面向对象语言) class Demo{ public static void main(String[] args){ /* 这几个动作相当于功能 既然是功能就用方法封装 */ //先打开冰箱门 open();

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

黑马程序员---Java反射机制学习

由现在这个时间补上反射机制的学习笔记,本想报20期的JavaEE班,无奈真担心自己过不去,所以这段时间,一直的复习现在改报21期的吧!! 准备知识:一 1.Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method:    其中class代表的时类对象,    Constructor-类的构造器对象,    Field-类的属性对象,    Method-类的方法对象. 2.在Java中,每个class都有一个相应的Class对象.也就是说,当我们编写一

黑马程序员——JAVA数组学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 学习数组,学会如何声明,如何遍历,如何获取最值,还有交换,排序方法就差不多了,因为后期都是使用集合的更多. 一维数组1)   int[] a;   //声明,没有初始化 2)   int[] a=new int[5];   //初始化为默认值,int型为0 3)   int[] a={1,2,3,4,5};   //初始化为给定值 4)   int[] a=ne

黑马程序员--java基础学习笔记8

 一.笔记内容概述: 面向对象(数组工具对象建立-文档注释-单例设计模式&内存图解).继承.单继承和多重继承. 二.常用内容介绍: 1.继承的好处:提高了代码的复用性;让类与类之间产生了关系;开发最终的核心内容:不断地创建对象,使用对象,并维护着对象之间的关系. 2.什么时候使用继承? 当类与类之间存在着所属关系的时候,就定义继承;java不直接支持多继承,因为多个父类中如果有相同成员时,就会出现调用的不确定性;java中通过多实现implements的方式来间接体现多继承; 3.如何学习一

黑马程序员---java反射机制的实现原理

------- android培训.java培训.期待与您交流! ---------- 反射机制就是java语言在运行时拥有一项自观的能力. 通过这种能力可以彻底的了解自身的情况为下一步的动作做准备. 下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method: 其中class代表的时类对象, Constructor-类的构造器对象, Field-类的属性对象, Method-类的方