Java笔记:Java集合概述和Set集合(三)

2014-11-24 09:26:32 · 作者: · 浏览: 3
books.add(new C());
books.add(new C());
System.out.println(books);
}
}
注意问题:当把一个对象放入HashSet中时,如果需要重写该对象对应类的equals()方法,则也应该重写其hashCode()方法。其规则是:如果两个对象通过equals()方法比较返回true,则两个对象的hashCode值也应该相同。
重写hashCode()方法的基本规则:
1)在程序运行过程中,同一个对象多次调用hashCode()方法应该返回相同的值。
2)当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法应返回相等的值。
3)对象中用作equals()方法比较标准的Field,都应该用来计算hashCode值。
如果向HashSet中添加一个可变对象后,后面程序修改了该可变对象的Field,则可能导致它与集合中的其他元素相同,这就可能导致HashSet中包含两个相同的对象。
eg:
package cn.it.lsl;
import java.util.HashSet;
import java.util.Iterator;
class R{
int count;
public R(int count){
this.count = count;
}
public String toString(){
return "R[count:" + count + "]";
}
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj != null && obj.getClass() == R.class){
R r = (R)obj;
if(r.count == this.count){
return true;
}
}
return false;
}
public int hashCode(){
return this.count;
}
}
public class HashSetTest2 {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
System.out.println(hs);
Iterator it = hs.iterator();
R first = (R)it.next();
first.count = -3;
System.out.println(hs);
hs.remove(new R(-3));
System.out.println(hs);
System.out.println("hs是否包含count为-3的R对象?" + hs.contains(new R(-3)));
System.out.println("hs是否包含count为5的R对象?" + hs.contains(new R(5)));
}
}
当向HashSet中添加可变对象时,必须十分小心。如果修改HashSet集合中的对象,有可能导致该对象与集合中的其他对象相等,从而导致HashSet无法准确访问该对象。
2)LinkedHashSet类
HashSet还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
package cn.it.lsl;
import java.util.LinkedHashSet;
public class LinkedHashSetTest {
public static void main(String[] args) {
LinkedHashSet books = new LinkedHashSet();
books.add("java");
books.add("Android");
System.out.println(books);
books.remove("java");
books.add("java");
System.out.println(books);
}
}
输出LinkedHashSet集合的元素时,元素的顺序总是与添加顺序一致。
虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但LinkedHashSet依然是HashSet,因此它依然不允许集合元素重复。
3)TreeSet类
TreeSet是SortedSet接口的实现类,可以确保集合元素处于排序状态。
TreeSet中的几个方法:
Object first():返回集合中的第一个元素。
Object last():返回集合中的最后一个元素。
Object lower(Object e):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参数元素不需要是TreeSet集合里的元素)。
Object higher(Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参数元素不需要是TreeSet集合里的元素)。
SortedSet subSet(formElement,toElement):返回次Set的子集合,范围从formElement(包含)到toElement(不包含)。
SortedSet headSet(toElement):返回此Set的子集,由小于toElement的元素组成。
SortedSet tailSet(fromElement):返回此Set的子集,由大于或等于fromElement的元素组成。
package cn.it.lsl;
import java.util.TreeSet;
public class TreeSetTree {
public static void main(String[] args) {
TreeSet nums = new TreeSe