散列技术可以提供与数据规模无关的固定访问速度,这在大数据时代尤其重要。散列技术通过散列函数与冲突解决来实现快速访问。
通过数学公式计算 •从键值映射到某个地址空间 •目标空间比键空间要小
–有可能会冲突
–冲突需要解决方法
–最简单的方案是顺序向后寻找空位
散列特点 •不管数据规模,查找速度恒定 •空间比实际需要多 •是空间换时间的典范
HashSet利用了其内部使用散列算法的便利,它判断重复的方法是:首先用hashCode来排除大部分的重复断定;再对“疑似”重复的,通过equals函数做最后的判定。
PS:java垃圾回收是定时的,循环变量最好声明在外边
package com.zhangle.arithmetic;
import java.util.HashSet;
import java.util.Set;
class Person{
private String name;
private int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public String toString(){
return name+" is "+age;
}
public boolean equals(Object x) {
if ((x instanceof Person)==true) {
Person p=(Person)x;
if (this.name==p.name&&this.age==p.age) {
return true;
}
}
return false;
}
//只是在equals中返回true是不够的,还得确保hashcode相同,equals只是比较内容
public int hashCode() {
return name.hashCode()+age;
}
}
public class HashSetTest {
public static void main(String[] args) {
//string的内容放在字符串区,不允许重复,equals比较是直接比较内容
/* Set<String> a=new HashSet<String>();
a.add("abc");
a.add("xyz");
a.add("abc");
System.out.println(a);*/
//类比较先检查hashcode,再检查equals比较内容,两个都是true,才说明是真的相同
Set<Person> b=new HashSet<Person>();
b.add(new Person("kane",10));
b.add(new Person("kane",11));
b.add(new Person("kane",10));
b.add(new Person("li",10));
System.out.println(b);
}
}