Java之集合框架(二)

Java Set集合

Set是一种不包含重复元素的集合。它通常用于存储唯一的数据项。

Set接口的主要方法和特性

成员关系
add(E e): 添加指定的元素。如果set已经包含该元素,则返回false。
remove(Object o): 移除指定的元素。如果set不包含该元素,则返回false。
contains(Object o): 返回一个boolean值,指示set是否包含指定的元素。
isEmpty(): 返回一个boolean值,指示set是否为空。
子集关系
containsAll(Collection<?> c): 返回一个boolean值,指示set是否包含指定collection的所有元素。 addAll(Collection<? extends E> c): 添加指定collection中的所有元素。如果set已经包含这些元素,则返回false。 removeAll(Collection<?> c): 移除指定collection中的所有元素。
retainAll(Collection<?> c): 仅保留set中与指定collection中的元素相同的元素。
迭代
iterator(): 返回一个SetIterator,用于遍历set的元素。
toArray(): 返回一个包含set中所有元素的数组。
实现类
Set接口有多种实现类,包括:
HashSet: 使用散列算法实现的无序集合,可以存储任何类型的对象。
实现了 Set 接口,底层实现是 HashMap 。不保证迭代顺序,允许 null 元素
非线程安全的
如果 add 的值已存在( equals 方法返回 true ,基本数据类型自动装箱)返回 false
如果 HashSet 中存的是对象,需要重写此对象类中的 equals 和 hashCode() 方法
LinkedHashSet: 使用散列算法实现的有序集合,可以存储任何类型的对象。它保留了元素的插入顺序。
TreeSet: 使用树结构实现的有序集合,可以存储任何类型的对象。它可以根据元素的自然顺序或者自定义的Comparator进行排序。

HashSet类

  • 实现了 Set 接口,底层实现是 HashMap 。不保证迭代顺序,允许 null 元素
  • 非线程安全的
  • 如果 add 的值已存在( equals 方法返回 true ,基本数据类型自动装箱)返回 false
  • 如果 HashSet 中存的是对象,需要重写此对象类中的 equals 和 hashCode() 方法
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable

HashSet常用方法

方法名描述
add(E e)添加指定的元素,如果set已经包含该元素,则返回false
remove(Object o)移除指定的元素,如果set不包含该元素,则返回false
contains(Object o)返回一个boolean值,指示set是否包含指定的元素
isEmpty()返回一个boolean值,指示set是否为空
size()返回set中的元素个数
iterator()返回一个Iterator,用于遍历set的元素
toArray()返回一个包含set中所有元素的数组

HashSet构造方法

构造方法描述
HashSet()创建一个具有默认初始容量(16)和默认加载因子(0.75)的新的空HashSet集合
HashSet(int initialCapacity)创建一个具有指定初始容量和默认加载因子(0.75)的新的空HashSet集合
HashSet(int initialCapacity, float loadFactor)创建一个具有指定初始容量和加载因子的新的空HashSet集合
HashSet(Collection<? extends E> c)创建一个包含指定集合中元素的新HashSet集合

注意:加载因子的值不宜过大或过小,过大会造成数组散列困难,从而使数组中存放了大量的元素,不宜数据的操作,而过小会造成数组散列频繁,从而造成内存空间的浪费。因此加载因子设为默认值(0.75)是效率最高的。

练习

public static void main(String[] args) {
        /**
         * 使用Set集合存储多个字符串,移除其中长度为奇数的字符串
         */

        Set<String> set = new HashSet<>();
        set.add("南");
        set.add("北齐");
        set.add("祺鑫");
        set.add("七芒星");
        set.add("北纬");

        System.out.println("原:" + set);

        //定义迭代器
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String str = iterator.next();
            //移除其中长度为奇数的字符串
            if (str.length() % 2 != 0){
                iterator.remove();
            }
        }

        System.out.println("现:" + set);
    }

TreeSet类

  • 非线程安全
  • 值必须可比较(元素实现 Comparable 接口、传递 比较器 Comparator 对象)
  • 不能存 null
  • 判断是否是重复元素,是按照自然比较/比较器进行比较

就是说a.compareTo(b) == 0,如果是 true ,那么 add(a) 之后的 add(b) 将会返回 false ,
也就是添加失败
练习

package com.kfm.JavaBase.Collection;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class Demo7 {

    /**
     * 使用集合统计一段文本中各个字符出现的次数
     */
    public static void main(String[] args) {
//        String str="南北启程弘石南北启程祺鑫";
        String str="南北启程弘石南北启程祺鑫启程弘石南北启程祺鑫";
        String[] charArry  = str.split("");//以分隔字符
        //将字符串 以 字符数组 放入 list 集合
        List<String> list = Arrays.asList(charArry);
        System.out.println(list);

        //所有出现过的字符
        HashSet<String> set = new HashSet<>(list);

        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
           String str1 = iterator.next();//不重复的所有元素
           int count = 0;

            Iterator<String> iterator1 = list.iterator();
            while (iterator1.hasNext()){
                String c = iterator1.next();//全部元素
                if (str1.equals(c)){//若不重复的元素与全部元素 有相等元素 则说明这个字符 出现不止一次 出现几次 就重复了几次
                    count++;
                }
            }
            System.out.println(str1 + "出现了" + count + "次");

        }
    }
}

package com.kfm.JavaBase.Collection;

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

public class Exer7 {
    public static void main(String[] args) {
        /**
         * 使用Set集合存储多个字符串,移除其中长度为奇数的字符串
         */

        Set<String> set = new HashSet<>();
        set.add("南");
        set.add("北齐");
        set.add("祺鑫");
        set.add("七芒星");
        set.add("北纬");

        System.out.println("原:" + set);

        //定义迭代器
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String str = iterator.next();
            //移除其中长度为奇数的字符串
            if (str.length() % 2 != 0){
                iterator.remove();
            }
        }

        System.out.println("现:" + set);
    }
}

TreeSet常用方法

以下的图表展示了TreeSet常用方法:

方法名描述
add(E e)添加指定的元素到TreeSet中
clear()清空TreeSet中的所有元素
contains(Object o)判断TreeSet中是否包含指定元素
first()返回TreeSet中的第一个元素
last()返回TreeSet中的最后一个元素
remove(Object o)从TreeSet中移除指定元素
size()返回TreeSet集合中包含的元素个数
iterator()返回一个Iterator,用于遍历TreeSet的元素
toArray()返回一个包含TreeSet中所有元素的数组

TreeSet构造方法

以下是TreeSet构造方法的表格:

构造方法描述
TreeSet()创建一个新的空TreeSet集合,利用默认的Comparator进行排序
TreeSet(Comparator<? super E> c)创建一个新的空TreeSet集合,利用指定的Comparator进行排序
TreeSet(Collection<? extends E> c)创建一个新的TreeSet集合,包含指定Collection中的元素,排序规则由传入的Comparator决定

注意:如果你想要创建一个基于自然顺序的TreeSet,你可以使用不带参数的构造方法。如果你想要创建一个基于自定义顺序的TreeSet,你可以传入一个实现了Comparator接口的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值