Set
Posted 薰衣草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Set相关的知识,希望对你有一定的参考价值。
Set:无序,不可以有重复元素
HashSet:数据结构是哈希表,线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,继续判断
元素的equals方法是否为true。
TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法retrun 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Compareble接口,覆盖compareTo方法。
也称这种方式为元素的自然顺序,或者默认顺序。
编写一程序:
需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。
排序时,当主要条件相同时,一定要判断次要条件。
import java.util.Iterator;
import java.util.TreeSet;
import org.omg.CORBA.PUBLIC_MEMBER;
public class TreeSetDemo
public static void main(String[] args)
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",19));
Iterator it = ts.iterator();
while(it.hasNext())
Student stu = (Student)it.next();
sop(stu.getName()+"::"+stu.getAge());
public static void sop(Object obj)
System.out.println(obj);
class Student implements Comparable//该接口强制让学生具有比较性
private String name;
private int age;
Student(String name,int age)
this.name = name;
this.age = age;
public int compareTo(Object obj)//底层调用
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
if(this.age >s.age)
return 1;
if(this.age == s.age)
return this.name.compareTo(s.name);
//String类已经实现了Compareble接口的compareTo方法
return -1;
public String getName()
return name;
public int getAge()
return age;
按存入的顺序取出数据
public class TreeSetDemo
public static void main(String[] args)
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",19));
Iterator it = ts.iterator();
while(it.hasNext())
Student stu = (Student)it.next();
sop(stu.getName()+"::"+stu.getAge());
public static void sop(Object obj)
System.out.println(obj);
class Student implements Comparable//该接口强制让学生具有比较性
private String name;
private int age;
Student(String name,int age)
this.name = name;
this.age = age;
public int compareTo(Object obj)//底层调用
return 1;
//return -1;//按倒序取出
//return 0;//运行结果中只有一个元素了
public String getName()
return name;
public int getAge()
return age;
TreeSet的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象做为参数传递给TreeSet集合的构造函数
当两种排序都存在时,以比较器为主
定义一个类,实现Comparable接口,覆盖compare方法。
*/
按名字排序
public class TreeSetTest
public static void main(String[] args)
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi02",21));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",19));
ts.add(new Student("lisi06",18));
ts.add(new Student("lisi06",29));
Iterator it = ts.iterator();
while(it.hasNext())
Student stu = (Student)it.next();
sop(stu.getName()+"::"+stu.getAge());
public static void sop(Object obj)
System.out.println(obj);
class Student implements Comparable//该接口强制让学生具有比较性
private String name;
private int age;
Student(String name,int age)
this.name = name;
this.age = age;
public int compareTo(Object obj)//底层调用
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
if(this.age >s.age)
return 1;
if(this.age == s.age)
return this.name.compareTo(s.name);
//String类已经实现了Compareble接口的compareTo方法
return -1;
public String getName()
return name;
public int getAge()
return age;
class MyCompare implements Comparator
public int compare(Object o1,Object o2)
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
if(num==0)
/*if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); //名称相同时按年龄排序
return num;
按字符串长度排序:
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetTest2
public static void main(String[] args)
TreeSet tS = new TreeSet(new StrLenComparator());
tS.add("abcd");
tS.add("cc");
tS.add("cba");
tS.add("aaa");
tS.add("z");
tS.add("hahaha");
Iterator it = tS.iterator();
while(it.hasNext())
System.out.println(it.next());
class StrLenComparator implements Comparator
public int compare(Object o1,Object o2)
String s1 = (String)o1;
String s2 = (String)o2;
/*
if(s1.length()>s2.length())
return 1;
if(s1.length()==s2.length())
return 0;
*/
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num == 0)
return s1.compareTo(s2);//长度相等时返回字符串的默认排序
return num;
以上是关于Set的主要内容,如果未能解决你的问题,请参考以下文章