您的位置:首页 > 其它

HashSet的底层实现了解和使用方法

2013-09-23 11:58 344 查看
HashSet:实现了Set接口的一个类。
90、 关于 Object 类的 equals 方法的特点
a) 自反性:x.equals(x)应该返回 true
b) 对称性:x.equals(y)为 true,那么 y.equals(x)也为 true。
c) 传递性:x.equals(y)为 true 并且 y.equals(z)为 true,那么 x.equals(z)也应该为 true。
d) 一致性:x.equals(y)的第一次调用为 true,那么 x.equals(y)的第二次、第三次、第 n
次调用也应该为true,前提条件是在比较之间没有修改 x 也没有修改 y。
e) 对于非空引用 x,x.equals(null)返回 false。
91、 关于 Object 类的 hashCode()方法的特点:
a) 在 Java 应用的一次执行过程当中,对于同一个对象的 hashCode 方法的多次调用,
他们应该返回同样的值(前提是该对象的信息没有发生变化)。
b) 对于两个对象来说,如果使用 equals 方法比较返回 true,那么这两个对象的 hashCode值一定是相同的。
c) 对于两个对象来说,如果使用 equals方法比较返回false,那么这两个对象的 hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
d) 对于Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode
值表示的是对象的地址)。
92、 当使用 HashSet 时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code 值是否与增加的对象的 hash code 值一致;如果不一致,直接加进去;如果一致,再进行 equals
方法的比较,equals 方法如果返回 true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

93、 如果我们重写 equals 方法,那么也要重写 hashCode 方法,反之亦然。
94、

public class TestSet {

public static void main(String[] args) {

HashSet set = new HashSet();

System.out.println(set.add("a"));

set.add("b");

set.add("c");

set.add("d");

System.out.println(set.add("a"));

System.out.println(set);

}

}

public class TestSet1 {

public static void main(String[] args) {

HashSet set = new HashSet();

//People p1 = new People("zhangsan");

//People p2 = new People("lisi");

//People p3 = new People("zhangsan");

//set.add(p1);

//set.add(p2);

//set.add(p3);

//System.out.println(set);

//People p1 = new People("zhangsan");

//set.add(p1);

//set.add(p1);

//System.out.println(set);

String s1 = new String("a");

String s2 = new String("a");

System.out.println(s1.hashCode()== s2.hashCode());//比较字符串的 hash code

set.add(s1);

set.add(s2);

System.out.println(set);

}

}

class People{

String name;

People(String name){

this.name = name;

}

}


String 的方法:hashCode源码:

public int hashCode() {

int h = hash;

if (h == 0) {

int off =offset;

char val[] =value;

int len =count;

for (int i = 0; i < len; i++) {

h = 31*h + val[off++];

}

hash = h;

}

return h;

}


String 对象的哈希码根据以下公式计算:

s[0]*31^(n-1) +s[1]*31^(n-2) + ... + s[n-1]
实际上String的hash code就是字符串的内容。
95、举例:

public class TestSet2 {

public static void main(String[] args) {

HashSet set = new HashSet();

Student s1 = new Student("zhangsan");

Student s2 = new Student("zhangsan");

set.add(s1);

set.add(s2);

System.out.println(set);

}

}

class Student{

String name;

Student(String name){

this.name = name;

}

public int hashCode(){

return this.name.hashCode();

}

public boolean equals(Object obj){

if(this == obj){

return true;

}

if(obj !=null && obj instanceof Student){

Student s = (Student)obj;

if(name.equals(s.name)){

return true;

}

}

return false;

}

}


在使用HashSet时,要重写equals和hashCode方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐