for java beginner13java 反射 数组的反射(上)其实是讲ArrayList HashSet HashCode

java 反射 数组的反射(上)其实是讲ArrayList HashSet HashCode

ArrayList HashSet HashCode
--------------------
package com.ncs;

public class Point {



private int x;
public int y;

public String s1 ="ball";
public String s2="hubin";
public String s3="zhangxiaoxiang";
//做实验而已,字段不可能是 public 的

public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}

// @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;
final Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}

}

--------------------------------
package com.ncs;

import java.util.Collection;
import java.util.HashSet;

public class ReflectInCollection {

public static void main(String[] args) {
//Collection collection = new ArrayList();
Collection collection = new HashSet();
Point p1 = new Point(3,3);
Point p2 = new Point(5,5);
Point p3 = new Point(3,3); //看看和 p1有什么不一样
collection.add(p1);
collection.add(p2);
collection.add(p3);
collection.add(p1);

System.out.println(collection.size()); //4

//如果 ArrayList() 换成 HashSet() //3

//ArrayList类似数组,有顺序 你放进去 哪怕是同一个对象,放十次
//★就有十个格子新出来,只不过那十个格子存放的地址都一样,[因为刚刚说的是同一个对象嘛]
//所以ArrayList还可以插队,你插哪里你定好了

//HashSet()放东西前要 判断 里面是不是已经有了,有了不放, 不是覆盖★

//刚刚测试说明了 ,p1 和 p3 不是一个,如果你希望相同,就要自己写 eques方法
//★默认的eques方法通常是比较 hashcode ,hashcode是根据内存值算出来的

//现在回去修改 Point 类的两个方法 equals hashcode
//IDE有专门的 菜单的,看看好了
//自动生成 ,非常不错
//现在 HashSet() 变2了 认为 p1 == p3

//如果把public int hashCode() 去了,又变3了
//就是说 HashSet() 根据 hashCode() 方法判断两个对象是不是一样的

//hash这东西,有点难度的
//就比如说你不想存一样的东西到集合里吧,
//这个集合你怎么实现???一个一个判断????假如这个集合有上千亿条记录呢??
//假如你想放进去的记录是条新的,那是不是说你要比较千亿次后才可以放进去呢??
//有高手发明 一种哈稀 算法,把集合分若干 存储 区域 ,每个区域 存放 的对象匹配那个
//对象算出的Hash值,
//说白了就是你这个对象 算出来的 那个HASH码 只可以存到 特定的某段 区域里
//我找的时候也好找了

//再说白一点,每个object都可以算出 哈稀 值 ,
//当把这个对象 存到 具有HASH功能的集合的时候,★[存ArrayList之类的不管了]
//不是随便就可以存的,规定你只可以存特定某段内存
//要比较是不是一样,先到那一段内存 ,然后一个一个判断equals,
//有趣的是,我这段 没有 equals,其他段有的,JVM还是认为你没有,它只认那一段

//可见 hashset集合有很好的对象 检索功能,但是存储对象的效率会低一些,
//因为先要算你这个对象改放 哪段 内存呢!

//同一个对象在程序运行期间任何时候返回的 哈稀值 是始终不变的
//所以 即使两个对象的equals方法比较结果一样,他们默认的
//hashcode方法返回的值也是不一样的

//所以有一说法,你让两个对象的equals一样了,就也把 hashcode弄一样吧
//其实,如果你确定不会把对象放 hash功能的集合里,大可不管 hashcode
//一般来说
//只有类的实例对象要被采用哈稀算法进行存储和检索时,这个类才需要按照
//要求覆盖hashCode()方法,即使程序可能暂时不会用到当前类的
//hashCode()方法,但是为它提供一个hashcode()方法也没有什么不好
//所以通常这两个方法会同时覆盖,IDE也设计了这样的菜单

//通常,一个类的两个实例用equals比较一样时,他们的hashcode也必须一样
//但是反之就不一定了,"BB" "Aa"的equals肯定不一样,但是
//hashcode()返回的就是一样的

//★★最后,当一个对象存储进hash集合后,不要去修改这个对象里参与计算
//哈稀值的字段,要不然contains方法都检索不到了,到时候内存益出了..
}

}

-------------------------关于测试,下一篇再说一下吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值