ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java Set集合

2020-10-09 23:34:51  阅读:154  来源: 互联网

标签:Set Java personSet 18 Person add 集合 new stringSet


目录

1 Set集合

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

public interface Set<E> extends Collection<E>

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

2 常用方法

3 实现类

3.1 HashSet[重点]

  • 基于HashCode、equals实现元素不重复
  • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入

基本用法

/**
 * HashSet的使用
 *      存储结构:哈希表(数组+链表+红黑树)
 */
public class Set1 {
    public static void main(String[] args) {

        //创建集合
        Set<String> stringSet = new HashSet<>();
        //添加元素
        stringSet.add("小米");
        stringSet.add("华为");
        stringSet.add("苹果");
        stringSet.add("苹果");//只能保存一个相同的元素
        System.out.println(stringSet);//打印无序
        //删除
        stringSet.remove("苹果");
        System.out.println(stringSet);

        /**
         * 遍历
         */
        System.out.println("****增强for****");

        for (String s : stringSet) {
            System.out.println(s);
        }
        System.out.println("****迭代器****");
        Iterator<String> stringIterator = stringSet.iterator();
        while (stringIterator.hasNext()){
            System.out.println(stringIterator.next());
        }

        //判断
        boolean containsXiaoMi = stringSet.contains("小米");
        System.out.println(containsXiaoMi);
        System.out.println("集合大小:"+stringSet.size());

    }
}

运行结果

[苹果, 华为, 小米]
[华为, 小米]
****增强for****
华为
小米
****迭代器****
华为
小米
true
集合大小:2

存放对象

public class Person {

    private String name;
    private int age;

   
    //getter、setter、构造器、toString

    /**
     * 重写hashCode和equals方法
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

}


/**
 * HashSet的使用
 *      存储结构:哈希表(数组+链表+红黑树)
 *      存储过程:
 *          1、根据hashCode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步
 *          2、再执行equals方法,如果equals方法为true,则认为时重复,否则,形成链表
 */
public class Set2 {
    public static void main(String[] args) {
        HashSet<Person> personHashSet = new HashSet<>();
        Person p1 = new Person("婉儿",18);
        Person p2 = new Person("公孙离",18);
        Person p3 = new Person("妲己",18);
        personHashSet.add(p1);
        personHashSet.add(p2);
        personHashSet.add(p3);

        /**
         * 因为Person重写了hashCode和equals方法,不能再重复添加了
         *
         */
        personHashSet.add(new Person("妲己",18));
        System.out.println(personHashSet);
    }
}

运行结果:

[Person{name='婉儿', age=18}, Person{name='妲己', age=18}, Person{name='公孙离', age=18}]

3.2 TreeSet

  • 基于排列顺序实现元素不重复
  • 实现了SortedSet接口,对集合元素自动排序
  • 元素对象的类型必须实现Comparable接口,指定排序规则
  • 通过CompareTo方法确定是否为重复元素

基本用法


/**
 * TreeSet的使用:
 *      存储结构:红黑树
 *      要求:元素必须实现Comparable接口,compareTo()方法返回值为0,认为是重复元素
 */
public class Set3 {
    public static void main(String[] args) {
        //创建集合 String类已经实现了Comparable接口,可以直接添加
        Set<String> stringSet = new TreeSet<>();
        stringSet.add("hello");
        stringSet.add("abc");
        stringSet.add("xyz");
        stringSet.add("xyz");//重复元素不能添加
        //stringSet.add(null); //发现不能存放null
        System.out.println(stringSet);//发现集合已经排序了

        //Person类需要实现Comparable接口,实现compareTo方法
        Set<Person> personSet = new TreeSet<>();
        Person p1 = new Person("x婉儿",18);
        Person p2 = new Person("a公孙离",18);
        Person p3 = new Person("d妲己",18);
        Person p4 = new Person("d妲己",16);
        personSet.add(p1);
        personSet.add(p2);
        personSet.add(p3);
        personSet.add(p4);
        System.out.println(personSet);

        //查询某个元素是否存在
        boolean b = personSet.contains(new Person("d妲己", 16));
        System.out.println(b);
        //集合大小
        System.out.println("大小:"+personSet.size());
        //删除某个元素 comparedTo方法的返回值相同就认为元素存在,就可以删除
        System.out.println(personSet.remove(new Person("d妲己", 16)));
        //清空集合
        personSet.clear();

        //遍历
        //迭代器
        //增强for

    }
}
public class Person implements Comparable<Person>{

    private String name;
    private int age;

    //getter、setter、构造器、toString

    /**
     * 定义排序规则:名字,年龄
     */
    @Override
    public int compareTo(Person o) {
        int byName = this.name.compareTo(o.name);
        int byAge = this.age - o.age;
        return byName==0 ? byAge : byName;
    }

}

运行结果

[abc, hello, xyz]
[Person{name='a公孙离', age=18}, Person{name='d妲己', age=16}, Person{name='d妲己', age=18}, Person{name='x婉儿', age=18}]
true
大小:4
true

也可以通过TreeSet的构造方法传入Comparator指定比较规则,这样元素就可以不用实现Comparable接口了

public class Set3 {
    public static void main(String[] args) {

        //通过TreeSet的构造方法传入Comparator指定比较规则
        
        //使用匿名内部类
        Set<Person> personSet2 = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int byName = p1.getName().compareTo(p2.getName());
                int byAge = p1.getAge()- p2.getAge();
                return byName==0 ? byAge:byName;
            }
        });
            
        //使用Lambda表达式
        Set<Person> personSet = new TreeSet<>((p1,p2)->{
            int byName = p1.getName().compareTo(p2.getName());
            int byAge = p1.getAge()- p2.getAge();
            return byName==0 ? byAge:byName;
        });

        Person p1 = new Person("x婉儿",18);
        Person p2 = new Person("a公孙离",18);
        Person p3 = new Person("d妲己",18);
        Person p4 = new Person("d妲己",16);
        personSet.add(p1);
        personSet.add(p2);
        personSet.add(p3);
        personSet.add(p4);
        System.out.println(personSet);

    }
}

标签:Set,Java,personSet,18,Person,add,集合,new,stringSet
来源: https://www.cnblogs.com/zjw-blog/p/13789564.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有