【java】集合类

news2024/11/28 19:50:30

文章目录

    • 集合根接口
    • LIST列表
    • 迭代器
    • Queue|Deque|PriorityQueue
    • Set集合
      • HashSet
      • LinkedHashSet
      • TreeSet
    • 键盘读入
    • Map
      • HashMap
      • LinkedHashMap
    • Stream流
      • stream()
      • ints()
    • Collections工具类

集合根接口

所有的集合类最终都是实现自集合根接口的,比如ArrayList类,它的祖先就是Collection接口

在这里插入图片描述

LIST列表

import java.util.ArrayList;   //集合类基本都是在java.util包下定义的
public class Main {
    public static void main(String[] args) {
        //List<String> list = new ArrayList<>();
        ArrayList<String> list = new ArrayList<>();
        list.add("中文");
        list.add(0,"coleak");
        list.add("9");
        list.add("cc");
        list.add("ay");
        list.sort(String::compareTo);
        System.out.println(list);
        System.out.println(list.contains("coleak"));
        System.out.println(list.get(2));
        System.out.println(list.remove("colea"));
        System.out.println(list.remove("coleak"));
        System.out.println(list.remove(1));
        System.out.println(list);
        System.out.println(list.indexOf("中文"));

    }
}

[9, ay, cc, coleak, 中文]
true
cc
false
true
ay
[9, cc, 中文]
2

import java.util.ArrayList;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>(Arrays.asList("aaa","bb","c"));
        list.add("aaa");
        list.add("aab");
        list.add("aaaa");
        list.removeIf(s ->s.length()!=3);
        System.out.println(list);
    }
}

[aaa, aaa, aab]

迭代器

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C");
        Iterator<String> var = list.iterator();
        while(var.hasNext()) {
            String s = (String)var.next();
            System.out.println(s);
        }
    }
    }

迭代器的使用是一次性的,用了之后就不能用了,如果需要再次进行遍历操作,那么需要重新生成一个迭代器对象

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C");
        list.forEach(System.out::println);
    }
    }
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Test test=new Test();
        test.forEach(System.out::println);
    }
    public static class Test implements Iterable<String>{   
        //这里我们随便写一个类,让其实现Iterable接口
        @Override
        public Iterator<String> iterator() {
            return new Iterator<String>() {   
                //生成一个匿名的Iterator对象
                @Override
                public boolean hasNext() {   
                    //这里随便写的,直接返回true,这将会导致无限循环
                    return true;
                }

                @Override
                public String next() {   
                    //每次就直接返回一个字符串吧
                    return "coleak";
                }
            };
        }
    }
    }
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
        ListIterator<String> iterator = list.listIterator();
        iterator.next();   //此时得到A
        iterator.set("X");  //将A原本位置的上的元素设定为成新的
        System.out.println(list);
        iterator.remove();
        iterator.forEachRemaining(System.out::println);
    }
    }

[X, B, C]
B
C

Queue|Deque|PriorityQueue

public interface Queue<E> extends Collection<E> {
    //队列的添加操作,是在队尾进行插入(只不过List也是一样的,默认都是尾插)
      //如果插入失败,会直接抛出异常
    boolean add(E e);

    //同样是添加操作,但是插入失败不会抛出异常
    boolean offer(E e);

    //移除队首元素,但是如果队列已经为空,那么会抛出异常
    E remove();

       //同样是移除队首元素,但是如果队列为空,会返回null
    E poll();

    //仅获取队首元素,不进行出队操作,但是如果队列已经为空,那么会抛出异常
    E element();

    //同样是仅获取队首元素,但是如果队列为空,会返回null
    E peek();
}

import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();   //当做队列使用,还是很方便的
        queue.offer("AAA");
        queue.offer("BBB");
        System.out.println(queue.poll());
        System.out.println(queue.poll());
    }
    }

在这里插入图片描述

可以直接将一个LinkedList当做一个队列来使用

//在双端队列中,所有的操作都有分别对应队首和队尾的
public interface Deque<E> extends Queue<E> {
    //在队首进行插入操作
    void addFirst(E e);

    //在队尾进行插入操作
    void addLast(E e);
        
      //不用多说了吧?
    boolean offerFirst(E e);
    boolean offerLast(E e);

    //在队首进行移除操作
    E removeFirst();

    //在队尾进行移除操作
    E removeLast();

    //不用多说了吧?
    E pollFirst();
    E pollLast();

    //获取队首元素
    E getFirst();

    //获取队尾元素
    E getLast();

        //不用多说了吧?
    E peekFirst();
    E peekLast();

    //从队列中删除第一个出现的指定元素
    boolean removeFirstOccurrence(Object o);

    //从队列中删除最后一个出现的指定元素
    boolean removeLastOccurrence(Object o);

    // *** 队列中继承下来的方法操作是一样的,这里就不列出了 ***

    ...

    // *** 栈相关操作已经帮助我们定义好了 ***

    //将元素推向栈顶
    void push(E e);

    //将元素从栈顶出栈
    E pop();


    // *** 集合类中继承的方法这里也不多种介绍了 ***

    ...

    //生成反向迭代器,这个迭代器也是单向的,但是是next方法是从后往前进行遍历的
    Iterator<E> descendingIterator();

}

import java.util.Deque;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        Deque<String> deque = new LinkedList<>();
        deque.push("AAA");
        deque.push("BBB");
        System.out.println(deque.pop());
        System.out.println(deque.pop());
    }
    }
import java.util.PriorityQueue;
import java.util.Queue;
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new PriorityQueue<>();
        queue.offer(10);
        queue.offer(4);
        queue.offer(5);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
    }
    }

import java.util.PriorityQueue;
import java.util.Queue;
public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new PriorityQueue<>((a,b)->b-a);
        queue.offer(10);
        queue.offer(4);
        queue.offer(5);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
    }
    }

4
5
10

10
5
4

Set集合

  • 不允许出现重复元素
  • 不支持随机访问(不允许通过下标访问)

HashSet

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Main {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        System.out.println(set.add("AAA"));   //这里我们连续插入两个同样的字符串
        System.out.println(set.add("AAA"));
        System.out.println(set);   //可以看到,最后实际上只有一个成功插入了
        System.out.println(set.remove("AAA"));
        System.out.println(set);
        set.addAll(Arrays.asList("A", "0", "-", "+"));
        System.out.println(set);
    }
    }

true
false
[AAA]
true
[]
[0, A, +, -]

LinkedHashSet

维持插入集合的顺序需要使用LinkedHashSet

public static void main(String[] args) {
    Set<String> set = new LinkedHashSet<>();
    set.addAll(Arrays.asList("A", "0", "-", "+"));
    System.out.println(set);
}

[A, 0, -, +]

TreeSet

它会在元素插入时进行排序

import java.util.TreeSet;
public class Main {
    public static void main(String[] args) {
        TreeSet<Integer> set = new TreeSet<>((a,b)->b-a);
        set.add(1);
        set.add(3);
        set.add(2);
        System.out.println(set);
    }
    }

[3, 2, 1]

键盘读入

import java.util.Scanner;
public class test {
    public static void main(String[] args)
    {
        //演示接受用户的输入
        //步骤
        //Scanner类 表示 简单文本扫描器,在java.util 包
        //1. 引入/导入 Scanner类所在的包
        //2. 创建 Scanner 对象 , new 创建一个对象,体会
        //   myScanner 就是 Scanner类的对象
        Scanner myScanner = new Scanner(System.in);
        //3. 接收用户输入了, 使用 相关的方法
        System.out.println("请输入名字");
        //当程序执行到 next 方法时,会等待用户输入~~~
        String name = myScanner.next(); //接收用户输入字符串
        System.out.println("请输入年龄");
        int age = myScanner.nextInt(); //接收用户输入int
        System.out.println("请输入薪水");
        double sal = myScanner.nextDouble(); //接收用户输入double
        System.out.println("人的信息如下:");
        System.out.println("名字=" + name + " 年龄=" + age + " 薪水=" + sal);
    }
}

Map

HashMap

import java.util.HashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "小明");   //使用put方法添加键值对,返回值我们会在后面讨论
        map.put(2, "小红");
        map.put(4, "coleak");
        System.out.println(map.get(2)); //使用get方法根据键获取对应的值
        map.remove(2);
        System.out.println(map);
        System.out.println(map.keySet());
        System.out.println(map.values());
    }
    }

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Map<Integer , String> map = new HashMap<>();
        map.put(0, "单走");
        map.replace(0, ">>>");   //直接替换为新的
        System.out.println(map);
    }
    }

public static void main(String[] args) {
    Map<Integer , String> map = new HashMap<>();
    map.put(0, "单走");
    map.replace(0, "巴卡", "玛卡");   //只有键和值都匹配时,才进行替换
    System.out.println(map);
}
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "A");
        map.put(2, "B");
        map.compute(3, (k, v) -> {   //compute会将指定Key的值进行重新计算,若Key不存在,v会返回null
            return v+"M";     //这里返回原来的value+M
        });
        map.computeIfPresent(3, (k, v) -> {   //当Key存在时存在则计算并赋予新的值
            return v+"M";     //这里返回原来的value+M
        });
        System.out.println(map);
    }
    }

{1=A, 2=B, 3=nullMM}

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("yoni", "English", 80),
                new Student("yoni", "Chiness", 98),
                new Student("yoni", "Math", 95),
                new Student("taohai.wang", "English", 50),
                new Student("taohai.wang", "Chiness", 72),
                new Student("taohai.wang", "Math", 41),
                new Student("Seely", "English", 88),
                new Student("Seely", "Chiness", 89),
                new Student("Seely", "Math", 92)
        );
        Map<String, Integer> scoreMap = new HashMap<>();
  //merge方法可以对重复键的值进行特殊操作
        students.forEach(student -> scoreMap.merge(student.getName(), student.getScore(), Integer::sum));
        scoreMap.forEach((k, v) -> System.out.println("key:" + k + "总分" + "value:" + v));
    }

    static class Student {
        private final String name;
        private final String type;
        private final int score;

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

        public String getName() {
            return name;
        }

        public int getScore() {
            return score;
        }

        public String getType() {
            return type;
        }
    }
    }

LinkedHashMap

如果需要维护顺序,我们同样可以使用LinkedHashMap,它的内部对插入顺序进行了维护

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Map<String , String> map = new LinkedHashMap<>();
        map.put("0", "十七张");
        map.put("+", "牌");
        map.put("P", "你能秒我");
        System.out.println(map);
        System.out.println(map.keySet());
        System.out.println(map.values());
    }
    }

{0=十七张, +=牌, P=你能秒我}
[0, +, P]
[十七张, 牌, 你能秒我]

Stream流

stream()

import java.util.*;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        //Stream操作
        list = list     //链式调用
                .stream()    //获取流
                .filter(e -> !e.equals("B"))   //只允许所有不是B的元素通过流水线
                .collect(Collectors.toList());   //将流水线中的元素重新收集起来,变回List
        System.out.println(list);
    }
    }
import java.util.*;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(3);
        System.out.println(list);
        list = list
                .stream()
                .distinct()   //去重(使用equals判断)
                .sorted((a, b) -> b - a)    //进行倒序排列
                .map(e -> e+10)    //每个元素都要执行+1操作
                .limit(2)    //只放行前两个元素
                .collect(Collectors.toList());
        System.out.println(list);
    }
    }

[1, 2, 3, 3]
[13, 12]

stream会先记录每一步操作,而不是直接开始执行内容,当整个链式调用完成后,才会依次进行

ints()

import java.util.Random;
public class Main {
    public static void main(String[] args) {
        Random random = new Random();
        random
                .ints(-100, 100)   //生成-100~100之间的,随机int型数字(本质上是一个IntStream)
                .limit(10)   //只获取前10个数字(这是一个无限制的流,如果不加以限制,将会无限进行下去!)
                .filter(i -> i < 0)   //只保留小于0的数字
                .sorted()    //默认从小到大排序
                .forEach(System.out::println);   //依次打印
    }
    }
import java.util.IntSummaryStatistics;
import java.util.Random;
public class Main {
    public static void main(String[] args) {
        Random random = new Random();  //Random是一个随机数工具类
        IntSummaryStatistics statistics = random
                .ints(0, 100)
                .limit(1000)
                .summaryStatistics();    //获取语法统计实例
        System.out.println(statistics.getMax());  //快速获取最大值
        System.out.println(statistics.getCount());  //获取数量
        System.out.println(statistics.getAverage());   //获取平均值
    }
    }
import java.util.*;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A,B");
        list.add("C,D");
        list.add("E,F");   //我们想让每一个元素通过,进行分割,变成独立的6个元素
        list = list
                .stream()    //生成流
                .flatMap(e -> Arrays.stream(e.split(",")))    //分割字符串并生成新的流
                .collect(Collectors.toList());   //汇成新的List
        System.out.println(list);   //得到结果
    }
    }

[A, B, C, D, E, F]

Collections工具类

import java.util.*;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2, 3, 8, 9, 10, 13);
        System.out.println(Collections.binarySearch(list, 8));
        System.out.println(Collections.max(list));
        Collections.fill(list, 6);
        System.out.println(list);
        List<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,4,5));
        System.out.println(Collections.indexOfSubList(list2, Arrays.asList(4, 5)));
    }
    }

2
13
[6, 6, 6, 6, 6, 6]
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走向国际市场,怎样用Facebook广告抢占商机?

在当今全球化的商业世界中&#xff0c;企业要想在国际市场中占据一席之地&#xff0c;除了打造优质产品和服务外&#xff0c;有效的营销手段也是至关重要的。 而Facebook作为全球最大的社交媒体平台&#xff0c;其广告投放服务为企业提供了一个快速、便捷、有效的推广途径。那…

安全校验和框架---JWT和Shrio

安全架构 加密 分类 可逆加密和不可逆加密 不可逆加密&#xff1a;常见的不可逆加密算法有MD5&#xff0c;HMAC&#xff0c;SHA1、SHA-224、SHA-256、SHA-384&#xff0c;和SHA-512&#xff0c;其中SHA-224、SHA-256、SHA-384&#xff1b; 可逆加密分为对称加密和非对称加密…

2023最新面试题-Java-5

自定义类加载器 1. 为什么需要自定义类加载器 网上的大部分自定义类加载器文章&#xff0c;几乎都是贴一段实现代码&#xff0c;然后分析一两句自定义ClassLoader的 原理。但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚&#xff0c;因为如果不明白它的作用的情况 …

人工智能动物农场的猪、牛和蟑螂

人工智能动物农场的猪、牛和蟑螂 农业正在成为由人工智能驱动的以数据为中心的业务。中国的大型科技公司正在使用神经网络支持的计算机视觉、可穿戴设备和预测分析算法来重新构想猪、鸡、牛、鹅和蟑螂养殖。 《南华早报》报道称&#xff0c;好医生制药集团每年在中国东南部的四…

OpenHarmony社区运营报告(2023年3月)

目录 本月快讯 一、代码贡献 二、生态进展 三、社区治理 五、社区活动 六、社区及官网运营 本月快讯 • 《OpenHarmony 2022年度运营报告》于3月正式发布&#xff0c;2022年OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;开源项目潜心务实、深耕发展&am…

优化Key顺序提升ClickHouse查询性能

ClickHouse 键列顺序不仅影响表压缩效果&#xff0c;对查询性能也有很大影响&#xff0c;正确使用键列的顺序可以跳过大粒度数据范围&#xff0c;提高查询效率。本文通过示例进行测试不同场景的查询性能&#xff0c;从而让我们了解如何选择键列及其顺序。 测试数据 首先创建并…

从DY用户页面获取作品列表

最近DY的web端更新比较频繁&#xff0c;所以搞了很多方案来应对更新问题。 本文内容是其中一种方案&#xff0c;从用户主页的HTML响应内容中抽取user信息和作品列表数据。 下图中出现的内容都是在html名为RENDER_DATA的script标签中&#xff0c;以urlencode编码。 比如昵称、粉…

copilot技巧

copilot技巧 csdn排版不太好&#xff0c;推荐notion查看&#xff1a;https://superb-face-6ae.notion.site/copilot-25cf0f9882364056b5c76909b3a66ef9 一些基础原理&#xff1a; 我们想要使用copilot来干嘛呢&#xff1f;来生成代码。 怎样让它生成代码呢&#xff1f;给它一…

【PyTorch】第七节:数据加载器

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

GitHub收藏夹分类列表

前言 GitHub是一个基于Git的国际代码托管网站&#xff0c;其内容质量较高&#xff0c;用户在浏览时经常会收藏他人的项目&#xff0c;当收藏的项目越来越多后&#xff0c;用户再想查找之前特定的收藏项目会非常困难。 因此我们希望分类管理GitHub收藏夹&#xff0c;值得注意的…

Golang每日一练(leetDay0034) 二叉树专题(3)

目录 100. 相同的树 Same Tree &#x1f31f; 101. 对称二叉树 Symmetric Tree &#x1f31f; 102. 二叉树的层序遍历 Binary Tree Level-order Traversal &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一…

pdf怎么转换ppt格式,两个方法转换

PDF作为一种常用的文件格式&#xff0c;被大众所熟悉。虽然PDF具备的稳定性&#xff0c;安全性&#xff0c;以及很强的兼容性可以让我们更方便顺畅的阅读PDF文件&#xff0c;但若是有需要展示PDF文件内容的时候&#xff0c;其优点就没有那么凸显了&#xff0c;这时还是将pdf转换…

数据结构与算法基础(王卓)(25)线性表的查找(1):顺序查找(线性查找)

基本基础概念&#xff1a; 看这就不用去翻PPT了 查找&#xff1a; 根据给定的某个值&#xff0c;在查找表中确定一个与其关键字等于给定值的数据元素&#xff08;或记录&#xff09; 关键字&#xff1a; 用来表示一个数据元素&#xff08;或记录&#xff09;的某个数据项的值 主…

系统安全与应用【下】

文章目录1.开关机安全控制1.1 GRUB限制1.2 实例&#xff1a;GRUB 菜单设置密码2.终端登录安全控制2.1 限制root只在安全终端登录2.2 禁止普通用户登录3.弱口令检测3.1 Joth the Ripper,JR4.网络端口扫描4.1 nmap命令1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情…

读懂MAC地址

MAC地址是一种用于标识计算机网络设备的唯一地址。它是由48个二进制数字组成的&#xff0c;通常表示为12个十六进制数字&#xff0c;每两个数字之间用冒号或连字符分隔开。MAC地址由设备制造商在生产过程中分配&#xff0c;以确保网络上每个设备都有唯一的标识符。 MAC地址的规…

投影仪怎么连接电脑?快来看看这3种方法!

案例&#xff1a;如何连接电脑和投影仪&#xff1f; 【想看电影&#xff0c;但是电脑屏幕太小&#xff0c;我想把电脑上的内容通过投影仪投到大屏幕上。有小伙伴知道如何连接电脑和投影仪吗&#xff1f;谢谢大家&#xff01;】 使用投影仪可以将电脑或其他设备上的内容投放到…

Java——矩形覆盖

题目链接 牛客在线oj题——矩形覆盖 题目描述 我们可以用 21 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 21 的小矩形无重叠地覆盖一个 2*n 的大矩形&#xff0c;从同一个方向看总共有多少种不同的方法&#xff1f; 数据范围&#xff1a;0≤n≤38 进阶&#xff1…

九龙证券|啤酒龙头一季度净利暴增逾70倍!钛白粉开启年内第三次涨价

业内人士遍及认为&#xff0c;随着下流需求逐渐改进&#xff0c;钛白粉职业景气量有望恢复。 燕京啤酒昨日晚间发布一季度成绩预告&#xff0c;公司2023年一季度预计完成归母净利润6200万至6600万元&#xff0c;同比增加7076.76%至7539.77%。对于成绩变动的原因&#xff0c;燕京…

K8s为什么要放弃Docker

公司定期分享整理的资料 放弃始由 https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation 2020 年&#xff0c;k8s 1.20 终于正式向 Docker “宣战”&#xff1a;kubelet将弃用 Docker 支持&#xff0c;并将在未来的版本中完全移除。…

Linux高性能服务器编程|阅读笔记:第1章 - TCP/IP协议族

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…