集合2-Set

本文详细介绍了Java集合框架中的Set集合,包括HashSet、LinkedHashSet和TreeSet的区别与特性。HashSet基于哈希表实现,不保证元素顺序,不允许重复;LinkedHashSet保持插入顺序,不允许重复;TreeSet基于二叉树,元素唯一并可自定义排序。文章还展示了各种集合的添加、删除、遍历等操作,并通过示例代码演示了元素的添加和排序方式。
摘要由CSDN通过智能技术生成

Set集合
Set集合中的元素不会重复,这是Set集合和List集合的最大区别。

  1. addAll(Collection<? extends E> c):将集合c中的所有元素添加到本集合中
  2. containsAll(Collection<?> c):判断本集合是否包含c集合,包含返回true,否则返回false

Set集合的子类:
HashSet、LinkedHashSet、TreeSet

HashSet:
HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null。当HashSet集合中存入元素时,会调用HashCode()方法,返回HashCode值。HashSet集合会根据HashCode值来判断元素的存储位置,进行存储。当我们存入重复元素时,会算出相同的HashCode值,会发生覆盖现象。

  1. add(E e):添加元素e
  2. clear():清空本集合的所有元素
  3. contains(Object o):判断本集合是否含有元素o,含有返回true,否则返回false
  4. isEmpty():判断本集合是否是空集合
  5. iterator():产生迭代器
  6. remove(Object o):删除集合中元素o
  7. size() :返回本集合的元素个数

HashSet的遍历:

package demo4;
import java.util.HashSet;
import java.util.Iterator;
//HashSet
public class Test {
    public static void main(String[] args) {
        HashSet<String>hashSet=new HashSet<>();
        hashSet.add("aaa");
        hashSet.add("张三");
        hashSet.add("aaa");
        hashSet.add("李四");
        hashSet.add("aaa");
        hashSet.add("张三");
        hashSet.add("王五");
        System.out.println(hashSet);

//Iterator遍历
        Iterator it=hashSet.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("=========================");
//增强for循环遍历
        for(String s:hashSet){
            System.out.println(s);
        }
    }
}
运行结果:
[aaa, 李四, 张三, 王五]
aaa
李四
张三
王五
=========================
aaa
李四
张三
王五

LinkedHashSet
此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。简单地说,LinkedHashSet的元素唯一,而且有序。

  1. LinkedHashSet(Collection<? extends E> c) :构造一个与指定 collection
    中的元素相同的新链接哈希 set。
  2. LinkedHashSet(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的新空链接哈希
    set。
  3. LinkedHashSet(int initialCapacity, float loadFactor):
    构造一个带有指定初始容量和加载因子的新空链接哈希 set。

LinkedHashSet的遍历

package demo4;
import java.util.LinkedHashSet;
public class Test4 {
    public static void main(String[] args) {
        LinkedHashSet<Integer> lh=new LinkedHashSet<>();
        lh.add(10);
        lh.add(30);
        lh.add(20);
        lh.add(10);
        lh.add(30);
        lh.add(50);
        for(Integer i:lh){
            System.out.println(i);
        }
    }
}
运行结果:
10
30
20
50

TreeSet
TreeSet集合的特点: 元素唯一,并且可以自定义对元素进行排序
TreeSet底层存储采用二叉树的结构,当存入的值比本节点小时,放到左边位置;比本节点大时,放到右边位置;和本节点相同时,丢掉。依次类推,我们得到的最后结果就是有序且唯一啦。

  1. add(E e):添加元素
  2. addAll(Collection<? extends E> c) :将c集合中的所有元素添加到本集合中
  3. ceiling(E e) : 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
  4. clear():清空元素
  5. comparator():比较器,排序必须要有的一个方法
  6. contains(Object o):判断本集合是否含有元素o,含有返回true,否则返回false
  7. first():返回此集合中当前第一个元素
  8. floor(E e) :返回此 集合 中小于等于给定元素的最大元素isEmpty() :判断集合是否为空
  9. iterator() :产生迭代器
  10. last():返回此集合中最后一个元素
  11. remove(Object o):删除本集合中元素o
  12. size() :返回本集合中元素的个数

排序方式:

  1. 自然排序:使用TreeSet集合进行元素的自然排序,那么对元素有要求,要求这个元素必须实现Comparable接口,否则无法进行自然排序
package demo5;
public class Student implements Comparable<Student> {
    String name;
    int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 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;
    }
    @Override
    public int compareTo(Student s) {
        if(this.getName().length()-s.getName().length()>=0){//按照年龄长度排序
            return 1;
        }else {
            return -1;
        }
    }
}

package demo5;
import java.util.TreeSet;
//treeSet:年龄排序,用年龄大小排
//自然排序
public class Test {
    public static void main(String[] args) {
        TreeSet <Student>ts=new TreeSet<>();
        Student s1=new Student("张三",31);
        Student s2=new Student("李四",33);
        Student s3=new Student("呼延王五",23);
        Student s4=new Student("阿三的小猫咪",13);
        Student s5=new Student("张三",31);//注:虽然两个张三名字相同,但都是new出来的对象,地址值不同,所以不会覆盖
        Student s6=new Student("武大大大",63);
        Student s7=new Student("赵恒之",33);
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
        ts.add(s7);
        for (Student s:ts){
            System.out.println(s.toString());
        }
    }
}
运行结果:
Student{name='张三', age=31}
Student{name='李四', age=33}
Student{name='张三', age=31}
Student{name='赵恒之', age=33}
Student{name='呼延王五', age=23}
Student{name='武大大大', age=63}
Student{name='阿三的小猫咪', age=13}
  1. 使用比较器排序
    注:本测试按照年龄进行排序。其学生对象和上个代码中的学生对象基本相同,就是少了Comparable接口,没有重写compareTo方法
package demo6;
import java.util.Comparator;
public class MyComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        int num1=o1.getAge()-o2.getAge();//根据年龄从小到大进行排序
        int num2=num1==0? o1.getName().compareTo(o2.getName()):num1;//要是年龄相同,比较姓名,姓名也相同的话,视为同一个人。姓名不同的话,按照录入顺序排序
        return num2;
    }
}

package demo6;
import java.util.TreeSet;
//比较器排序
public class Test {
    public static void main(String[] args) {
        MyComparator mc = new MyComparator();
        TreeSet<Student>ts=new TreeSet<>(mc);
        ts.add(new Student("张三55555", 23));
        ts.add(new Student("王菲444", 23));
        ts.add(new Student("李四8888888888888888888", 20));
        ts.add(new Student("钟楚红", 18));
        ts.add(new Student("张曼玉444", 25));
        ts.add(new Student("王祖贤7777", 36));
        ts.add(new Student("刘德华", 26));
        ts.add(new Student("赵六", 27));
        ts.add(new Student("赵六", 26));
        ts.add(new Student("赵六", 26));
        ts.add(new Student("老王", 27));
        for (Student s:ts){
          System.out.println(s.getName()+"\t"+s.getAge());
        }
    }
}
运行结果:
钟楚红	18
李四8888888888888888888	20
张三55555	23
王菲444	23
张曼玉444	25
刘德华	26
赵六	26
老王	27
赵六	27
王祖贤7777	36
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值