底层数据结构是哈希表,线程是不同步的,无序,高效;
HashSet集合保证元素唯一性:
1).当元素的hashCode值不同
那么不判断equals,元素添加会成功。
2).当元素的hashCode值相同
继续判断元素的equals是否为true。如果为true,则视为同一元素,添加不能成功,否则添加成功。
关于HashCode的详细介绍>>
TreeSet底层的数据结构就是二叉树,对Set集合中的元素的进行指定顺序的排序,不同步。
根据哈希值进行元素的重复检查,先hashCode()(可能的equals()),元素的顺序没有改变
TreeSet中添加的元素自身具有比较性或者集合具有比较性,比较性一定要有,由于String等实现了Comparable接口,这使得元素本身具有比较性!比较性的实现查看下面的说明。但元素和集合都具有比较性时,以集合比较器为主,没有则以元素比较器进行比较,会根据元素的比较重新排序。
A).元素类实现Comparable接口,class Person implements Comparable
B).重写compareTo方法,public int compareTo(Object obj
记忆:元素具有比较性故用形容词Comparable修饰,元素之间去比较compareTo()
A).新建一类MyComparator,使其实现接口Comparator,class MyComparator implements Comparator
B).重写compare方法,public int compare(Object obj1, Object obj2)
记忆:新建比较器为名词Comparator,Comparator主动去比较,用动词compare();
当两者比较器都存在时,以容器自身比较为主!
/* 前提(使元素具备比较性):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); } }
/* 前提(容器自身具备比较性):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; } }
/* 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); } }