JavaSE-集合Set

package com.btp.t4;

import java.util.HashSet;
import java.util.Set;
import java.util.*;
import org.junit.Test;

/*
 * Collection接口
 *              |--------List接口:存储有序的,可以重复的元素
 *                        |--------ArrayList(主要的实现类)
 *                        |--------LinkedList(适合频繁的插入,删除操作)
 *                        |--------Vector(古老的,线程安全的,但效率要低于ArrayList)
 *              |--------Set接口:存储无序的,不可重复的元素.Set中常用的方法都是Collection下定义的
 *                        |--------HashSet(主要实现类)
 *                        |--------LinkedHashSet
 *                        |--------TreeSet
 *                        
 *                        
 * Set:存储的元素是无序的,不可重复的
 * 1.无序性:无序性 != 随机性。真正的无序性指的是元素在底层存储的位置是无序的
 * 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去
 * 
 * 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。进而保证Set元素的不可重复性
 * 
 * Set中的元素存储方法:使用了哈希算法
 * 当向Set中添加对象时,首先调用此对象中所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在
 * Set中的存储位置。若此位置之前没有存储对象,则这个对象直接存储到此位置,若此位置已有对象存储,再通过equals
 * 方法比较这两个对象是否相同。如果相同,则后一个对象就不能再添加进来。一般不会出现hashCode相同而equals返回false
 * >要求:hashCode方法和equals方法一致
 * 
 * LinkedHashSet:
 * 1.LinkedHashSet:使用链表维护了一个添加进集合的顺序,导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的
 * 2.LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能
 * 
 * TreeSet
 * 1.向TerrSet中添加的元素必须是同一类的
 * 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历(因为它们都重写了Comparable接口中的方法)
 * 3.当自定义类没有实现Comparable接口时,当向TreeSet集合中添加自定义类的对象时,报错
 * 4.当向TreeSet中添加自定义类的对象时,有两种排序方法①自然排序②定制排序
 * 5.自然排序:要求自定义类实现java.lang.Comparable接口并重写其中的comparaTo(Object o)方法.在此方法中,指明按照自定义类的哪个属性进行排序
 * 6.向TreeSet中添加对象的时候,首先按照comparaTo()方法进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,
 *   进而后一个对象不能添加进来
 * >comparaTo(),hashCode()和equals()方法保持一致
 */
public class TestSet {
	
	@Test
	public void testHashSet(){
		Set set=new HashSet();
		
		set.add(123);
		set.add(456);
		set.add(new String("AA"));
		set.add(new String("BB"));
		set.add(null);
		Person1 p1=new Person1("GG",12);
		Person1 p2=new Person1("GG",12);
		set.add(p1);
		set.add(p2);//如果没有重写Person1的equals方法和HashCode方法,那么就算Person1的两个对象属性都相同,也是可以都加到set中
		//所以还是需要同时重写加进去的对象的equals方法和HashCode方法,才能实现不可重复性
		System.out.println(set.size());
		System.out.println(set);//无序:但是不是随机的
	}
	
	
	@Test
	public void LinkedHashSet(){
		Set set=new LinkedHashSet();
		
		set.add(new String("AA"));
		set.add(123);
		set.add(456);
		set.add(new String("BB"));
		set.add(null);
		Iterator iterator=set.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
	
	@Test
	public void TreeSet1(){
        Set set=new TreeSet();
        set.add(new String("AA"));
		set.add(new String("BB"));
		set.add("JJ");
		set.add("JJ");
		set.add("MM");
		for(Object str:set)
		{
			System.out.println(str);
		}
		
	}
	
	@Test
	public void TreeSet2(){
		 Set set=new TreeSet();
		 set.add(new Person1("MM",16));
		 set.add(new Person1("AA",13));
		 set.add(new Person1("CC",21));
		 set.add(new Person1("ZZ",199));
		 set.add(new Person1("BB",99));
		 set.add(new Person1("XX",99));
		 for(Object str:set)
			{
				System.out.println(str);
			}
	}
	
	@Test
	public void TreeSet3(){
		//定制排序1
	//1.创建一个实现了Comparator接口的类对象
		Comparator com=new Comparator(){
			//向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个对象排序的
			@Override
			public int compare(Object o1, Object o2) {
				if(o1 instanceof Customer && o2 instanceof Customer){
					Customer c1=(Customer)o1;
					Customer c2=(Customer)o2;
					int i=c1.getId().compareTo(c2.getId());
					if(i==0){
						return c1.getName().compareTo(c2.getName());
					}
					return i;
				}
				return 0;
			}
		};
		//将此对象作为形参传递给TreeSet的构造器中
		TreeSet set=new TreeSet(com);
		//向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
		set.add(new Customer("AA",1003));
		set.add(new Customer("BB",1002));
		set.add(new Customer("GG",1004));
		set.add(new Customer("CC",1001));
		set.add(new Customer("DD",1001));
		
		for(Object str:set){
			System.out.println(str);
		}
	}
	


@Test
public void TreeSet4(){
	//定制排序2
	TreeSet set=new TreeSet(new Comparator(){
		public int compare(Object o1, Object o2) {
			if(o1 instanceof Customer && o2 instanceof Customer){
				Customer c1=(Customer)o1;
				Customer c2=(Customer)o2;
				int i=c1.getId().compareTo(c2.getId());
				if(i==0){
					return c1.getName().compareTo(c2.getName());
				}
				return i;
			}
			return 0;
		}
	});
	//向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
	set.add(new Customer("AA",1003));
	set.add(new Customer("BB",1002));
	set.add(new Customer("GG",1004));
	set.add(new Customer("CC",1001));
	set.add(new Customer("DD",1001));
	
	for(Object str:set){
		System.out.println(str);
	}
}

}

class Customer{
	private String name;
	private Integer id;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	public Customer(String name,Integer id)
	{
		super();
		this.name=name;
		this.id=id;
	}
	public Customer()
	{
		super();
	}
	@Override
	public String toString() {
		return "Customer [name=" + name + ", id=" + id + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Customer other = (Customer) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	
}

class Person1 implements Comparable{
	String name;
	Integer 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 Person1(String name,int age) {
		super();
		this.name=name;
		this.age=age;
	}
	@Override
	public String toString() {
		return "Person1 [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person1 other = (Person1) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	//当向TreeSet中添加Person1类对象时,依据此方法,确定按照哪个属性排列
	@Override
	public int compareTo(Object o) {
		if(o instanceof Person1){
			Person1 p=(Person1)o;
			int i=this.age.compareTo(p.age);
			if(i==0){
				return this.name.compareTo(p.name);
			}else{
				return i;
			}
			
		}
		return 0;
	}
	
	
	
	
	
}

  

posted @ 2016-01-27 12:37  GGRoddick  阅读(159)  评论(0编辑  收藏  举报