Set集合

2022-09-14 20:16:13 浏览数 (1)

1、Set概述

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。与 List 接口不 同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet 、 java.util.LinkedHashSet、java.util.TreeSet这三个集合。

2、HashSet类

虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看 HashSet的add(Object obj)方法的实现就可以一目了然了。

代码语言:javascript复制
import java.util.HashSet;
import java.util.Iterator;

public class SetDemo01 {

    public static void main(String[] args) {

        //创建Set集合对象
        HashSet<String> set = new HashSet<String>() ;

        //添加元素(增)
        set.add("hello");
        set.add("java") ;
        set.add("java") ;
        set.add("world") ;
        set.add("world") ;
        set.add("world") ;
        System.out.println("集合中添加的元素:" set);//打印的是内容(原因:传入参数类型是String,底层重写了toString()方法)
        System.out.println("集合中元素的个数:" set.size());
        //增强for遍历
        Iterator i=set.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
        //删除元素(删)
        System.out.println("是否成功删除:" set.remove
                ("hello"));//删除是否成功
        System.out.println("删除后集合中的元素:" set);
        //查询
        System.out.println("是否包含此元素:" set.contains
                ("hello"));
    }
}
代码语言:javascript复制
import java.util.HashSet;
import java.util.Iterator;
class Book{
    String name;
    double price;
    public Book(String name,double price) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.price = price;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "[书名:"   this.name   " 价格:"   this.price   "]";
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return this.name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        Book b = (Book) obj;
        return this.name.equals(b.name);
    }
}
public class SetDemo02 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //不允许重复,增加自定义对象
        HashSet<Book> books = new HashSet<Book>();
        books.add(new Book("深入Javaweb",34));
        books.add(new Book("java神书",78));
        books.add(new Book("java神书",78));
//      books.remove(new Book("java神书",78));

        //修改书名
        Iterator<Book> it = books.iterator();
        while(it.hasNext()){
            Book b = it.next();
            if(b.name.equals("java神书")){
                b.name = "java编程思想";
            }
        }
        //为什么改了名字后不能删除了!
        books.remove(new Book("java编程思想",78));
        System.out.println("集合的元素: "  books);
    }

}

3、LinkedHashSet类

LinkedHashSet是有序的而且不能重复,是HashSet的一个子类,一个链表; 以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;

代码语言:javascript复制
import java.util.Iterator;
import java.util.LinkedHashSet;

class Student{
    private int age;
    private String name;

    public Student(int age,String name)
    {
        this.age = age;
        this.name = name;
    }

    //要显示Student类的信息,必须重写toString 方法
    public String toString(){
        return   "age :" age "  name:" name;
    }

    public int hashCode()
    {
        return age*name.hashCode();
    }
    public boolean equals(Object o){
        Student s = (Student) o;
        return age == s.age && name.equalsIgnoreCase(s.name);
    }
}
public class SetDemo03 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkedHashSet linkHashSet =  new LinkedHashSet();
        Student linkedstu1 = new Student(18,"zxx");
        Student linkedstu2 = new Student(23,"zyj");
        Student linkedstu3 = new Student(25,"xmh");
        Student linkedstu4 = new Student(25,"zah");
        Student linkedstu5 = new Student(25,"zah");
        linkHashSet.add(linkedstu3);
        linkHashSet.add(linkedstu4);
        linkHashSet.add(linkedstu1);
        linkHashSet.add(linkedstu2);
        linkHashSet.add(linkedstu5);
        linkHashSet.add(null);
        Iterator it =  linkHashSet.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
        //经过测试是有序的而且不能重复
    }
}

4、TreeSet类

SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。

TreeSet提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。

代码语言:javascript复制
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

public class SetDemo04 {

    public static void main(String[] args) {

        HashSet<String> hs = new HashSet<String>();
        //增加元素
        hs.add("B");
        hs.add("A");
        hs.add("D");
        hs.add("E");
        hs.add("C");
        hs.add("F");
        System.out.println("HashSet 顺序:n" hs);

        LinkedHashSet<String> lhs = new LinkedHashSet<String>();
        lhs.add("B");
        lhs.add("A");
        lhs.add("D");
        lhs.add("E");
        lhs.add("C");
        lhs.add("F");
        System.out.println("LinkedHashSet 顺序:n" lhs);

        TreeSet<String> ts = new TreeSet<String>();
        ts.add("B");
        ts.add("A");
        ts.add("D");
        ts.add("E");
        ts.add("C");
        ts.add("F");
        System.out.println("TreeSet 顺序:n" ts);
    }
}

0 人点赞