HashSet:
HashSet:数据结构是哈希表,数据是非同步的
如何保证元素唯一性?
是通过元素的两个方法,hashCode和equals来完成。、
如果元素的hashCode值不同,才会判断equals是否为true
如果元素的hashCode值相同,不会调用equals方法
注意:对于判断的元素是否存在,以及删除等操作,依赖的是hashCode和equals方式 先判断hashCode
TreeSet:
TreeSet:输出时可以对Set集合中的元素进行排序
底层数据结构是二叉树。
保证元素唯一性的依据。
compareTo方法return 0。
TreeSet排序方式一:
让元素自身具备比较性。
元素需要实现Compareble接口,覆盖compareTo方法
这种方式也称为自然顺序,也是默认顺序
当元素自身不具备比较性时,或者具备的比较性不是所需要的,
这时就需要让集合自身具备比较性
集合初始化时,就有了比较方式
当两种排序都存在时,以比较器为主
HashSet:数据结构是哈希表,数据是非同步的
如何保证元素唯一性?
是通过元素的两个方法,hashCode和equals来完成。、
如果元素的hashCode值不同,才会判断equals是否为true
如果元素的hashCode值相同,不会调用equals方法
注意:对于判断的元素是否存在,以及删除等操作,依赖的是hashCode和equals方式 先判断hashCode
排序时,当主要条件相同时,一定要判断一下次要条件
package SetPackage;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo1 {
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person2("Java1", 04));
hs.add(new Person2("Java2", 06));
hs.add(new Person2("Java3", 01));
hs.add(new Person2("Java3", 01));
hs.add(new Person2("Java4", 02));
for(Iterator it = hs.iterator(); it.hasNext();)
{
Person2 p = (Person2) it.next();
System.out.println(p.toString()+" ");//迭代器输出
}
}
}
class Person2 implements Comparable<Person2>
{
private String name;
private int age;
Person2(String name,int age)
{
this.name = name;
this.age = age;
}
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
public String toString()
{
return name+" "+age;
}
public int compareTo(Person2 s)
{
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num == 0)
return this.name.compareTo(s.name);
return num;
}
public int hashCode()
{
return name.hashCode()+age*13;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person2))
return false;
Person2 p =(Person2)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
TreeSet:
TreeSet:输出时可以对Set集合中的元素进行排序
底层数据结构是二叉树。
保证元素唯一性的依据。
compareTo方法return 0。
TreeSet排序方式一:
让元素自身具备比较性。
元素需要实现Compareble接口,覆盖compareTo方法
这种方式也称为自然顺序,也是默认顺序
package SetPackage;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo1
{
public static void main(String[] args)
{
TreeSet tree = new TreeSet();
tree.add(new Student("冯国璋", 70));
tree.add(new Student("段祺瑞", 70));
tree.add(new Student("李鴻章", 40));
tree.add(new Student("袁世凱", 54));
for(Iterator it = tree.iterator();it.hasNext();)
{
Student stu = (Student)it.next();
System.out.println(stu.toString());
}
}
}
class Student implements Comparable//该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return name+" "+age;
}
@Override
public int compareTo(Object obj)
{
Student s = (Student)obj;
if(obj instanceof Person2)
throw new RuntimeException("不是学生对象");
if(this.age>s.age)
{
return 1;
}
if(this.age == s.age)
{
return this.name.compareTo(s.name);
}
return -1;
}
}
TreeSet排序方式二:
当元素自身不具备比较性时,或者具备的比较性不是所需要的,
这时就需要让集合自身具备比较性
集合初始化时,就有了比较方式
当两种排序都存在时,以比较器为主
package SetPackage;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo3 {
public static void main(String[] args)
{
TreeSet tree = new TreeSet(new StrLenCompare()/*比较器*/);
tree.add("a");
tree.add("sd");
tree.add("sdfsfdsdf");
tree.add("gfg");
for(Iterator it = tree.iterator(); it.hasNext();)
{
System.out.println(it.next());
}
}
}
class StrLenCompare implements Comparator
{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(s2.length());
if(num == 0)
return s1.compareTo(s2);
return num;
}
}