Java_Set_TreeSet,HashSet

 

本博客为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/8864099

1.Set的子类

   (1).HashSet

       底层数据结构是哈希表,线程是不同步的,无序,高效;
       HashSet集合保证元素唯一性
           1).当元素的hashCode值不同
               那么不判断equals,元素添加会成功。
           2).当元素的hashCode值相同
               继续判断元素的equals是否为true。如果为true,则视为同一元素,添加不能成功,否则添加成功。

           关于HashCode的详细介绍>>

   (2).TreeSet

       TreeSet底层的数据结构就是二叉树,对Set集合中的元素的进行指定顺序的排序,不同步。

2.HashSet与TreeSet的比较

    (1).HashSet

           根据哈希值进行元素的重复检查,先hashCode()(可能的equals()),元素的顺序没有改变

   (2).TreeSet

          TreeSet中添加的元素自身具有比较性或者集合具有比较性比较性一定要有,由于String等实现了Comparable接口,这使得元素本身具有比较性!比较性的实现查看下面的说明。但元素和集合都具有比较性时,以集合比较器为主,没有则以元素比较器进行比较,会根据元素的比较重新排序

3.比较器

   1).让元素自身具备比较性

        A).元素类实现Comparable接口,class Person implements Comparable
        B).重写compareTo方法,public int compareTo(Object obj
        记忆:元素具有比较性故用形容词Comparable修饰,元素之间去比较compareTo()

   2).让容器自身具备比较性

        A).新建一类MyComparator,使其实现接口Comparator,class MyComparator implements Comparator
        B).重写compare方法,public int compare(Object obj1, Object obj2)
        记忆:新建比较器为名词Comparator,Comparator主动去比较,用动词compare();
    当两者比较器都存在时,以容器自身比较为主!

4.Tree代码实现

   1).让元素自身具备比较性

/*
前提(使元素具备比较性):Strawberry2013-04-28
	1).元素类必须实现Comparable接口,class Person implements Comparable
	2).必须重写compareTo方法,public int compareTo(Object obj)

在元素增加过程中即ts.add(new Person("java01", 11)),目的是使元素存放在集合适当的位置!
在此过程中,自动调用compareTo()方法,根据返回值来确定位置,负整数表示小鱼,正整数表示大于,零表示等于(添加不成功,已存在)
*/
import java.util.*;

class Person implements Comparable //实现接口Comparable
{
	private String name;
	private int age;
	Person(String name, int age)
	{
		this.name = name;
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}
	public String getName()
	{
		return this.name;
	}
	public int compareTo(Object obj)	//自动调用
	{
		if(!(obj instanceof Person))
			throw new RuntimeException("对象出错!");
		Person p = (Person)obj;
		if(this.getName().compareTo(p.getName()) < 0)
			return -1;
		if(this.getName().compareTo(p.getName()) == 0)
		{
			if(this.age < p.age)
				return -1;
			if(this.age == p.age)
				return 0;
		}
		return 1;
	}
}
class TreeSetTest
{ 
	public static void main(String[] args)
	{
		TreeSet ts = new TreeSet();

		ts.add(new Person("java01", 11));
		ts.add(new Person("java02", 22));
		ts.add(new Person("java04", 43));
		ts.add(new Person("java03", 33));
		ts.add(new Person("java03", 33));
		ts.add(new Person("java04", 44));
		ts.add(new Person("java04", 41));

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			sop("Name:" + p.getName() +"  Age:"+ p.getAge());
		}
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

   2).让容器自身具备比较性

/*
前提(容器自身具备比较性):Strawberry2013-04-28
	1).新建一类MyComparator,使其实现接口Comparator,class MyComparator implements Comparator
	2).重写compare方法,public int compare(Object obj1, Object obj2)

新建一类MyComparator,在元素增加过程中即ts.add(new Person("java01", 11)),目的是使元素存放在集合适当的位置!
在此过程中,自动调用比较器的compare方法!
*/
import java.util.*;

class Person implements Comparable
{
	private String name;
	private int age;
	Person(String name, int age)
	{
		this.name = name;
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}
	public String getName()
	{
		return this.name;
	}
	public int compareTo(Object obj)
	{
		if(!(obj instanceof Person))
			throw new RuntimeException("对象出错!");
		Person p = (Person)obj;
		if(this.getName().compareTo(p.getName()) < 0)
			return -1;
		if(this.getName().compareTo(p.getName()) == 0)
		{
			if(this.age < p.age)
				return -1;
			if(this.age == p.age)
				return 0;
		}
		return 1;
	}
}
class TreeSetTest2
{ 
	public static void main(String[] args)
	{
		TreeSet ts = new TreeSet(new MyComparator());	//构造一个新的空 TreeSet,它根据指定比较器进行排序。

		ts.add(new Person("java04", 33));
		ts.add(new Person("java03", 11));
		ts.add(new Person("java02", 43));
		ts.add(new Person("java03", 22));
		ts.add(new Person("java01", 33));
		ts.add(new Person("java02", 43));
		ts.add(new Person("java04", 41));

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			sop("Name:" + p.getName() +"  Age:"+ p.getAge());
		}
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

class MyComparator implements Comparator	//比较器
{
	public int compare(Object obj1, Object obj2)	//自动调用
	{
		Person p1 = (Person)obj1;
		Person p2 = (Person)obj2;

		if(p1.getAge() < p2.getAge())
			return -1;
		if(p1.getAge() == p2.getAge())
		{
			if(p1.getName().compareTo(p2.getName()) < 0)
				return -1;
			if(p1.getName().compareTo(p2.getName()) == 0)
				return 0;
		}
		return 1;
	}
}

4.HashSet代码实现

/* 
    HashSet判断对象相等的过程 
 
在元素增加过程中,即hs.add(new Person("java01", 11));即判断是否存在重复元素 
    1).首先自动判断对象的hashCode,如果hashCode不相等则添加成功; 
    2).若果hashCode相等,则判断元素根据equals方法判断是否存在相等元素。 
*/  
import java.util.*;  
  
class Person  
{  
    private String name;  
    private int age;  
    Person(String name, int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
    public int getAge()  
    {  
        return this.age;  
    }  
    public String getName()  
    {  
        return this.name;  
    }  
    public int hashCode()  
    {  
        return this.name.hashCode() + this.age*17;  //为了防止hashCode值相等,变相的乘以一个素数  
    }  
    public boolean equals(Object obj)               //只有在hashCode值相等情况下执行     
    {  
        if (!(obj instanceof Person))  
            return false;  
        Person p = (Person)obj;  
        System.out.println(this.name+"..."+p.getName());  
        return this.name.equals(p.getName()) && this.age==p.getAge();  
    }  
}  
class HashSetTest  
{   
    public static void main(String[] args)  
    {  
        HashSet hs = new HashSet();  
  
        hs.add(new Person("java01", 11));  
        hs.add(new Person("java02", 22));  
        hs.add(new Person("java03", 33));  
        hs.add(new Person("java03", 33));  
        hs.add(new Person("java04", 44));  
  
        Iterator it = hs.iterator();  
        while(it.hasNext())  
        {  
            Person p = (Person)it.next();  
            sop("Name:" + p.getName() +"  Age:"+ p.getAge());  
        }  
    }  
    public static void sop(Object obj)  
    {  
        System.out.println(obj);  
    }  
}  

你可能感兴趣的:(集合,set,HashCode,hashset,TreeSet)