Java集合框架(Set接口)

编程入门 行业动态 更新时间:2024-10-26 03:25:42

Java集合<a href=https://www.elefans.com/category/jswz/34/1770644.html style=框架(Set接口)"/>

Java集合框架(Set接口)

Set接口

  • 特点:无序,无下标,元素不可重复
  • 方法:全部继承自Collection中的方法

Set实现类

HashSet

    public static void main(String[] args) {//创建集合HashSet<String> set = new HashSet<>();set.add("apple");set.add("melon");set.add("oriange");set.add("apple");System.out.println(set);//oriange,apple,melon
//        set.remove("apple");
//        System.out.println(set);//遍历:增强forfor (String s : set) {System.out.println(s);}//迭代器Iterator<String> ite = set.iterator();while(ite.hasNext()){System.out.println(ite.next());}//判断System.out.println(set.contains("apple"));System.out.println(set.isEmpty());}
  • HashSet的使用:
    1. 根据hashcode计算保存的位置,如果此位置为空则直接保存,否则执行第2步
    2. 执行equals方法,如为true,则认为是重复,否则,形成链表
  • 只重写hashcode(),属性相同的对象仍可以添加到HashSet中,因为执行了第2步
  • 只重写equals(),Set 进行去重操作时,会先判断两个对象的 hashCode 是否相同,此时因为没有重写 hashCode 方法,所以会直接执行 Object 中的 hashCode 方法,而 Object 中的 hashCode 方法对比的是两个不同引用地址的对象,所以结果是 false,那么 equals 方法就不用执行了,直接返回的结果就是 false:两个对象不是相等的,于是就在 Set 集合中插入了两个相同的对象。​
  • 不同对象的 hashCode 可能相同;但 hashCode 不同的对象一定不相等

TreeSet

  • 存储结构:红黑树,红黑树是一种平衡二叉查找树的变体
  • 基于排列顺序实现元素不重复
  • 实现了SortedSet接口,对集合元素自动排序
  • 元素对象的类型必须实现Comparable接口,指定排序规则
  • 通过CompareTo()方法确定是否为重复元素
public class Person implements Comparable<Person> {//先按姓名比,再按年龄比@Overridepublic int compareTo(Person o) {int n1 = namepareTo(o.getName());int n2 = age-o.getAge();//返回负数,从小到大//int n2 = o.getAge()-age;//返回正数,从大到小return n1==0?n2:n1;}
    public static void main(String[] args) {TreeSet<Person> strings = new TreeSet<>();Person s1 = new Person("su", 16);Person s2 = new Person("li", 33);Person s3 = new Person("gu", 45);strings.add(s1);strings.add(s2);strings.add(s3);System.out.println(strings);//[Person{name='gu', age=45}, Person{name='li', age=33}, Person{name='su', age=16}]}

Comparator

  • 实现定制比较(比较器)
  • Comparator和Comparable区别:
    • Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
    • 两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

匿名内部类

    public static void main(String[] args) {//创建集合,并指定比较规则TreeSet<Person> strings = new TreeSet<>(new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {int n1 = o1.getAge()-o2.getAge();int n2 = o1.getName()pareTo(o2.getName());return n1==0?n2:n1;}});Person s1 = new Person("li", 45);Person s2 = new Person("li", 33);Person s3 = new Person("su", 16);strings.add(s1);strings.add(s2);strings.add(s3);System.out.println(strings);//[Person{name='gu', age=45}, Person{name='li', age=33}, Person{name='su', age=16}]}
    public static void main(String[] args) {Comparator<Person> comparator = new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {int n1 = o1.getAge()-o2.getAge();int n2 = o1.getName()pareTo(o2.getName());return n1==0?n2:n1;}@Overridepublic boolean equals(Object obj) {return false;}};TreeSet<Person> strings = new TreeSet<>(comparator);Person s1 = new Person("li", 45);Person s2 = new Person("li", 33);Person s3 = new Person("su", 16);strings.add(s1);strings.add(s2);strings.add(s3);System.out.println(strings);

更多推荐

Java集合框架(Set接口)

本文发布于:2024-02-12 05:08:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686218.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:框架   接口   Java   Set

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!