Java 集合中的Set

Set


1. 特点

无序、无下标、元素不可重复。

2. 方法

全部继承自Collection中的方法。

3. 实现类

3.1 HashSet【重点】

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

存储结构:数组+链表+红黑树

字符串类型:

package com.setDemo.hashSetDemo;

import java.util.HashSet;
import java.util.Iterator;

/**
 * HashSet 集合使用
 * 存储结构:hash表(数组 + 链表 + 红黑树)
 * (1)
 */
public class Demo01 {
    public static void main(String[] args) {

        // 新建集合
        HashSet<String> hs = new HashSet<String>();

        // 1. 添加元素
        hs.add("张梓康");
        hs.add("真的");
        hs.add("帅");
        hs.add("哎");

        System.out.println("元素个数:"+ hs.size());
        System.out.println(hs.toString());

        // 2. 删除数据
        hs.remove("刘德华");
        System.out.println("删除之后:"+hs.size());

        System.out.println("=============");
        // 3. 遍历操作
        // 3.1 增强for
        for (String h : hs) {
            System.out.println(h);
        }
        System.out.println("=============");

        Iterator<String> iterator = hs.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("=============");

        // 4. 判断
        System.out.println(hs.contains("郭富城"));
        System.out.println(hs.isEmpty());
    }
}

人类链表:

package com.setDemo.hashSetDemo;

import java.util.HashSet;
import java.util.Iterator;

/**
 * HashSet 使用
 * 存储结构:哈希表(数组+链表+红黑树)
 * 存储过程
 * (1) 根据hashcode,计算保存位置,如果此位置为空,则直接保存,如果不为空执行第二布。
 * (2) 再执行equals 方法,如果equals方法,则认为是重复元素。
 */
public class Demo02 {
    public static void main(String[] args) {
        
        // 创建
        HashSet<Person> hs = new HashSet<>();
        
        // 添加   
        Person p1 = new Person("钟照例", 23);
        Person p2 = new Person("刘少奇", 25);
        Person p3 = new Person("请勿发", 24);

        hs.add(p1);
        hs.add(p2);
        hs.add(p3);
        // 重复不能添加
        hs.add(new Person("请勿发", 24));

        System.out.println("元素个数:"+hs.size());
        System.out.println(hs.toString());

        // 删除操作
        hs.remove(new Person("请勿发", 24));
        System.out.println("元素个数:"+hs.size());
        System.out.println(hs.toString());

        // 遍历
        // 增强for
        for (Person h : hs) {
            System.out.println(h);
        }
        System.out.println("================");
        Iterator<Person> it1 = hs.iterator();
        while (it1.hasNext()){
            System.out.println(it1.next());
        }
        // 判断
        System.out.println(hs.contains(p2));
        System.out.println(hs.contains(new Person("请勿发", 24)));
        System.out.println(hs.isEmpty());
    }
}

人类重写equals和hashcode:

@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() {
        // (1) 31是一个质数,减少散列的冲突()31可以提高执行的效率
        return Objects.hash(name, age);
    }
3.2 TreeSet

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

元素必需要实现Comparable接口,compareTo() 方法返回值为0,认为是重复元素

Demo01:

package com.setDemo.treeDemo;

import com.setDemo.hashSetDemo.Person;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * 使用treeset 保存数据
 * 存储结构:红黑树
 * 要求:元素必需要实现Comparable接口,compareTo() 方法返回值为0,认为是重复元素
 */
public class Demo02 {

    public static void main(String[] args) {
        // 创建一个集合

        TreeSet<Person> ts1 = new TreeSet<>();
        Person p1 = new Person("钟照例", 23);
        Person p2 = new Person("刘少奇", 25);
        Person p3 = new Person("请勿发", 24);
        // 添加元素
        ts1.add(p1);
        ts1.add(p2);
        ts1.add(p3);


        System.out.println("个数:"+ts1.size());
        System.out.println(ts1);
        System.out.println("=========================");
        // 删除
        ts1.remove( new Person("请勿发", 24));
        System.out.println("个数:"+ts1.size());
        System.out.println(ts1);

        // 遍历
        // 增强for
        for (Person person : ts1) {
            System.out.println(person);
        }
        System.out.println("==============");
        // 迭代器
        Iterator<Person> it = ts1.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }


    }
}

Demo02:

package com.setDemo.treeDemo;

import com.setDemo.hashSetDemo.Person;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * TresSet集合的使用
 * Comparator : 实现定制比较(比较器)
 * Comparable : 可比较的
 */

public class OtherDemo {
    public static void main(String[] args) {
        // 创建集合,并指定比较规则
        TreeSet<Person> ts = new TreeSet<Person>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int n1 = o1.getAge() - o2.getAge();
                int n2 = o1.getName().compareTo(o2.getName());
                return n1 == 0 ? n2 : n1;
            }
        });
        Person p1 = new Person("钟照例", 23);
        Person p2 = new Person("刘少奇", 25);
        Person p3 = new Person("请勿发", 24);
        // 添加元素
        ts.add(p1);
        ts.add(p2);
        ts.add(p3);


        System.out.println("个数:"+ts.size());
        System.out.println(ts);
        System.out.println("=========================");
        // 删除
        ts.remove( new Person("请勿发", 24));
        System.out.println("个数:"+ts.size());
        System.out.println(ts);

        // 遍历
        // 增强for
        for (Person person : ts) {
            System.out.println(person);
        }
        System.out.println("==============");
        // 迭代器
        Iterator<Person> it = ts.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

4. Set 接口使用

package com.setDemo;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 测试Set接口的使用
 * 特点:
 * (1) 无序 没有下标
 * (2) 不能重复
 */
public class Demo01 {
    public static void main(String[] args) {
        // 1 创建集合
        Set<String> s1 = new HashSet<>();

        // 2 添加数据
        s1.add("苹果");
        s1.add("菠萝");
        s1.add("喜欢");
        System.out.println("数据个数:"+s1.size());
        System.out.println(s1.toString());
        System.out.println("============");
        
        // 3 删除数据
        s1.remove("苹果");
        System.out.println(s1.toString());

        System.out.println("============");

        // 4 遍历
        // 4.1 增强 for
        for (String s : s1) {
            System.out.println(s);
        }
        System.out.println("============");

        // 4.2 迭代器
        Iterator<String> it1 = s1.iterator();
        while (it1.hasNext()){
            System.out.println(it1.next());
        }
        System.out.println("============");

        // 5 判断
        System.out.println(s1.contains("菠萝"));
        System.out.println(s1.isEmpty());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值