Java学习笔记_22_Set接口的实现类(一)

2014-11-23 21:25:44 · 作者: · 浏览: 22

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