基础——HashSet和TreeSet类知识练习0523

package cn.mmc.day14;
import java.util.*;
/*
Set:无序,不可以重复元素。
	|--HashSet:数据结构是哈希表。线程是非同步的。
				保证元素唯一性的原理:判断元素的hashCode值是否相同。
				如果相同,还会继续判断元素的equals方法,是否为true。

	|--TreeSet:底层数据结构是二叉树。
				可以对Set集合中的元素进行排序。
				如果比较的结果返回负数放在二叉树的左子树(读取的TreeSet集合中的值,得到的结果是倒序)
				如果比较的结果返回整数放在二叉树的右子树(读取的TreeSet集合中的值,得到的结果是正序)
				保证元素唯一性的依据:
				原理:
				compareTo方法return 0.
				

				TreeSet排序的第一种方式:让元素自身具备比较性。(类的默认顺序)
				那样元素需要实现Comparable接口,覆盖compareTo方法。
				也种方式也成为元素的自然顺序,或者叫做默认顺序。

				TreeSet的第二种排序方式。
				当元素自身不具备比较性时,或者具备的比较性不是所需要的。
				这时就需要让集合自身具备比较性。
				在集合初始化时,就有了比较方式。
				
				定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
				定义一个类,实现Comparator接口,覆盖compare方法。
				
				当两种排序都存在时,以比较器为主。
				
				
				默认在二叉树取出的方式是先序遍历


需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。


记住,排序时,当主要条件相同时,一定判断一下次要条件。


*/


public class SetTest {

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	/**
	 * @param args
	 */

	public static void main(String[] args) 
	{
		
		
		HashSet hs = new HashSet();

		sop(hs.add("java01"));//true
		sop(hs.add("java01"));//false//元素不可以重复。原理:注意,对于判断元素是否存在,
		//以及删除等操作,依赖的方法是元素的hashcode和equals方法。
		
		
		TreeSet ts = new TreeSet();

		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));
		//ts.add(new Student("lisi007",20));
		//ts.add(new Student("lisi01",40));

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = (Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}
	}
}


class Student implements Comparable//该接口强制让学生具备比较性。//就要覆写compareTo方法
{
	private String name;
	private int age;

	Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	//比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,
	//则分别返回负整数、零或正整数。 
	//返回:	负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 

	public int compareTo(Object obj)	{

		//return 0;
		
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;

		System.out.println(this.name+"....compareto....."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			//当年龄相同时,还需要判断姓名是否相同,如果再有的其他次要条件
			return this.name.compareTo(s.name);
		}
		return -1;
		/**/
	}

	public String getName()
	{
		return name;

	}
	public int getAge()
	{
		return age;
	}
}



TreeSet不能装重复元素原理:
基础——HashSet和TreeSet类知识练习0523_第1张图片
HashSet不能装重复元素、取出元素原理图

基础——HashSet和TreeSet类知识练习0523_第2张图片

你可能感兴趣的:(hashset)