Java Set集合
来源:互联网 发布:五毛特效app软件 编辑:程序博客网 时间:2024/05/16 11:50
Java Set集合
Set是Collection的子接口,Set集合中的元素是无序,无重复的,如果试图把两个相同的元素加入到同一个Set集合中,则添加操作会失败,add()方法返回false;HashSet,TreeSet,LinkedHashSet是Set集合最常见的三个实现类。下面来看下它们具体的用法
HashSet类
HashSet是Set接口的典型实现,它是按Hash算法来存储集合中的元素,具有很好的存取和查找功能。HashSet具有以下的特点:
- 集合中的元素是无序的
- 不是线程安全的
- 集合中的元素可以为null,但只能有一个,得保证元素的不重复
当向HashSet集合中存入一个元素时,会先调用该对象的hashCode()方法得到hashCode值,然后根据该值决定该对象在集合中存储的位置。如果两个元素通过equals()方法返回true,但它们的hashCode值不相等,它们将会存储在不同的位置上。所以HashSet判断两个元素是否相等是两个对象equals()方法比较相等,并且它们hashCode的值也相等。所以如果需要在HashSet集合中保存某个对象的时候重写这个类equals()和HashCode()方法的时候使它们的结果保持一致。
LinkedHashSet类
LinkedHashSet是HashSet的子类,它也是根据hashCode的值来决定元素存储位置的,但它同时使用链表维护元素的次序,所以LinkedHashSet集合里的元素是按照插入的顺序来存储元素的。集合中的元素不允许重复。
public class Test{public static void main(String[] args){LinkedHashSet lhs = new LinkedHashSet();lhs.add("hello");lhs.add("world");System.out.println(lhs);lhs.remove("hello");lhs.add("hello");System.out.println(lhs);}}
输出:
[hello, world][world, hello]
TreeSet类
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
public class Test{public static void main(String[] args){TreeSet ts = new TreeSet();ts.add(1);ts.add(5);ts.add(4);ts.add(2);ts.add(3);System.out.println(ts);}}
输出:
[1, 2, 3, 4, 5]
从上面输出结果可以看出,TreeSet不是按照元素插入顺序进行排序的,而是根据 元素实际大小进行排序。TreeSet底层是采用红黑树数据结构拉存储集合元素,它支持两种排序方法:自然排序和定制排序,默认情况下采用自然排序。
自然排序
TreeSet调用集合元素的compareTo(Object obj)方法比较元素之间的大小,然后将元素按升序排列,这就是自然排序。
如果想将一个对象加入TreeSet集合,则该对象的类必须实现Comparable接口的compareTo(Object obj)方法,返回0则两个对象相等,返回负数则第一个对象小于第二个对象,返回正数则第一个对象大于第二个对象。否则程序将抛出异常。
建一个Student类:
public class Student implements Comparable{private String name;private int age;public Student(String name, int age){this.name = name;this.age = age;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}@Overridepublic int compareTo(Object o){if (o == null){return 0;}if (o != null && o.getClass() == Student.class){Student student = (Student)o;return this.age > student.getAge() ? 1 : this.age < student.getAge() ? -1 : 0;}return 0;}@Overridepublic String toString(){StringBuilder builder = new StringBuilder();builder.append("Student [name=");builder.append(name);builder.append(", age=");builder.append(age);builder.append("]");return builder.toString();}}
测试类:
public class Test{public static void main(String[] args){TreeSet ts = new TreeSet();Student student1 = new Student("zhangsan", 12);Student student2 = new Student("lisi";, 16);ts.add(student1);ts.add(student2);System.out.println(ts);}}
输出:
[Student [name=zhangsan, age=12], Student [name=lisi, age=16]]
定制排序
集合中的元素排序的方式要实现定制 ,可以通过Comparator接口的int compara(T o1, T o2)方法来实现,同样该方法如果返回正数则o1大于o2,返回0则o1等于o2,返回负数则o1小于o2.需要在创建TreeSet集合对象时,提供一个Comparator对象。
Student类:
public class Student{private String name;private int age;public Student(String name, int age){this.name = name;this.age = age;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}@Overridepublic String toString(){StringBuilder builder = new StringBuilder();builder.append("Student [name=");builder.append(name);builder.append(", age=");builder.append(age);builder.append("]");return builder.toString();}}
定制的排序规则:
public class MyComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2){return o1.getAge() > o2.getAge() ? -1 : o1.getAge() < o2.getAge() ? 1 : 0;}}
测试类:
public class Test{public static void main(String[] args){TreeSet ts = new TreeSet(new MyComparator());Student student1 = new Student("zhangsan", 12);Student student2 = new Student("lisi", 16);ts.add(student1);ts.add(student2);System.out.println(ts);}}
输出结果:
[Student [name=lisi, age=16], Student [name=zhangsan, age=12]]
- java集合---set集合
- JAVA集合-Set集合
- Java集合----Set集合
- Java集合之Set集合
- Java集合--Set集合总结
- Java集合之Set集合
- Java集合—Set集合
- java集合Set操作
- java集合----------Set
- JAVA集合之SET
- java 遍历set集合
- java-----集合Set
- java遍历Set集合
- java集合框架Set
- Java遍历Set集合
- java中的Set集合
- java中set集合
- java集合(Set)
- 【电路第七章之III篇】一阶电路的全响应分析
- 揭开跨域的面纱(上)
- admin_move_table的重组机制验证(cluster index)
- SVN update拉取后撤回
- Tomcat8.0配置虚拟主机
- Java Set集合
- sam2gff3
- 【JZOJ 1319】 邮递员
- 面试题2——单例模式
- AVL树详解
- android 检测网线连接
- 面试题3
- MFC命名规范(收集自网络,方便查看)
- 118. Pascal's Triangle