22.Set接口的实现类:
Set接口存放的元素是无序的且不包含重复元素。
1>实现类HashSet:
HashSet类根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到。HashSet不保存元素的添加的顺序。
例子:
import java.util.HashSet;
import java.util.Iterator;
public class Student {
public static void main(String[] args) {
HashSet
hs = new HashSet
(); hs.add("1 zxx"); hs.add("1 zxx"); hs.add("2 hahx"); hs.add("3 zyj"); hs.add("4 bmh"); Iterator
it = hs.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }
输出结果:
1 zxx
4 bmh
3 zyj
2 hahx
因为Set集合中不能存放重复的元素,所以对于自定义的类,要重写hashCode()和equals()方法,用来判断元素是否为重复对象。
例子:
public class Student {
private int age;
private String name;
// get、set方法省略
public Student(int age, String name) {
this.age = age;
this.name = name;
}
// 重写HashCode方法
public int hashCode() {
return age * name.hashCode();
}
// 重写equals方法
public boolean equals(Object obj) {
Student s = (Student) obj;
return age == s.age && name.equals(s.name);
}
}
注:如果两个对象相同,那么它们额hashCode值一定要相同;如果两个对象的hashCode值相同,他们并不一定相同。
2>实现类LinkedHashSet:
LinkHashSet类根据元素的哈希码进行存放,同时用链表记录元素的加入顺序。
简单的字符集合例子:
import java.util.Iterator;
import java.util.LinkedHashSet;
public class TestLinkedHashSet {
public static void main(String[] args) {
//创建一个LinkedHashSet集合对象
LinkedHashSet
lhs = new LinkedHashSet
(); //向集合对象中添加字符串 lhs.add("zxx"); lhs.add("abc"); lhs.add("hik"); lhs.add("hik"); lhs.add(null); //生成一个迭代器 Iterator
it = lhs.iterator(); //输出字符串 while(it.hasNext()){ System.out.println(it.next()); } } }
输出为:
zxx
abc
hik
Null
自定义对象的集合使用例子:
创建Student对象:
public class Student {
//创建属性
private int age;
private String name;
//生成属性的get和set方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//包含参数的构造函数
public Student(int age, String name) {
this.age = age;
this.name = name;
}
//重写toString方法
public String toString() {
return "age :" + age + " name :" + name;
}
// 重写HashCode方法
public int hashCode() {
return age * name.hashCode();
}
// 重写equals方法
public boolean equals(Object obj) {
Student s = (Student) obj;
return age == s.age && name.equals(s.name);
}
}
测试LinkedHashSet的主函数:
import java.util.Iterator;
import java.util.LinkedHashSet;
public class TestLinkedHashSet {
public static void main(String[] args) {
//创建一个LinkedHashSet集合对象
LinkedHashSet
lhs = new LinkedHashSet
(); //生成一些Student对象 Student sd1 = new Student(18, "zxx"); Student sd2 = new Student(23, "abc"); Student sd3 = new Student(25, "hik"); Student sd4 = new Student(25, "hik"); //向集合对象中添加Student对象 lhs.add(sd4); lhs.add(sd2); lhs.add(sd3); lhs.add(sd1); lhs.add(null); //生成一个迭代器 Iterator
it = lhs.iterator(); //输出字符串 while (it.hasNext()) { System.out.println(it.next()); } } }
输出:
age :25 name :hik
age :23 name :abc
age :18 name :zxx
null
注:通过链表来存储对象,一般插入和删除效率比较高,检索效率相对较低。
3>实现类TreeSet:
TreeSet的构造方法:
TreeSet(): 构造一个空树集。
TreeSet(Collection c): 构造一个树集,并添加集合c中的所有元素。
TreeSet(Comparator c): 构造一个树集,并且使用特定的比较器对其经行排序。
TreeSet(SortedSet s): 构造一个树集,添加有序集合s中的所有元素,并且使用与有序集s相同的比较器排序。
注意:放入TreeSet中的元素必须是可以排序的。假若要对加入的Student类经行排序,则要实现compareTo()方法,
那么就必须实现Comparable接口。
排序Student集合类例子:
Student中的代码:
public class Stude