栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

集合的补集(集合的表示)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

集合的补集(集合的表示)

总结

文章目录

总结认识集合类

数组与集合集合根接口Collection 集合类的使用

List列表

基本操作利用代码块来快速添加内容集合的排序 迭代器

lambda便利

集合:forEach迭代器Iterator:forEachRemaining Iterator 接口 Set集合Map映射流Stream和Optional的使用Arrays和Collections的使用


认识集合类

集合类最顶层不是抽象类而是接口,因为接口代表的是某个功能,而抽象类是已经快要成形的类型,不同的集合类的底层实现是不相同的,同时一个集合类可能会同时具有两种及以上功能(既能做队列也能做列表),所以采用接口会更加合适,接口只需定义支持的功能即可。

数组与集合

相同之处:

    它们都是容器,都能够容纳一组元素。

不同之处:

    数组的大小是固定的,集合的大小是可变的。数组可以存放基本数据类型,但集合只能存放对象。数组存放的类型只能是一种,但集合可以有不同种类的元素。
集合根接口Collection
public class Test {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        //添加元素
        c.add("张三");
        c.add(19);
        System.out.println("c集合的元素个数为:" + c.size());
        //删除指定元素
        c.remove(19);
        System.out.println("c集合的元素个数为:" + c.size());
        // 判断是否包含指定字符串
        System.out.println("c集合是否包含"张三"字符串:"+c.contains("张三"));
        c.add("李四");
        System.out.println("c集合元素"+c);
        Collection books = new HashSet();
        books.add("张三");
        books.add("王五");
        System.out.println("c集合是否完全包含books集合:"+c.containsAll(books));
        // 控制books集合里只剩下c集合里也包含的元素
        books.retainAll(c);
        System.out.println("books集合的元素:" + books);
        // 用c集合减去books集合里的元素
        c.removeAll(books);
        System.out.println("c集合的元素个数为:" + c);
        // 删除c集合里所有元素
        c.clear();
        System.out.println("c集合的元素个数为:" + c);
    }
}

结果

集合类的使用 List列表 基本操作 利用代码块来快速添加内容 集合的排序 迭代器 lambda便利 集合:forEach
public class Test {
    public static void main(String[] args) {
        Collection books = new HashSet();
        books.add("a");
        books.add("b");
        books.add("c");
//        调用forEach()方法便利
        books.forEach(o -> System.out.println("迭代集合:"+o));
    }
}

结果

迭代器Iterator:forEachRemaining
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class IteratorEach {
    public static void main(String[] args) {
        // 创建集合、添加元素的代码与前一个程序相同
        Collection books = new HashSet();
        books.add("我");
        books.add("你");
        books.add("他");
        // 获取books集合对应的迭代器
        Iterator it = books.iterator();
        // 使用Lambda表达式(目标类型是Comsumer)来遍历集合元素
        it.forEachRemaining(obj -> System.out.println("迭代集合元素:" + obj));
    }
}

Iterator 接口

Iterator 仅用于遍历集合,本身并不提供像集合类那样装对象的能力。Iterator 是个接口,如果需要创建其对象,必须有一个被迭代的集合,没有集合的 Iterator 没有存在的价值。
Iterator 必须依附于 Collection 对象,有一个 Iterator 对象,肯定就有一个与之关联的 Collection 对象
注意:
1.每次使用完再次使用都要重新获得迭代器

Collection books = new HashSet();
Iterator it = books.iterator();
//···
//迭代内容
//···
it = books.iterator();//重新获得

2.对迭代器的内容修改,不要直接对集合修改(中文可能不会报错(对应第四点)(但不意味着可以使用))
remove的区别
特殊情况:remove最后一个元素不会出错
本质:Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来集合的单链索引表,当原来的集合数量发生变化时,这个索引表的内容不会同步改变,当索引指针往后移动的时候就找不到要迭代的对象,按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。

所以 Iterator 在工作的时候是不允许被迭代的对象被改变的,但可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性

it.remove();//
System.out.println(book.hashCode());
books.remove(book);//
System.out.println(book.hashCode());

import java.util.Iterator;
import java.util.HashSet;
import java.util.Collection;
public class Test {
    public static void main(String[] args) {
        //创建集合依旧
        Collection books = new HashSet<>();
        books.add("语文");
        books.add("数学");
        books.add("英语");
        //获取books集合对应的迭代器
        Iterator it = books.iterator();
        while ((it.hasNext())){
            // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换
            String book = (String) it.next();
            System.out.println(book);
            if(book.equals("英语")){
                it.remove();
            }
        }
        System.out.println(books);
    }
}

3.Iterator中的 FailFast FailSafe
FailFast FailSafe
4.疑惑点:HashSet源码中的PERSON来判断该元素在集合删除还是迭代器删除,但是中文部分会失效(怀疑是中文编码后标识符的原因)。
ListIterator是List中独有的迭代器,在原有迭代器基础上新增了一些额外的操作。

Set集合

java的Set集合只能存放无序的,不能重复的数据, Set集合与Collection的用法基本类似,可以这么说,Set集合就是Collection(但Set集合不能存放相同的元素,如果使用add添加相同的元素,add会返回false,且添加的元素也没有添加进去)

Map映射

Stream的Api方法

void clear() 从这个映射中移除所有的映射(可选操作)。
  
default V compute(K key, BiFunction remappingFunction) 试图计算出指定键和当前的映射值的映射(或 null如果没有当前映射)。 
 
default V computeIfAbsent(K key, Function mappingFunction) 如果指定的键是不是已经与价值相关的(或映射到 null),尝试使用给定的映射功能,进入到这个Map除非 null计算其价值。  

default V computeIfPresent(K key, BiFunctionremappingFunction) 如果指定键的值是存在和非空的,尝试计算一个新的映射,给出了键和它当前的映射值。 
 
boolean containsKey(Object key) 返回 true如果这Map包含一个指定的键映射。  

boolean containsValue(Object value) 返回 true如果映射到指定的值的一个或多个键。
  
Set> entrySet() 返回一个 Set视图的映射包含在这个Map。 
 
boolean equals(Object o) 将指定的对象与此映射的相等性进行比较。  

default void forEach(BiConsumer action) 在该映射中的每个条目执行给定的操作,直到所有的条目被处理或操作抛出异常。  

V get(Object key) 返回指定的键映射的值,或 null如果这个Map不包含的键映射。 
 
default V getOrDefault(Object key, V defaultValue) 返回指定的键映射的值,或 defaultValue如果这个Map不包含的键映射。  

int hashCode() 返回此映射的哈希代码值。
  
boolean isEmpty() 返回 true如果这个Map不包含键值的映射。 
 
Set keySet() 返回一个 Set的关键视图包含在这个Map。 
 
default V merge(K key, V value, BiFunction remappingFunction) 如果指定的键已与值相关联的值或与空值相关联的,则将其与给定的非空值关联。 
 
V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 
 
void putAll(Map m) 从指定的映射到这个Map(可选操作)复制所有的映射。 
 
default V putIfAbsent(K key, V value) 如果指定的键是不是已经与价值相关的(或映射到 null)将其与给定的值并返回 null,否则返回当前值。  

V remove(Object key) 如果存在(可选操作),则从该Map中移除一个键的映射。  

default boolean remove(Object key, Object value) 仅当它当前映射到指定的值时,为指定的键移除条目。
  
default V replace(K key, V value) 仅当它当前映射到某一值时,替换指定的键的条目。
  
default boolean replace(K key, V oldValue, V newValue) 仅当当前映射到指定的值时,替换指定的键的条目。  

default void replaceAll(BiFunction function) 将每个条目的值替换为在该项上调用给定函数的结果,直到所有的条目都被处理或函数抛出异常。 
 
int size() 返回这个映射中的键值映射的数目。  

Collection values() 返回一个 Collection视图的值包含在这个Map。

流Stream和Optional的使用

Stream的Api方法
Stream的中间Api方法

filter(Predicate predicate): 过滤 Stream 中所有不符合 predicate 的元素 。

mapToXxx(ToXxxFunction m叩per): 使用 ToXxxFunction 对流中的元素执行一对一 的转换,该方
法返回的新流中包含了 ToXxxFunction 转换生成的所有元素 。

peek(Consumer action): 依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素 。 该方法主要用于调试。

distinct(): 该方法用于排序流中所有重复的元素(判断元素重复的标准是使用 equals() 比较返回true) 。 这是一个有状态的方法 。

sorted(): 该方法用于保证流中的元素在后续的访问中处于有序状态 。 这是一个有状态的方法 。

limit(long maxSize): 该方法用于保证对该流的后续访

Stream的末端Api方法

forEach(Consumer action): 遍历流中所有元素,对每个元素执行 action 。

toArray(): 将流中所有元素转换为一个数组 。

reduce(): 该方法有三个重载的版本,都用于通过某种操作来合并流中的元素 。

 min():  返回流中所有元素的最小值 。
 
max():  返回流中所有元素的最大值 。

count(): 返回流中所有元素的数量。

anyMatch(Predicate predicate): 判断流中是否至少包含一个元素符合 Predicate 条件 

allMatch(Predicate predicate): 判断流中是否每个元素都符合 Predicate 条件。

noneMatch(predicate predicate): 判断流中是否所有元素都不符合 Predicate 条件。

findFirst(): 返回流中的第一个元素。

findAny(): 返回流中的任意 一个元素。

Arrays和Collections的使用
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776544.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号