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 ;
}
}
set
最新推荐文章于 2024-11-17 16:22:34 发布