Java容器---Set: HashSet & TreeSet & LinkedHashSet

时间:2021-01-03 17:54:12

1.Set接口概述

       Set 保存重复的元素(如何判断元素相同呢?)。如果你试图将相同对象的多个实例添加到Set中,那么它就会阻止这种重复现象。 Set中最常被使用的是测试归属性,你可以很容易地询问某个对象是否在某个Set中。 正因如此,查找就成为了Set中最重要的操作,因此你通常都会选择一个HashSet 的实现,它专门对快速查找进行了优化

        Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为)。Set 是基于对象的值来确定归属性的

java.util Interface Set<E>

参数类型 : 由此集合维护的元素的类型
所有超类接口:Collection <E>, Iterable <E>
所有子类接口:NavigableSet <E>, SortedSet <E>
所有已知实现类: AbstractSetConcurrentHashMap.KeySetViewConcurrentSkipListSetCopyOnWriteArraySetEnumSet ,  HashSetJobStateReasonsLinkedHashSetTreeSet

2.Set常用实现类

(1)HashSet

     HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。由哈希表支持(实际上是一个HashMap实例,基于

HashMap来实现的,底层采用HashMap来保存元素。),天生就是为了提高查找效率的。

Java容器---Set: HashSet & TreeSet & LinkedHashSet Java容器---Set: HashSet & TreeSet & LinkedHashSet                

 

构造方法

Java容器---Set: HashSet & TreeSet & LinkedHashSet

所有方法

Java容器---Set: HashSet & TreeSet & LinkedHashSet

(2)TreeSet

     TreeSet 继承AbstractSet类,实现NavigableSet、Cloneable、Serializable接口。与HashSet是基于HashMap实现一样,TreeSet 同样是基于TreeMap 实现的。由于得到Tree 的支持,TreeSet 最大特点在于排序,它的作用是提供有序的Set集合

Java容器---Set: HashSet & TreeSet & LinkedHashSet
参数类型
      E - 由此集合维护的元素的类型
All Implemented Interfaces(实现接口):
     Serializable Cloneable Iterable <E>, Collection <E>, NavigableSet <E>
    Set <E>  SortedSet <E>

构造方法

Java容器---Set: HashSet & TreeSet & LinkedHashSet

常用方法

Java容器---Set: HashSet & TreeSet & LinkedHashSet

Java容器---Set: HashSet & TreeSet & LinkedHashSet

Java容器---Set: HashSet & TreeSet & LinkedHashSet

Java容器---Set: HashSet & TreeSet & LinkedHashSet

Java容器---Set: HashSet & TreeSet & LinkedHashSet

(3)LinkedHashSet

      LinkedHashSet 综合了链表+哈希表,根据元素的hashCode值来决定元素的存储位置,它同时使用链表维护元素的次序。

      当遍历该集合时候,LinkedHashSet 将会以元素的添加顺序访问集合的元素。

      对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。

Java容器---Set: HashSet & TreeSet & LinkedHashSet public class LinkedHashSet<E> extends
HashSet<E> 
implements Set<E>,Cloneable,Serializable

参数类型E ---由此集合维护的元素的类型
All Implemented Interfaces(实现接口):
Serializable Cloneable Iterable <E>, Collection <E>, Set <E>              

构造方法

Java容器---Set: HashSet & TreeSet & LinkedHashSet

方法(基本都是继承方法)

Java容器---Set: HashSet & TreeSet & LinkedHashSet

3.set演示

(1)HashSet

  1 public class HashSetDemo {
  2 
  3 	/**
 4 	 * @param args
 5 	 */
  6 	public static void main(String[] args) {
  7 
  8 		//1,创建一个Set容器对象。
  9 		Set set = new HashSet();//如果该成LinkedHashSet,可实现有序。
 10 
 11 		//2,添加元素。
 12 		set.add("abc");
 13 		set.add("nba");
 14 		set.add("heihei");
 15 		set.add("haha");
 16 		set.add("heihei");
 17 
 18 		//3,只能用迭代器取出。
 19 		for (Iterator it = set.iterator(); it.hasNext();) {
 20 			System.out.println(it.next());
 21 		}
 22 
 23 	}
 24 
 25 }
 26 

(2)TreeSet 

  1 public class TreeSetDemo2 {
  2 
  3 	/**
 4 	 * @param args
 5 	 */
  6 	public static void main(String[] args) {
  7 
  8 		//初始化TreeSet集合明确一个比较器。
  9 		Set set = new TreeSet(new ComparatorByName());
 10 
 11 		set.add(new Student("xiaoqiang",20));
 12 		set.add(new Student("daniu",24));
 13 		set.add(new Student("xiaoming",22));
 14 		set.add(new Student("tudou",18));
 15 		set.add(new Student("daming",22));
 16 		set.add(new Student("dahuang",19));
 17 
 18 		for (Iterator it = set.iterator(); it.hasNext();) {
 19 			Student stu = (Student)it.next();
 20 			System.out.println(stu.getName()+"::"+stu.getAge());
 21 		}
 22 	}
 23 
 24 }
 25 /**/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 26  * 自定义一个比较器,用来对学生对象按照姓名进行排序。
 27  * @author Administrator
 28  *
 29  */
 30 public class ComparatorByName extends Object implements Comparator {
 31 
 32 	@Override
 33 	public int compare(Object o1, Object o2) {
 34 
 35 		Student s1 = (Student)o1;
 36 		Student s2 = (Student)o2;
 37 
 38 		int temp = s1.getName().compareTo(s2.getName());
 39 
 40 		return temp==0?s1.getAge()-s2.getAge():temp;
 41 	}
 42 
 43 }
 44 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 45 public class Student implements Comparable {
 46 
 47 	private String name;
 48 	private int age;
 49 
 50 	public Student() {
 51 		super();
 52 
 53 	}
 54 	public Student(String name, int age) {
 55 		super();
 56 		this.name = name;
 57 		this.age = age;
 58 	}
 59 
 60 
 61 
 62 	/**
 63 	 *  覆盖hashCode方法。根据对象自身的特点定义哈希值。
 64 	 */
 65 	public int hashCode(){
 66 		final int NUMBER = 37;
 67 		return name.hashCode() + age*NUMBER;
 68 	}
 69 
 70 	/**
 71 	 * 需要定义对象自身判断内容相同的依据。覆盖equals方法。
 72 	 *
 73 	 */
 74 	public boolean equals(Object obj){
 75 
 76 		if(this == obj){
 77 			return true;
 78 		}
 79 
 80 		if(!(obj instanceof Student)){
 81 			throw new ClassCastException("类型错误");
 82 		}
 83 
 84 		Student stu = (Student)obj;
 85 
 86 		return this.name.equals(stu.name)&& this.age == stu.age;
 87 	}
 88 
 89 	public String getName() {
 90 		return name;
 91 	}
 92 	public void setName(String name) {
 93 		this.name = name;
 94 	}
 95 	public int getAge() {
 96 		return age;
 97 	}
 98 	public void setAge(int age) {
 99 		this.age = age;
100 	}
101 	@Override
102 	public String toString() {
103 		return "Student [name=" + name + ", age=" + age + "]";
104 	}
105 	/**
106 	 * 学生就具备了比较功能。该功能是自然排序使用的方法。
107 	 * 自然排序就年龄的升序排序为主。
108 	 */
109 	@Override
110 	public int compareTo(Object o) {
111 
112 		Student stu = (Student)o;
113 //		System.out.println(this.name+":"+this.age+"........"+stu.name+":"+stu.age);
114 		/*
115 		if(this.age>stu.age)
116 			return 1;
117 		if(this.age<stu.age)
118 			return -1;
119 		return 0;
120 		*/
121 
122 		/*
123 		 * 既然是同姓名同年龄是同一个人,视为重复元素,要判断的要素有两个。
124 		 * 既然是按照年龄进行排序。所以先判断年龄。在判断姓名。
125 		 */
126 		int temp = this.age - stu.age;
127 
128 		return temp==0?this.name.compareTo(stu.name):temp;
129 
130 	}
131 
132 
133 }
134 

 

2018-01-05

内容来自API1.8、Java编程思想、传智播客课程