set



import java.util.Collection;
import java.util.EnumSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

/* 2017-02-17 15:43:14
 *	set 不包含重复元素
 *	---HashSet
 *		按照Hash算法来存储集合中的元素,具有良好的存取和查找的性能
 *		不能保证元素的排列顺序
 *		不是同步的,线程不安全
 *		元素的值可以是null
 *
 *	存入元素时, 会先调用对象的hashCode方法来得到对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置
 *	判断连个元素相等的标准是同个对象通过equals方法比较相等,并且两个对象的hashcode方法返回值也相等
 *
 *	如果HashSet中两个以上的元素具有相同的hashCode值,将会导致性能下降
 *	
 *	如果使用HashSet   需要重写equals 方法和 hashCode 方法  尽量保证两个对象通过equals方法比较返回ture 时  他们的hashcode方法返回值也相等
 *
 *
 *
 *重写hashcode 的要求
 *同一个对象多次调用hashcode方法应该返回相同的值
 *当连个对象通过equals方法比较 返回ture时   两个对象的hashcode方法返回相等的值
 *对象中equals方法比较时  标准的实例变量,都应该用于计算hashcode值
 *
 *重写的一般步骤
 ******第一步: 把对象内每个有意义的实例变量(每个参与equals方法比较标准的实例变量) 计算出一个int类型的hashcode值 
 *  
 *		实例变量类型 
 *		boolean		hashcode = (f?0:1)
 *		整形(byte short char int) 	  hashcode = (int) f
 *		long  		hashcode = (int)(f^(f>>>32))
 *		float			hashcode = ( Float.floatToIntBits(f))
 *
 *		double		hashcode = (int)(f^(f>>>32))
 *					hashcode = double.doubleToLongBits(f)
 *
 *		引用类型			hashcode = f.hashcode();
 ******第二步:用第一步计算出来的多个hashcode值合计算出一个hashcode值返回
 *		return f1.hashcode() + (int)f2
 *		还可以乘以一个质数再相加
 *		
 *	当程序存储完对象后,尽量不要去修改该集合元素中参与计算hashcode equals的实例变量。否则导致无法正确操作这些集合
 *		-LinkHashSet
 *		这个是HashSet 的子类
 *		LinkHashSet 也是根据元素的hashCode值来决定元素的存储位置的,
 *		同时也使用链表维护元素的次序,使得元素以插入的顺序保存的
 *		当遍历的时候会按元素的添加的顺序来访问
 *	TreeSet 
 *	TreeSet 是 SortedSet的实现类  ,还可以确保集合元素处于的排序状态
 */
public class Setj {
		public static void main(String[] args) {
			 LinkedHashSet linkedHashSet = new LinkedHashSet();
			 linkedHashSet.add( "a");
			 linkedHashSet.add( "aasdad");
			 linkedHashSet.add( "asadasssssss");
			 linkedHashSet.add( "aaaa");
//			 System.out.println(linkedHashSet);
			 
			 
			 TreeSet treeSet = new TreeSet();
			 treeSet.add("treeset");
			 treeSet.add("set");
			 treeSet.add("tree");
			 treeSet.addAll(linkedHashSet);
//			 System.out.println(treeSet);
//			 System.out.println(treeSet.first());
//			 System.out.println(treeSet.last());
			 treeSet.comparator()   自然排序   来比较元素之间的大小关系
			 //当元素改变时,排序后的结果不会改变。
			 
//			 sortset();
			 
			 /*
			 System.out.println(1 < 2 ?  3 : 4 );   //3
			 System.out.println(3 < 5 ?  6 : 7 );   //6
			 System.out.println();
			 
			 System.out.println(1 < 2 ? 3 : 4 < 5 ? 6 : 7); //3
			 System.out.println (1 < 2 ? 3 : (4 < 5 ? 6 : 7));   //3  
			 
			 System.out.println(1 > 2 ? 3 : 4 < 5 ? 6 : 7); //6
			 System.out.println();			 
			 System.out.println((1 < 2 ? 3 : 4) < 5 ? 6 : 7);  //6
			 */
			 
//			 enumsetj();
			/*
			 * 各 set实现类的性能分析
			 * hashset 的性能总是比treeset 好(特别是常用的添加、查询元素等操作)
			 * 
			 * tree 需要额外的红黑树算法来维护集合元素的次序 
			 * 只当需要一个保持排序的时候才使用treeset 否则都是用hash set
			 * 
			 * 
			 * linkedset  由于使用链表    ,插入、删除操作 慢   。 但是遍历会更快
			 * 
			 * enumset 是所有set实现类中性能最好的,但只能保存同一个枚举类的枚举值作为集合元素
			 * 
			 * 
			 * 
			 * set 的三个实现类  HashSet TreeSet  EnumSet 都是线程不安全的
			 * 
			 * 可以通过collection 工具类的synchronizedSortedSet 方法来包装 set 集合
			 * 最好在创建时进行,防止对set集合的意外非同步访问
			 * 
			 * 
			 * */
			
		}

		/* 2017-02-17 19:44:55
		 * 
		 */
		private static void enumsetj() {
			/*
			  * EnumSet 类
			  * 是一个专为枚举类设计的集合类
			  * 集合中的所有元素,必须是指定的枚举类型的枚举值。
			  * 该枚举类型在创建EnumSet时显示或隐式的指定
			  * 也是有序的
			  * 定义的顺序来决定集合元素的顺序
			  * 
			  * 内部以位项链的形式存储,这种存储形式非常紧凑、高效,占用的内存小,运行的效率高,由此是批量操作
			  * 
			  * 不允许有null元素
			  * 
			  * 
			  * 
			  * */
			 
			EnumSet enumSet = EnumSet.allOf(Season.class) ;
			System.out.println(enumSet);
			
			
			EnumSet enumSet1 = EnumSet.noneOf(Season.class);  //创建一个空的
			enumSet1.add(Season.SPRING);
			
			EnumSet enumSet3 = EnumSet.of(Season.SPRING,Season.WINTER);  //以枚举值创建enumset
		}

		/* 2017-02-17 18:13:28
		 * 
		 */
		private static void sortset() {
			//定制排序
			 TreeSet treeSet2 =new TreeSet((o1,o2) -> {
				sett mSett1 = (sett) o1; 
				sett mSett2 = (sett) o2;
//				return  mSett1.age > mSett2.age ? -1 : ( mSett1.age < mSett2.age ? 1 : 0);
				return  mSett1.age > mSett2.age ? -1 :  mSett1.age < mSett2.age ? 1 : 0;
			 });
			 treeSet2.add(new sett(11));
			 treeSet2.add(new sett(31));
			 treeSet2.add(new sett(23));
			 
			 System.out.println(treeSet2);
		}
}
enum Season{
	SPRING,SUMMER,FALL,WINTER
}


 class sett{
	 int age ;
	public sett(int age) {
		this.age = age;
	}
	 
	 @Override
	public String toString() {
		 return " age :"+ age ;
	}
	 
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值