集合进阶相关基础及底层原理

news2024/11/27 3:42:57

集合体系结构

单列集合:

Collenction 每次只能添加一个值,其中红色是接口,蓝色是实现类

                                                         图来自黑马程序员网课    

List系列集合:添加的元素是有序,可重复,有索引 

Set系列集合:添加的元素是无序,不重复,无索引 

双列集合:

Map:每次添加一对值

Collection集合

基础方法

        Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的

        图来自黑马程序员网课 

package com.lazyGirl.collectiondemo;

import java.util.ArrayList;
import java.util.Collection;

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


        Collection<String> coll = new ArrayList<String>();
        //要往List系列添加元素,始终为true
        //要往Set系列添加元素,如果当前元素不存在,方法返回true
        //否则返回false
        coll.add("A");
        System.out.println(coll);
        coll.clear();
        System.out.println(coll);
        coll.add("B");
        coll.add("C");
        //若删除的元素不存在,remove返回false
        //否则返回true
        boolean flag = coll.remove("A");
        System.out.println(flag);

        //判断元素是否存在底层是使用equals方法进行判断的
        //若集合存储的是自定义对象,也想通过contains方法判断是否包含,则需重写equals方法

        boolean res = coll.contains("B");
        System.out.println(res);

        System.out.println(coll.isEmpty());

        coll.add("hhh");
        int size_coll = coll.size();
        System.out.println(size_coll);


    }
}

        输出:

另外一个例子,关于contains()方法 

package com.lazyGirl.collectiondemo;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo2 {
    public static void main(String[] args) {
        Collection<Studnet> coll = new ArrayList<>();
        Studnet s1 = new Studnet("hh",12);
        Studnet s2 = new Studnet("hhh",112);
        Studnet s3 = new Studnet("hhhh",1112);

        coll.add(s1);
        coll.add(s2);
        coll.add(s3);

        Studnet s4 = new Studnet("hhhh",1112);
        //因为contains方法在底层依赖于equals方法判断对象是否一致
        //若存的是自定义对象,没有重写equals方法,则默认使用object类中的equals方法进行判断,
        // 而object类中的equals方法是根据地址值判断的
        boolean result = coll.contains(s4);
        System.out.println(result);


    }
}

        输出:

         

Collection的遍历方式 

        迭代器遍历:

                 迭代器在Java中的类时Iterator,迭代器是集合专用的遍历方式

                

                        图来自黑马程序员网课 

        

                        图来自黑马程序员

        迭代器在遍历集合的时候是不依赖索引的,通过指针遍历

        

package com.lazyGirl.collectiondemo;

import java.sql.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo3 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("A");
        coll.add("B");
        coll.add("C");

        Iterator<String> it = coll.iterator();
        while (it.hasNext()){
            System.out.println(it.next());//获取元素并移动指针
        }
//        System.out.println(it.next());
        //迭代器遍历完毕不会复位
        System.out.println(it.hasNext());

        Iterator<String> it2 = coll.iterator();
        while (it2.hasNext()){
//            System.out.println(it2.next());
//            System.out.println(it2.next());
            String s = it2.next();
            if (s.equals("A")){
//                coll.remove("A");
                //迭代器遍历时,不能用集合的方法进行增加或者删除,如删除,使用迭代器提供的remove方法进行删除
                it2.remove();
            }
        }

    }
}

        输出:

         

        底层源码:

        

 原理图:

        图来自黑马程序员网课 

         

        图来自黑马程序员网课 

        增强for遍历:

         增强for的底层就是迭代器,为了简化迭代器的代码书写的。

        在JDK5以后出现的,其内部原理就是一个Iterator迭代器

        所有的单列集合和数组才能用增强for循环遍历

        格式:

                for(元素的数据类型 变量名:数组或者集合){

                }

        //快捷键:集合名.for
        for (String str : coll) {
            System.out.println(str);
        }
        注意:

        修改增强for中的变量,不会改变集合中原本的数据

        

package com.lazyGirl.collectiondemo;

import java.util.ArrayList;
import java.util.Collection;

public class EnhancedFor {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("A");
        coll.add("B");
        coll.add("C");

        //快捷键:集合名.for
        for (String str : coll) {
            str = "111";
        }
        System.out.println(coll);
    }
}

        输出: 

        

        Lambda表达式遍历:

    coll.forEach(s -> System.out.println(s));
package com.lazyGirl.collectiondemo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;

public class EnhancedFor {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("A");
        coll.add("B");
        coll.add("C");

        //快捷键:集合名.for
        for (String str : coll) {
            str = "111";
        }
        System.out.println(coll);

        coll.forEach(new Consumer<String>() {

            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        coll.forEach(s -> System.out.println(s)
        );
    }
}

        输出:

         

      总结:

        Collection常见成员方法:add clear remove contains isEmpty size

        三种通用的遍历方式:

                迭代器:在遍历过程中需要删除元素,使用迭代器遍历

                增强for lambda:只遍历

ArrayList集合

List集合的特有方法

  1.   Collection的方法List都继承了
  2.   List集合有索引,所以多了很多索引操作的方法

        

        图来自黑马程序员网课

package com.lazyGirl.listdemo;

import java.util.ArrayList;
import java.util.List;

public class ListDemo1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("C");

        System.out.println(list);

        //在指定位置上添加元素,后面元素后移
        list.add(1,"D");
        System.out.println(list);

        String a = list.remove(0);
        System.out.println(a);
        System.out.println(list);

        List<Integer> lt1 = new ArrayList<Integer>();
        lt1.add(1);
        lt1.add(2);
        lt1.add(3);

        //删除元素时,如果出现方法重载,优先调用实参跟形参类型一致的方法
        lt1.remove(1);
        System.out.println(lt1);
        //手动装箱,把基本数据类型的1变为Integer类型
        Integer i = Integer.valueOf(1);
        lt1.remove(i);
        System.out.println(lt1);

        lt1.add(4);
        lt1.add(5);

        //修改指定索引处的元素,返回被修改的元素
        String res = list.set(0,"R");
        System.out.println(res);
        System.out.println(list);

        System.out.println(list.get(0));

    }
}

        输出:

         

 List集合的遍历方式

迭代器遍历

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListInterator {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

    }
}

列表迭代器遍历

package com.lazyGirl.listdemo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListInterator {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);


        ListIterator<Integer> it2 =  list.listIterator();
        while (it2.hasNext()){
            int temp = it2.next();
            if (temp == 2){
                it2.add(3);
            }
        }
        System.out.println();
        System.out.println(list);

    }
}

        输出: 

        

增强for遍历

package com.lazyGirl.listdemo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListInterator {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);


        for (Integer i : list) {
            System.out.print(i + " ");
        }

    }
}

Lambda表达式遍历

package com.lazyGirl.listdemo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListInterator {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);

        list.forEach(i -> System.out.print(i + " "));

    }
}

普通for循环

      

package com.lazyGirl.listdemo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListInterator {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);

        for (int i = 0; i < list.size(); i++) {
            int temp = list.get(i);
            System.out.print(temp + " ");
        }
    }
}

        五种 遍历方式对比:

        迭代器遍历:在遍历过程中需要删除元素

        列表迭代器:在遍历的过程中需要添加元素,

        增强for以及Lambda表达式:仅遍历

        普通for:遍历的时候想操作索引

底层原理

        1. 利用空参创建的集合,在底层创建一个默认长度为0的数组

        2. 添加第一个元素时,底层会创建一个新的长度为10的数组,这个数组的名字叫elementData

        3. 存满时,会扩容1.5倍

        4. 如果一次添加多个元素,1.5倍放不下,则新创建数组的长度以实际为准

        图来自黑马程序员网课 

数据结构概述

        数据结构是计算机底层存储,组织数据的方式,指数据相互之间是以什么方式排列在一起的

数据结构(栈):先进后出(方法运行的时候进栈,执行完出栈)

数据结构(队列):先进先出

数据结构(数组):元素在内存中是连续存储的(删除元素较麻烦)

数据结构(链表):

        链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址,链表查询慢,无论查询哪个数据都要从头开始找

                图来自黑马程序员网课 

LinkedList集合

  1. 底层数据结构是双链表,查询慢,增删快,但是如果操作的是收尾元素,速度也是极快的   
  2.  LinkedList本身多了很多直接操作收尾元素的特有API   

                 

                        图来自黑马程序员网课 

        

LinkedList底层原理 

 

        图来自黑马程序员网课 

 

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

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

相关文章

--- JAVA 多态 ---

多态&#xff0c;顾名思义就时有多种形态&#xff0c;那咋样才嫩共有多种形态呢&#xff0c;再java中就是用不同的对象去调用同一个方法&#xff0c;产生了不同的结果。 看这段代码&#xff0c;我调用的是同一个方法&#xff0c;且只是传入的对象的不同&#xff0c;但是产生了不…

【数据结构】平衡二叉树(AVL树)

目录 前言 一、AVL树概念 二、AVL树节点定义 三、AVL树插入 1. 按照二叉搜索树的方式插入新节点 2. 维护节点的平衡因子与调整树的结构 a. 新节点插入较高左子树的左侧---左左&#xff1a;右单旋 b. 新节点插入较高右子树的右侧---右右&#xff1a;左单旋 c. 新节点插入…

【php实战项目训练】——thinkPhP的登录与退出功能的实现,让登录退出畅通无阻

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【LeetCode】两数相加(基于单向链表)难度:中等

目录 理清题目 解题思路 题目代码 运行结果 我们来看一下题目描述&#xff1a; 理清题目 首先题目要求链表中的节点的值必须在[0,9]之间也就是说我们要处理的数字必为正整数&#xff0c;因此就不会涉及到太复杂的计算&#xff0c;题目其实就是要求对两个链表中的节点的值分…

美业SaaS系统源码分享-收银管理的主要功能

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 博弈美业-收银管理功能 1、同时支持支付宝和微信支付&#xff0c;具有简单便捷安全等优点&#xff0c;并且符…

vite+ts设置别名

准备工作 安装 types/node 避免代码爆红 npm install types/node一、根目录下 vite.config.ts 文件中配置 import { resolve } from path;resolve: {// 设置文件./src路径为 alias: [{find: ,replacement: resolve(__dirname, ./src)}] }二、根目录下 tsconfig.json 文件中配…

前端el-table-column使用template的新发现哈哈哈

记录一次无脑copy代码发现的新知识哈哈哈 新知识自己要去查阅相关知识学习&#xff0c;这里我没有描述噢 在el-table中的列el-table-column使用了多个button时&#xff0c;每个button都添加了<template slot-scope"scope">标签&#xff0c;导致只有其中一个but…

Makefile的入门学习

一、Makefile的入门学习 编译工具及构建工具介绍 在之前的课程&#xff0c;都是直接使用gcc对代码进行编译&#xff0c;这对简单的工程是可以的&#xff0c;但当我们遇到复杂的工程时&#xff0c;每次用gcc等编译工具去操作就会显得很低效。因此make工具就出现了&#xff0c;…

Linux高级进阶-ssh配置

Ubuntu-system 允许使用root远程登陆 apt install ssh -y在/etc/ssh/sshd_config 文件修改PermitRootLogin yes systemctl restart ssh远程连接软件用户名为root

Linux——内存管理代码分析

虚空间管理 页框和页的关系 页框 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框&#xff0c;也叫页帧&#xff0c;即物理页面&#xff0c;是linux划分内存空间的结果。 每个页框都有一个页框号&#xff0c;即内存块号、物理块号。 页 将用户…

【LeetCode 滑动窗口】LC_3_无重复字符的最长子串

文章目录 1. 无重复字符的最长子串 1. 无重复字符的最长子串 题目链接&#x1f517; &#x1f34e;题目思路&#xff1a;&#x1f427;① 滑动窗口的思想&#xff1b;&#x1f427;② 用什么来维护窗口呢 &#xff1f; 用 双指针 和 unordered_set来维护&#xff0c;为什么呢…

《大道平渊》· 玖 —— 把高深的道理讲的通俗,这是一门艺术。

《平渊》 玖 "化繁为简, 点石成金。" 把高深的道理讲得通俗&#xff0c;这是一门艺术&#xff01; 讲述者能够站在群众的角度&#xff0c;用尽可能简单通俗的语言来解释复杂的概念。 讲述者需要对概念有深刻的理解&#xff0c;还要有灵活的表达能力。 群众愿意接受…

新型航标驱鸟器:解决鸟粪污染问题

航标作为船舶航行的重要导向标志&#xff0c;承载着为各类水上活动提供安全信息的重任。近年来&#xff0c;随着环保意识的提升&#xff0c;鸟类种群数量的增加&#xff0c;航标船上的鸟类问题逐渐凸显。许多鸟类会在航标船上停歇、捕食&#xff0c;造成了航标船严重的鸟粪污染…

【实战】kafka3.X kraft模式集群搭建

文章目录 前言kafka2.0与3.x对比准备工作JDK安装kafka安装服务器增加hosts 修改Kraft协议配置文件格式化存储目录 启动集群停止集群测试Kafka集群创建topic查看topic列表查看消息详情生产消息消费消息查看消费者组查看消费者组列表 前言 相信很多同学都用过Kafka2.0吧&#xf…

redis安裝启动

1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd&#xff0c;切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…

打破信息孤岛,U-Mail邮件系统轻松集成各类业务系统

随着国家大力推动企业数字化转型&#xff0c;企业内部数字化建设需要各种业务系统来提高企业生产力&#xff0c;然而&#xff0c;随着在业务数据量逐步增大的情形下&#xff0c;如何更加高效地整合、协同各个系统之间的信息交互&#xff0c;并且更好地融合企业邮件系统&#xf…

Visual Studio Code 开发esp8266流程2Arduino 配置 nodemcu

http://arduino.esp8266.com/stable/package_esp8266com_index.json http://arduino.esp8266.com/stable/package_esp8266com_index.json Arduino: Library Manager Arduino: Board

项目:基于httplib/消息队列负载均衡式在线OJ

文章目录 写在前面关于组件开源仓库和项目上线其他文档说明项目亮点 使用技术和环境项目宏观结构模块实现compiler模块runner模块compile_run模块compile_server模块 基于MVC结构的OJ服务什么是MVC&#xff1f;用户请求服务路由功能Model模块view模块Control模块 写在前面 关于…

UV胶为什么会开裂?如何避免UV胶开裂?

UV胶为什么会开裂&#xff1f;如何避免UV胶开裂&#xff1f; UV胶开裂可能由以下几个主要因素导致&#xff1a; 紫外线照射不足&#xff1a;UV胶的固化需要足够的紫外线能量。如果紫外线照射不足&#xff0c;胶水可能无法完全固化&#xff0c;导致开裂。这可能是由于固化设备…

数据挖掘与机器学习——聚类算法

目录 无监督学习 聚类算法 概念&#xff1a; 功能&#xff1a; 应用场景&#xff1a; 评判标准&#xff1a; 划分聚类&#xff1a; K-means聚类 逻辑实现&#xff1a; 聚类方式 问题&#xff1a; 解决&#xff1a; 可能存在的问题&#xff1a; 1.初始值对K-means聚…