`
hubin4
  • 浏览: 92965 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多
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方法都检索不到了,到时候内存益出了..
	}

}

-------------------------关于测试,下一篇再说一下吧
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics