Java集合专题

news2024/11/16 21:54:12

文章目录

  • 框架体系
  • Collection
    • List
      • ArrayList
      • LinkedList
      • Vector
    • Set
      • HashSet
      • LinkedHashSet
      • TreeSet
  • Map
      • HashMap
      • Hashtable
      • LinkedHashMap
      • TreeMap
      • Properties
  • Collections

框架体系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1、集合主要分了两组(单列集合,双列集合)
2、Collection接口有两个重要的子接口List与Set,他们的实现子类都是单列集合
3、Map接口的实现子类都是双列集合,存放K-V

Collection

1、Collection接口说明

public interface Collection<E> extends Iterable<E>

(1) collection实现子类可以存放多个元素,每个元素可以使Object(即只要是Object及其子类都可以往里面放)
(2)有些collection的实现类,可以存放重复元素
(3)有些collection的实现类是有序的(List),有些不是有序的(Set)
(4)Collection接口没有直接实现子类,他是通过它的子接口Set和List来实现的
2、Collection常用方法
由于接口无法实例化,所以使用其实现子类ArrayList来演示

public class CollectionMethod {
    public static void main(String[] args) {
        List list = new ArrayList();
        //add:添加单个元素
        list.add("jack");
        list.add(10);//这里有一个自动装箱的过程,list.add(new Integer(10))
        list.add(true);//这里有一个自动装箱的过程
        System.out.println("list="+list);//结果为:list=[jack, 10]
        //remove:删除指定元素
        //list.remove(0);删除第一个元素
        list.remove(true);//删除指定元素
        System.out.println("list="+list);//结果为:list=[jack, 10]
        //contains:查找元素是否存在
        System.out.println(list.contains("jack"));
        //size:获取元素个数
        System.out.println(list.size());
        //isEmpty:判断是否为空
        System.out.println(list.isEmpty());
        //clear:清空
        list.clear();
        //addAll:添加多个元素
        ArrayList list2=new ArrayList();
        list2.add("红楼梦");
        list2.add("三国演义");
        list.addAll(list2);
        System.out.println("list="+list);
        //containsAll:查找多个元素是否都存在
        System.out.println(list.containsAll(list2));
        //removeAll:删除多个元素
        list.removeAll(list2);
    }
}

3、Collection接口遍历元素的方式一:使用Iterator
(1)Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
(2)实现了Collection接口的集合类都有一个iterator()方法,用于返回一个实现了iterator接口的对象,即可以返回一个迭代器

//以下为源码

/**
 * Return an iterator over elements of type {@code T}
 * @return an Iterator.
 */
 
Iterator<T> iterator();

(3)iterator仅用于遍历集合,Iterator本身并不存放对象。
(4)执行原理
每次调用next方法,指针就会向下移动一次并将数据取出来。
在这里插入图片描述
注意:在调用iterator.next()方法之前,必须调用iterator.hasNext()进行检测,若不调用且下条记录无效时会抛出NoSuchElementException异常。
(5)例子

public class CollectionInterator {
    public static void main(String[] args) {
        Collection col = new ArrayList();

        col.add(new Book("三国演义","罗贯中",10.1));
        col.add(new Book("红楼梦","曹雪芹",10.1));
        col.add(new Book("水浒传","施耐庵",10.1));

        //遍历集合
        //1.先得到col对应的迭代器
        Iterator iterator =col.iterator();
        //2、使用while循环遍历,可以使用itit快速生成
        while (iterator.hasNext()) {
            //返回下一个元素,类型是Object
            Object obj =  iterator.next();
            System.out.println("obj="+ obj);
        }
        //3、当退出循环后,这时iterator迭代器指向最后的元素
        //iterator .next();//NoSuchElementException
        //4、如果希望再次遍历,需要重置我们的迭代器
        iterator =col.iterator();

        while (iterator.hasNext()) {
            Object obj =  iterator.next();
            System.out.println("===第二次遍历===");
            System.out.println("obj="+ obj);
        }
    }
}
class Book{
    private String name;
    private String author;
    private double price;

    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public double getPrice() {
        return price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

4、Collection接口遍历元素的方式二:使用for循环

public class CollectionFor {
    public static void main(String[] args) {
        Collection col = new ArrayList();

        col.add(new Book("三国演义","罗贯中",10.1));
        col.add(new Book("红楼梦","曹雪芹",10.1));
        col.add(new Book("水浒传","施耐庵",10.1));

        //增强for循环,快捷键:I
        //增强for在地层仍然是迭代器
        for(Object book:col){
            System.out.println("book="+book);
        }
        //注意,增强for循环也能在数组中使用
        int[] nums={1,3,56,7};
        for(int i:nums){
            System.out.println("i="+i);
        }
    }
}

List

List接口是Collection接口的子接口

1、基本介绍
(1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
(2)List集合中每个元素都有其对应的顺序索引,即List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

public class ListTest {
    public static void main(String[] args) {
        //List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
        List list = new ArrayList();
        list.add("Tom");
        list.add("Jack");
        list.add("Mary");
        list.add("Tom");
        System.out.println("list="+list);
        //2.List集合中每个元素都有其对应的顺序索引,即支持索引
        //索引从0开始
        System.out.println(list.get(3));
    }
}

(3)JDK API中List接口的实现类有

在这里插入图片描述
2、List接口的常用方法
(1)void add(String item, int index) :向滚动列表中索引指示的位置添加指定的项。
(2)boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
(3)Object get(int index):获取指定index位置的元素
(4)int indexOf(Object obj):返回obj在集合中首次出现的位置
(5)int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
(6)Object remove(int index):移除指定index位置的元素,并返回此元素
(7)Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换
(8) List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合,注意返回的子集合 fromIndex <= subList < toIndex,即前闭后开[ )

public class ListMethod {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("张三丰");
        list.add("贾宝玉");
//        void add(int index, Object ele):在index位置插入ele元素
        //在index = 1的位置插入一个对象
        list.add(1, "韩顺平");
        System.out.println("list=" + list);
//        boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
        List list2 = new ArrayList();
        list2.add("jack");
        list2.add("tom");
        list.addAll(1, list2);
        System.out.println("list=" + list);
//        Object get(int index):获取指定index位置的元素
        //说过
//        int indexOf(Object obj):返回obj在集合中首次出现的位置
        System.out.println(list.indexOf("tom"));//2
//        int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
        list.add("韩顺平");
        System.out.println("list=" + list);
        System.out.println(list.lastIndexOf("韩顺平"));
//        Object remove(int index):移除指定index位置的元素,并返回此元素
        list.remove(0);
        System.out.println("list=" + list);
//        Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换.
        list.set(1, "玛丽");
        System.out.println("list=" + list);
//        List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
        // 注意返回的子集合 fromIndex <= subList < toIndex
        List returnlist = list.subList(0, 2);
        System.out.println("returnlist=" + returnlist);

    }
}

3、List接口遍历元素的三种方式
三种方式为使用iterator,增强for,for循环

public class ListFor {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {

        //List 接口的实现子类 Vector LinkedList
        //List list = new ArrayList();
        //List list = new Vector();
        List list = new LinkedList();

        list.add("jack");
        list.add("tom");
        list.add("鱼香肉丝");
        list.add("北京烤鸭子");

        //遍历
        //1. 迭代器
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object obj =  iterator.next();
            System.out.println(obj);

        }

        System.out.println("=====增强for=====");
        //2. 增强for
        for (Object o : list) {
            System.out.println("o=" + o);
        }

        System.out.println("=====普通for====");
        //3. 使用普通for
        for (int i = 0; i < list.size(); i++) {
            System.out.println("对象=" + list.get(i));
        }


    }
}

练习:使用冒泡排序按照书的价格排序

public class ListExercise02 {

    public static void main(String[] args) {

        //List list = new ArrayList();
        List list = new LinkedList();
        //List list = new Vector();
        list.add(new Book("红楼梦", "曹雪芹", 100));
        list.add(new Book("西游记", "吴承恩", 10));
        list.add(new Book("水浒传", "施耐庵", 19));
        list.add(new Book("三国", "罗贯中", 80));
        //list.add(new Book("西游记", "吴承恩", 10));

        //遍历

        for (Object o : list) {
            System.out.println(o);
        }

        //冒泡排序
        sort(list);

        System.out.println("==排序后==");

        for (Object o : list) {
            System.out.println(o);
        }

    }

    //静态方法
    //价格要求是从小到大
    public static void sort(List list) {

        int listSize = list.size();
        for (int i = 0; i < listSize - 1; i++) {
            for (int j = 0; j < listSize - 1 - i; j++) {
                //取出对象Book
                Book book1 = (Book) list.get(j);
                Book book2 = (Book) list.get(j + 1);
                if (book1.getPrice() > book2.getPrice()) {//交换取出来的Book
                    list.set(j, book2);//book2放到j
                    list.set(j + 1, book1);//book1放到j+1
                }
            }
        }

    }
}

ArrayList

1、ArrayList底层结构和源码分析
(1)ArrayList可以加入null,并且可以加入多个
(2)ArrayList是由数组来实现数据存储的
(3)ArrayList基本等同于Vector,但是ArrayList是线程不安全的(执行效率高),在多线程情况下不建议使用ArrayList。

public class ArrayListDetail {
    public static void main(String[] args) {

        //ArrayList 是线程不安全的, 可以看源码 没有 synchronized
        /*
            public boolean add(E e) {
                ensureCapacityInternal(size + 1);  // Increments modCount!!
                elementData[size++] = e;
                return true;
            }
         */
        ArrayList arrayList = new ArrayList();
        arrayList.add(null);
        arrayList.add("jack");
        arrayList.add(null);
        arrayList.add("hsp");
        System.out.println(arrayList);
    }
}

LinkedList

Vector

Set

HashSet

LinkedHashSet

TreeSet

Map

HashMap

Hashtable

LinkedHashMap

TreeMap

Properties

Collections

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

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

相关文章

2.SpringSecurity认证

2.1登录校验流程 2.2认证原理 *源码流程: *自定义认证流程: *校验流程: *认证和校验连接: 2.3思路分析 *登录:

SQLI-Labs通关(2)5-7关

跟之前一样首先传参&#xff0c;然后查看注入点以及闭合 用and 11 and 12都没问题&#xff0c;接下来测试单引号 利用 and 12的时候会报错 利用order by来判断列数 得出一共三列 接下来就是联合查询 但是这个并不会回显 那么就利用盲注或者报错注入 在这里我们利用报错来测…

Vue3的生命周期函数

文章目录&#x1f31f; 写在前面&#x1f31f; 生命周期钩子函数&#x1f31f; 组合式API生命周期&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&am…

OPPO 数据恢复:如何从 OPPO 手机恢复已删除的文件?

Oppo 手机以其精美的外观和拍摄的精美照片和视频而闻名。如果您不小心丢失了 OPPO 手机中珍贵的照片、视频等重要文件&#xff0c;并且为如何找回而苦恼&#xff0c;那么您来对地方了。我们其实有很多OPPO数据恢复方案&#xff0c;现在最重要的是尽快尝试这些方法&#xff0c;防…

Git 相关内容

目录 Git 相关流程和常用命令 Git workflow Git hooks Git 相关流程和常用命令 Git远程操作详解 - 阮一峰的网络日志 Git 使用规范流程 - 阮一峰的网络日志 常用 Git 命令清单 - 阮一峰的网络日志 Git workflow 啥玩意&#xff1a; 就是一个工作流程。可以比喻成一个河流…

用逻辑回归制作评分卡

目录 一.评分卡 二.导库&#xff0c;获取数据 三.探索数据与数据预处理 1.去除重复值 2.填补缺失值 3.描述性统计处理异常值 4.为什么不统一量纲&#xff0c;也不标准化数据分布 5.样本不均衡问题 6.分训练集和测试集 三.分箱 1.分多少个箱子才合适 2.分箱要达成什么…

Antlr4: 为parser rule添加label

1. parser rule中的label 1.1 简介 Antrl4语法文件Calculator.g4&#xff0c;stat和expr两个parser rule含有多个rule element&#xff0c;我们这两个parse rule的每个rule element添加了Alternative labels&#xff08;简称label&#xff09; 按照Antlr4的语法规则&#xff…

2022年显卡性能跑分排名表

2022年显卡性能跑分排名表&#xff08;数据来源于快科技&#xff09;这个版本的电脑显卡跑分榜第一的是NVIDIA GeForce RTX 3090 Ti显卡。由于显卡跑分受不同的测试环境、不同的显卡驱动版本以及不同散热设计而有所不同&#xff0c;所以显卡跑分会一直变化。 前二十名的台式电…

Linux(进程概念详解)

进程是如今编程领域非常重要的一个概念&#xff0c;进程是比较抽象的&#xff0c;不容易直接理解。因为进程与操作系统息息相关&#xff0c;因此在介绍进程之前&#xff0c;笔者打算先简易讲一下操作系统的工作流程&#xff0c;理解操作系统是如何管理软件和硬件的&#xff0c;…

垃圾收集器和内存分配(第五章)

《实战Java虚拟机&#xff1a;JVM故障诊断与性能优化 (第2版)》 Java 平台&#xff0c;标准版热点虚拟机垃圾回收调优指南 垃圾收集器虽然看起来数量比较多&#xff0c;但其实总体逻辑都是因为硬件环境的升级而演化出来的产品&#xff0c;不同垃圾收集器的产生总体可以划分为几…

智能优化算法应用:基于蚁狮优化算法的工程优化案例-附代码

智能优化算法应用&#xff1a;基于蚁狮算法的工程优化案例 文章目录智能优化算法应用&#xff1a;基于蚁狮算法的工程优化案例1.蚁狮算法2.压力容器设计问题3.三杆桁架设计问题4.拉压弹簧设计问题5.Matlab代码6.python代码摘要&#xff1a;本文介绍利用蚁狮搜索算法&#xff0c…

191、【动态规划】AcWing —— 900. 整数划分:完全背包解法+加减1解法(C++版本)

题目描述 参考文章&#xff1a;900. 整数划分 解题思路 因为本题中规定了数字从大到小&#xff0c;其实也就是不论是1 2 1 4&#xff0c;还是2 1 1 4&#xff0c;都会被看作是2 1 1 4这一种情况&#xff0c;因此本题是在遍历中不考虑结果顺序。 背包问题中只需考虑…

AcWing:并查集

并查集理论基础并查集的作用是什么&#xff1a;将两个集合合并。询问两个元素是否在一个集合当中。如果不使用并查集&#xff0c;要完成上述两个操作&#xff0c;我们需要&#xff1a;创建一个数组来表示某个元素在某个集合之中&#xff0c;如belong[x] a&#xff0c;即x元素在…

0201基础-组件-React

1 组件和模块 1.1 模块 对外提供特定功能的js程序&#xff0c;一般就是一个js文件 为什么拆分模块呢&#xff1f;随着业务逻辑增加&#xff0c;代码越来越多&#xff0c;越来越复杂。作用&#xff1a;复用js&#xff0c;简化js&#xff0c;提高js运行效率 1.2 模块化 当应用…

用gdb.attach()在gdb下断点但没停下的情况及解决办法

在python中&#xff0c;如果导入了pwntools&#xff0c;就可以使用里面的gdb.attach(io)的命令来下断点。 但是这一次鼠鼠遇到了一个情况就是下了断点&#xff0c;但是仍然无法在断点处开始运行&#xff0c;奇奇怪怪。 这是我的攻击脚本 我们运行一下。 可以看到其实已经运行起…

计算机网络模型、协议

ARP&#xff08;IP->MAC&#xff09;RARP&#xff08;MAC->IP&#xff09;TFTPHTTPDHCPNATARP&#xff08;IP->MAC&#xff09; 主机建立自己的ARP缓冲区存ARP列表 广播ARP请求&#xff0c;单播ARP响应 RARP&#xff08;MAC->IP&#xff09; 用于无盘工作站&am…

Java分布式全局ID(一)

随着互联网的不断发展&#xff0c;互联网企业的业务在飞速变化&#xff0c;推动着系统架构也在不断地发生变化。 如今微服务技术越来越成熟&#xff0c;很多企业都采用微服务架构来支撑内部及对外的业务&#xff0c;尤其是在高 并发大流量的电商业务场景下&#xff0c;微服务…

[1.#]第一章 计算机系统概述——知识回顾

第一章 计算机系统概述 知识回顾 &#xff08;对于考研408而言&#xff09; 这个章节主要以选择题形式考察。 总的来说&#xff0c;这个章节考察的深度、难度不会太大。另外&#xff0c;这个章节的分值占比是比较低的。 不过&#xff0c;对第一章的学习&#xff0c;有助于我们…

使用 Sublime Text 4 优雅地写C++

使用 Sublime Text 4 优雅地写C 进入sublime官网下载sublime的安装包&#xff08;当然也可以在官网下载页面下载portable版本&#xff0c;不过建议下载默认的setup版本&#xff09; 双击安装包&#xff1a; 应该一会就下载完成了。 此时可以在应用列表看到sublime&#xff1a;…

谈谈 爬虫遇到的 Access denied Error code 1020

这几天在练习爬虫的时候&#xff0c;遇到一个问题&#xff0c; 通过 python 代码从站点中拿到了目标图片的 url &#xff0c; 但是&#xff0c;在持久化到本地时&#xff0c;出现了错误&#xff0c;所有保存下来的图片都报错&#xff1a;文件损坏&#xff0c; 而且&#xff0c;…