`
LiYinlei
  • 浏览: 68513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Set集合下的子类HashSet、TreeSet

阅读更多
 Set:无序,不可以重复。
 Set集合集合中的方法和Collection是一致的。它的取出方式只有一种。迭代器。
 
 	 |-HashSet:底层数据结构是哈希表,该集合是线程不同步的。
			HashSet集合是如何保证元素唯一性的呢?
			通过元素的hashCode方法和equals方法来完成的唯一性的判断。
			如果hashCode值相同,再继续判断元素的equals方法是否为true
			如果hashCode值不同,不会判断equals方法。
			
			HashSet的contains和remove依据都是hashCode方法,如果该方法返回值相同,才判断equals方法。
			
	 |-TreeSet:它可以给Set集合中的元素进行指定方式的排序。也是线程不同步的。
			保证元素唯一性的方式:通过比较的结果是否为0.
			底层数据结构是:二叉树。(红黑树结构)
		
            排序第一种方式:学生需要进行比较,就必须要让学生具备比较性。那么,就需要学生实现Comparable接口,强制让学生具备比较性。
			复写Comparable接口里的 int CompareTo()方法,此方法的返回值有三种,
			负数:该元素小于被对比的元素
			0,该元素等于被对比的元素
			正数:该元素排序的顺序大于被对比的元素,即排序越靠后。
			让元素自身具备比较性。只要让元素实现java.lang.Comparable接口,覆盖compareTo方法即可。
			
			但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
			比如,学生的自然排序是按年龄排序,现在想要按照学生姓名排序。还可以不改动原有代码。
			这时怎么办呢?
		排序的第二种方式:自定比较器的方式。
			这时可以让集合自身具备比较性。
			可以定义一个类实现java.util.Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数
			传递给TreeSet集合构造函数。

 

 下面看一下HashSet的一个例子:

 

public class HashSetOverView {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add(new Person("abc0",20));
		hs.add(new Person("abc6",26));
		hs.add(new Person("abc1",21));
		hs.add(new Person("abc6",26));
		Iterator it = hs.iterator();
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			System.out.println(p.getName()+"--"+p.getAge());
		}
		
//		System.out.println(hs.contains(new Person("abc6",26)));这样的话会调用equals方法,删掉相同的人。
	}
}

class Person 
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	
	public int hashCode()
	{
		System.out.println(this.name+"...hashCode");
		final int NUMBER = 49;
		return name.hashCode()+age*NUMBER;
	}
	
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Person))
			throw new ClassCastException("类型不匹配");
		Person p = (Person)obj;
		System.out.println(this.name+"  equals run  "+p.name);
		return this.name.equals(p.name) && this.age==p.age;
	}
	public String toString()
	{
		return name+"::"+age;
	}
}

 HashSetOverView类的main方法执行结果为:

abc0...hashCode

abc6...hashCode

abc1...hashCode

 

abc6...hashCode

abc6  equals run  abc6

 

abc0--20

abc1--21

 

abc6--26

 

下面在看一下TreeSet集合的一个例子是怎样保持元素有序与唯一性的

 

package cn.java.collection.set;

import java.util.TreeSet;

/*TreeSet的第一种比较方式,并用数据类型本身的比较方法。需要比较的元素实现compareble接口,并实现其compareTo方法*/
//年龄相等的情况下,用姓名排序
public class TreeSetDemo {
	
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();

		ts.add(new Student1("lisi0:",30));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi9:",29));
		ts.add(new Student1("lisi8:",38));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi4:",14));
		ts.add(new Student1("lisi7:",27));
		System.out.println(ts);

	}

}
//让元素自身具备比较性
class Student1 implements Comparable{
	private String name;
	private int age;
	Student1(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public int compareTo(Object o) {
		Student1 stu=(Student1)o;
		int num=new Integer(this.age).compareTo(new Integer(stu.age));
		return num==0?this.name.compareTo(stu.name):num;
		/*Student stu=(Student)o;
		if(this.age>stu.age)
		return 1;
		if(this.age==stu.age)
			return 0;
		return 1;*/
	}
	
	public String toString() {
		return name+this.age;
	}
}

 

上面TreeSetDemo的main方法执行的结果为:

[lisi4:14, lisi7:27, lisi9:29, lisixx:29, lisi0:30, lisi8:38]

此类里的compareTo方法既是可以决定排序关键,也是保证唯一性的关键 

 

TreeSet排序的第二种方式:

 

package cn.java.collection.set;

import java.util.Comparator;
import java.util.TreeSet;

/*
TreeSet:它可以给Set集合中的元素进行指定方式的排序。
		保证元素唯一性的方式:通过比较的结果是否为0.
		底层数据结构是:二叉树。

		排序的第一种方式:
			让元素自身具备比较性。只要让元素实现java.lang.Comparable接口,覆盖compareTo方法即可。
			
			但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
			比如,学生的自然排序是按年龄排序,现在想要按照学生姓名排序。还可以不改动原有代码。
			这时怎么办呢?
		排序的第二种方式:自定比较器的方式。
			这时可以让集合自身具备比较性。
			可以定义一个类实现java.util.Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数
			传递给TreeSet集合构造函数。

			该对象就是比较器。
*/
public class TreeSetDemo3 {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet(new StudentComparatorByName());

		ts.add(new Student1("lisi0:",30));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi9:",29));
		ts.add(new Student1("lisi8:",38));
		ts.add(new Student1("lisixx:",29));
		ts.add(new Student1("lisi4:",14));
		//ts.add(new Student(39));
		ts.add(new Student1("lisi7:",27));

		System.out.println(ts);
	}

}


/*
 * 创建一个比较器,实现comparator
 */
class StudentComparatorByName implements Comparator<Student1>{

	@Override
	public int compare(Student1 s1, Student1 s2) {
		Student1 stu=(Student1)s1;
		Student1 stu2=(Student1)s2;
		int num=stu.getName().compareTo(stu2.getName());
		return num==0?new Integer(stu.getAge()).compareTo(new Integer(stu2.getAge())):num;
	}
}
//让元素自身具备比较性
class Student1 implements Comparable{
	private String name;
	private int age;

	Student1(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	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;
	}
	@Override
	public int compareTo(Object o) {
		Student1 stu=(Student1)o;
		if(this.age>stu.age)
		return 1;
		if(this.age==stu.age)
			return 0;
		return 1;
	}
	
	@Override
	public String toString() {
		return this.getName()+this.age;
	}
}

 TreeSet排序的第二种方式执行结果为:

 

[lisi0:30, lisi4:14, lisi7:27, lisi8:38, lisi9:29, lisixx:29]

 

0
0
分享到:
评论

相关推荐

    List Set Map以及子类的比较 .docx

    HashSet、LinkedHashSet 和 TreeSet 是 Set 集合的三个常用的实现类。HashSet 使用 Hash 表结构,查询速度快,但不保证元素的顺序。LinkedHashSet 继承了 HashSet,添加了链表结构,保证了元素的顺序。TreeSet 使用...

    JavaSE专题-Set集合.doc

    Set集合是JavaSE中的一种重要数据结构,主要包括HashSet、TreeSet和LinkedHashSet三个子类。下面我们将对Set集合的原理、特点、使用场景等进行详细的探索和分析。 HashSet HashSet是Set集合中的一种重要实现类,...

    HashMap与HashTable和HashSet的区别

    在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程需求。本文将重点分析这三种数据结构之间的区别,特别是针对...

    大学课程讲义-Java基础-Java集合.pptx

    Set 集合的实现类有 HashSet、LinkedHashSet 和 TreeSet 等。HashSet 是 Set 接口的典型实现,使用 Hash 算法来存储集合中的元素,具有很好的存取和查找性能。LinkedHashSet 是 HashSet 的子类,使用链表维护元素的...

    Java中Set的深入研究

    `LinkedHashSet`是`HashSet`的一个子类,它通过链接列表保持了元素的插入顺序。这意味着`LinkedHashSet`不仅去重,还能保留元素的插入顺序。与`HashSet`相比,`LinkedHashSet`的迭代性能更好,因为它可以按照元素...

    java基础之集合面试题共4页.pdf.zip

    面试中,可能会问到如何选择合适的集合类型、集合操作的时间复杂度、并发环境下集合的选择、集合的扩容策略等问题。掌握这些核心概念和使用技巧,对于理解和应用Java集合框架至关重要。这份资料应该涵盖了这些主题,...

    浅谈JAVA集合框架及其应用.pdf

    Set接口继承自Collection接口,其子类包括HashSet和TreeSet。HashSet内部通过HashMap实现,不保证元素的顺序,但插入、删除和查找操作的平均时间复杂度为O(1)。TreeSet内部通过TreeMap实现,元素会按照自然顺序或...

    Java集合排序及java集合类详解.pdf

    Set主要用于存储无序且不允许重复的元素集合,常用的实现类有HashSet和TreeSet。Map接口是双列集合的根接口,主要存储键值对的映射关系,常用的实现类有HashMap、TreeMap和Properties。 Java集合框架中排序主要是...

    Java回顾(六)Set集合

    【Java回顾(六)Set集合】 Set集合是Java编程中常用的一种数据结构,它与List、Map同属于Java ...了解和掌握HashSet、LinkedHashSet和TreeSet等子类的特性和用法,有助于我们更好地利用Set集合来解决实际问题。

    JAVA集合类[参考].pdf

    总结来说,Java集合框架中的`Set`接口及其实现类如`HashSet`和`TreeSet`提供了不同特性的对象存储解决方案。`HashSet`注重效率,不保证顺序,而`TreeSet`则提供了排序功能。理解和掌握这些集合类的使用,对于进行...

    数组和集合的学习笔记

    **Set** 是不允许有重复元素的集合,主要有HashSet、TreeSet两种实现。 1. **HashSet** - 特点:基于哈希表实现,提供较快的添加和查找速度。 - 使用场景:当需要存储不重复且不需要排序的元素时,使用HashSet...

    java集合使用大全

    常用的实现子类有 HashSet、TreeSet 和 LinkedHashSet * Queue&lt;E&gt; 接口:队列,里的元素采用队列方式存储 * Map,V&gt; 接口:存放“键值”对的接口,键不允许重复。常用的实现子类有 HashMap 和 TreeMap

    java集合常见面试题.rar

    - **Set**:无序且不允许重复元素的集合,如HashSet和TreeSet。 - **Queue**:遵循先进先出(FIFO)原则的数据结构,如LinkedList可以作为队列使用。 - **Map**:存储键值对的数据结构,如HashMap和TreeMap。 2....

    Java集合排序及java集合类详解(Collection、List、Map、Set

    `Collection`是Java集合框架的根接口,所有具体集合类都是它的子类。`Collection`提供了一组通用的方法来处理元素集合。 #### 1.2.1 常用方法 - `add(E e)`:向集合中添加一个元素。 - `remove(Object o)`:从集合...

    Java集合排序及java集合类详解(Collection、List、Map、Set)

    `Set`的主要实现包括`HashSet`、`LinkedHashSet`、`TreeSet`等。 - **HashSet**:基于`HashMap`实现,不允许重复元素。 - **LinkedHashSet**:保持元素的插入顺序。 - **TreeSet**:基于`TreeMap`实现,支持元素的...

    集合框架及泛型资料

    HashSet和TreeSet是主要实现类,HashSet基于哈希表,插入和查找速度快;TreeSet基于红黑树,元素自动排序。 3. **Queue接口**:表示队列,先进先出(FIFO)原则。LinkedList可以作为Queue的实现。 4. **Map接口**...

    java集合框架图

    - **`next()`**:返回集合中的下一个元素。 - **`remove()`**:从集合中移除上一次`next()`方法返回的元素。 #### 五、操作方法详解 1. **添加/删除操作**: - `add(Object o)`:向集合中添加一个元素。 - `...

    java常用的几种集合.doc

    在Java中,集合类主要位于`java.util.*`包下,它们提供了多种数据结构,包括Set、List、Map以及Queue,这些数据结构都有各自独特的特性和用途。 **Set集** Set接口是最基础的集合类型之一,它不包含重复的元素。当...

Global site tag (gtag.js) - Google Analytics