java进阶一:java集合

2023-11-01

1、集合简介

集合和数组类似,都是储存元素的容器,数组像是静态容器(长度一旦创建就不能再改变、元素类型必须统一、只能通过下标去索引元素等),集合像是动态容器(集合的长度可以动态的改变、元素类型可以不一致、可以用某个映射的关系去索引元素等)
java中的集合是一个工具类,可以储存任意数量且具有共同属性的对象。集合的应用场景一般有以下几点

  1. 无法预测储存数据的数量
  2. 同时储存具有一对一关系的数据
  3. 举要进行频繁的数据增删操作
  4. 数据重复问题

java中的集合主要可以分为Collection和Map两大体系,下图是collection的体系图
在这里插入图片描述

2、Collection(接口)

在Collection下,可以分为List和Set两大类
向集合中添加元素
在这里插入图片描述
从集合中移除元素
在这里插入图片描述
使用迭代器遍历集合
Iterator的对象称为迭代器(设计模式中的一种),主要用于遍历Collection集合中的元素。所有实现了Collection接口的集合类都有一个iterator()方法,用于返回一个实现了Iterator接口的对象。Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。如果要创建Iterator对象,就必须有一个被迭代的集合
在这里插入图片描述

2.1List(接口)

List集合下的元素可以重复,并会记录元素添加的顺序。
List下有三个实现类:ArrayList(主要实现类,适合在数据查找频率较高的情况下使用)、LinkedList(适合在数据插入、删除频繁的情况下使用)、Vector(古老的实现类,几乎不用不介绍了)

2.1.1ArrayList

ArrayList是对象引用的一个变长数组,所以随机查找时效率很高,增删比较频繁的时候不建议使用。
ArrayList时线程不安全的,而Vector是线程安全的,即使为了使用线程安全也不会使用Vector,因为效率太低了
ArrarList.asList(…)返回的是一个固定长度的List集合,既不是ArrayList实例也不是Vector实例

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

public class arraylist {
    /**
     * 从40个学生的班级中,随机抽取两个java成绩大于60分的同学,计算平均分作为班级的平均分
     * */
    public static void main(String[] args) {
        List allScores = new ArrayList<>();
        int allStudent = 40;
        Random random = new Random();
        // 随机产生40个人的成绩
        for (int i = 0; i < allStudent; i++) {
            allScores.add(i,random.nextInt(101));
        }
        // 查询所有成绩大于60分的人
        List passScores = new ArrayList<>();
        for (Object allScore : allScores) {
            if((Integer)allScore>60){
                passScores.add((Integer)allScore);
            }
        }
        // 随机抽取两名学生同学的分数作为平均成绩
        int passLength = passScores.size();
        int score1 = (Integer)passScores.get(random.nextInt(passLength));
        int score2 = (Integer)passScores.get(random.nextInt(passLength));
        System.out.println("抽取的两个学生成绩为"+score1+"  "+score2);
        System.out.println("平均成绩为"+(score1+score2)/2);
    }
}

2.1.2LinkedList

LinkedList内部是链表进行维护的,在我们模拟栈、队列的时候,都可以使用它

import java.util.LinkedList;

public class linkedlist {
    public static void main(String[] args) {
        LinkedList<String> objects = new LinkedList<>();
        objects.add("java");
        objects.add("python");
        objects.add("C++");
        // void addFirst(Object obj) 在该列表开头指定插入的元素
        // void addLast(Object obj) 将指定的元素追加到此列表的末尾
        // Object getFirst() 返回此列表中的第一个元素
        // Object getLast() 返回此列表中的最后一个元素
        // Object removeFirst() 从此列表中删除并返回第一个元素
        // Object removeLast() 从列表中删除并返回最后一个元素
//        objects.addFirst("dd");
        String s = objects.getFirst();
        System.out.println(s);
        for (Object object : objects) {
            System.out.println(object);
        }
    }
}

2.2Set(接口)

Set集合下的元素是不可重复的,并且是无序的,Set接口是Collection的子接口
Set下主要有三个实现类:HashSet(典型的实现类,按Hash算法来储存集合中的元素,因此具有很好的存取和查找性能)、LinkedHashSet(同时使用链表维护元素的次序,使得元素看起来是以插入顺序保存的)、TreeSet(可以确保集合元素处于排序状态)

2.2.1HashSet

只要底层不是数组就不会有下标。所以删除元素只能通过元素内容删除
HashSet是Set接口的典型实现,大多数使用set集合时都使用这个实现类,HashSet按照Hash算法来储存集合中的元素,因此具有很好的存取和查找性能。HashSet的特点如下
不能保证元素的排列顺序
HashSet不是线程安全的
集合元素可以是null
在这里插入图片描述

2.2.1TreeSet

底层是二叉树:不可重复,但是有序,对于实现了comparable、comparator接口的类型就可以排序,可以对于八种基本数据类型排序,也可以对String进行排序,仅限于英文
在这里插入图片描述

3、Map集合(也是一个接口重要)

list和set接口都是单列集合存数据是一条一条存的,map是双列行集合,成对存的,通过本文的第一张图可以看出如果一个接口是继承collection的就是单列集合
双向型,存放数据无序,key不可以重复,value可以重复

3.1HashMap

底层也是hash表,key不可以重复、value可以重复,key对于的记录无序
添加方法put,返回值是上一个key的值
修改方法,没有修改方法,通过添加同key做覆盖修改
删除方法remove可以根据key删除clear删除整个map
查询方法get的key或者匿名函数
在这里插入图片描述

3.2TreeMap

底层是二叉树,key不可以重复,value可以重复,treemap是有序的,可以根据key进行排序,排序的原则是可以进行比较即key的类型实现了(comparable、comparator接口),TreeMap增删改查的方法和HashMap一模一样

import java.util.TreeMap;

public class Demo02 {
    public static void main(String[] args) {
//        TreeMap<String, Integer> aMap = new TreeMap<>();
//        aMap.put("b",12);
//        aMap.put("a",10);
//        aMap.put("c",50);
//        aMap.put("z",12);
//        aMap.forEach((k,v)->{
//            System.out.println(k+"="+v);
//        });
        // 给东一个字符串,统计每个字符出现的次数
        String str = "sfgskjsngashrbgsdjcnsjdknvasngierumdcakdjs";
        // 将字符串转成字符数组
        char[] a = str.toCharArray();
        // 取出数组中的某个元素,看容器中是否存在
        TreeMap<String, Integer> aMap = new TreeMap<>();
        for (char c : a) {
            Integer value = aMap.get(c+"");
            if(value==null){
                aMap.put(c+"",1);
            }else{
                value++;
                aMap.put(c+"",value); // 字符串加任何数字都是字符串
            }
        }
        //打印结果
        aMap.forEach((k,v)->{
            System.out.println(k+""+v);
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java进阶一:java集合 的相关文章

  • 相关概念地址笔记

    公平锁与非公平锁 https www jianshu com p f584799f1c77 java socket编程https www cnblogs com mingforyou p 3258418 html java四种引用类型htt
  • RocketMQ解析

    文章目录 1 单机版消息中心 2 分布式消息中心 2 1 问题与解决 2 1 1 消息丢失的问题 2 1 2 同步落盘怎么才能快 2 1 3 消息堆积的问题 2 1 4 定时消息的实现 2 1 5 顺序消息的实现 2 1 6 分布式消息的实
  • Think in java书籍阅读小结

    一 博客说明 本篇博客为本人看完think in java这本书后 个人查漏补缺的一些知识点 记录下来作为笔记使用 二 变量初始化顺序 在一个类里 变量初始化的顺序是由变量在类内的定义顺序决定的 即使变量定义大量遍布于方法定义的后面 那些变
  • (java基础学习)异常

    1 基本概念 java语言中 将程序中发生的不正常情况称为 异常 开发过程中的语法错误和逻辑错误不是异常 2 异常事件分为两大类 1 Error 错误 2 Exception 1 Error 错误 java虚拟机无法解决的严重问题 如 JV
  • java入门二:java流程控制

    1 用户交互Scanner java util Scanner是Java5的新特性 可以通过Scanner类来获取用户的输入 基本语法 Scanner s new Scanner System in 通过Scanner类的next 与nex
  • java入门一:java语法基础

    1 注释 标识符 单行注释 多行注释 文字 文档注释 文字 注释不会被编译 写给程序员看 平时写代码一定写注释 方便别人看的懂你的代码 或者写久了自己忘了干嘛的 关键字 abstract assert boolean int class 不
  • java进阶一:java集合

    1 集合简介 集合和数组类似 都是储存元素的容器 数组像是静态容器 长度一旦创建就不能再改变 元素类型必须统一 只能通过下标去索引元素等 集合像是动态容器 集合的长度可以动态的改变 元素类型可以不一致 可以用某个映射的关系去索引元素等 ja
  • Android校招复习全书(1)-j2se

    一 九种基本数据类型的大小 以及他们的封装类 关于JAVA基本数据类型 名称 解释 长度 位 默认值 封装类 byte 字节 8 0 Byte shot 短整型 16 0 Short int 整型 32 0 Integer long 长整型
  • 关于java中File类的总结

    1 File类只是操作文件 不涉及内容 2 File类的重要方法 设置完整路径 public File String filename 删除文件 public boolean delete 判断文件是否存在 public boolean e
  • JAV学习Object类

    Obj类 首先我们要认识到 Object类是我们所有类的顶层父类 所有类都是直接或者间接的继承自他 我们可以将它new出来也就是格式 Object obj new Object 我们罗列出来objct类的常用方法然后再一一介绍 方法名 ob
  • Java中局部变量、静态变量、静态方法的有效范围与调用

    1 局部变量 定义 在成员方法中定义的变量称为局部变量 方法中的形参也可以作为局部变量 例 public void method1 n i均为局部变量 int n for int i 0 i lt 5 i System out printl
  • c# 中MD5.ComputeHash() aes加密,在Java和golang中的实现

    类似移植C 代码需求 需要加密效果一致 C 中使用了AesCryptoServiceProvider加密 文档链接 AesCryptoServiceProvider 类 下载里面代码在Visul Studio2019中可以针对原加密字符解密
  • JDK源码系列 & JAVA语言数据类型Byte

    目录 类的继承结构图 类的Diagram图 类 类的注释 源码分析 全局变量 静态内部类 构造方法 静态方法 parseByte 静态方法 valueOf 静态方法 toString 静态方法 hashCode 静态方法 decode 静态
  • Java基础学习之函数式编程Comsumer接口(JDK8)

    前言 从毕业到现在正好三年 高难度的项目做了不少 但是基础这个东西一段时间不接触就会忘得一干二净 话不多说 开始今天的学习 1 Consumer接口 接触过 消费者 生产者 模式的同学 肯定对这个单词不陌生 在java8函数式编程和lamb
  • Java学习(对象与类)——文档注释,生成JavaDoc文件

    目录 注释的插入 类注释 方法注释 字段注释 通用注释 包注释 生成帮助文档JavaDoc 注释的插入 javadoc实用工具从下面几项中抽取信息 模块 包 公共类和接口 公共的和受保护的字段 公共的和受保护的构造器及方法 每个文档注释 包
  • 30--子类对象的实例化过程

    在继承的操作中 对于子类的实例化也是有要求的 即子类对象在实例化之前必须首先调用父类中的构造方法 然后再调用子类自己的构造方法 实例1 定义父类 package com qwy bean public class Person privat
  • java入门四:数组

    1 数组概述 数组是最简单的数据结构 是相同类型数据的有序集合 数组描述的是相同类型的若干个数据 按照一定的先后次序排列组合而成的 数组中 每一个数据称作一个数组元素 每个数组元素可以通过一个下标来访问他们 2 数组的声明创建 首先必须声明
  • Java基础学习之函数式编程Predicate接口(JDK8)

    前言 今天继续来学习函数式编程接口之Predicate接口 1 上源码 package javax persistence criteria import java util List public interface Predicate
  • java入门六:java基础终章

    1 static关键字 静态变量和类一起加载 final修饰后的类无法被继承 2 抽象类 abstract修饰符可以用来修饰方法也可以修饰类 如果修饰方法 那么该方法就是抽象方法 如果修饰类 那么该类就是抽象类 抽象类中可以没有抽象方法 但
  • Java基础学习之并发篇:手写阻塞队列ArrayBlockingQueue

    学习目标 我们都知道在并发编程中 阻塞队列在多线程中的场景特别有用 比如在生产和消费者模型中 生产者生产数据到队列 队列满时需要阻塞线程 停止生产 消费者消费队列 对队列为空时阻塞线程停止消费 在Java中有提供不同场景的阻塞队列 那么接下

随机推荐

  • Linux学习笔记--一些错误的记录

    运行linux的时候 输入shutdown r now命令提示 bash shutdown is not found 出现这个错误是因为这条命令没有加入到系统的配置文件中 运行命令export PATH PATH sbin即可解决 转载于
  • VC10中的C++0x特性 Part 2 (3):右值引用

    VC10中的C 0x特性 Part 2 3 右值引用 来源 vcblog 作者 Stephan T Lavavej 翻译 飘飘白云 转载时请注明作者和出处 未经许可 请勿用于商业用途 简介 这一系列文章介绍Microsoft Visual
  • 虚拟内存、虚拟地址空间和物理地址空间(内存管理)

    文章目录 前言 一 虚拟地址和物理地址 二 虚拟内存 三 为什么引入虚拟内存 前言 虚拟内存 虚拟地址空间和物理地址空间 一 虚拟地址和物理地址 地址空间是一个非负整数地址的有序集合 在一个带虚拟内存的系统中 CPU从一个有N pow 2
  • vue3使用ElementPlus的消息el-message样式不生效或者被遮盖(z-index)

    问题1 el message自定义样式不生效 想改弹出框的位置时不生效 使用了el message的自定义类的custom class属性也不行 原因应该是加了scoped后使用到里面样式的dom会添加data v xxxx这种属性防止cs
  • spring JDBCTemplate 批量插入 返回id 批量插入返回批量id

    http www iteye com topic 1135650 1 插入一条记录返回刚插入记录的id Java代码 public int addBean final Bean b final String strSql insert in
  • 红黑树和AVL树的比较分析

    定义 AVL树全称是平衡二叉搜索树 相比于红黑树 他是一种高度平衡的二叉搜索树 所有节点的左右子树高度差不超过1 红黑树是一种弱平衡的二叉搜索树 它只要求部分达到平衡 其保证最长路径最多是最短路径的2倍 增删查比较 插入 就插入节点导致树失
  • 团队管理和协作,Markdown,原型的使用

    背景 公司的技术文档和接口都需要多人合作编写 博客只能是个人的技术总结 无法有效的团队管理 最终 技术文档 接口 数据字典 查看Demo web页面原型 app原型 在线作图 流程图 思维导图 原型图 UML 网络拓扑图 组织结构图
  • 【信息】宁波银行金融科技部:常见问题解答

    0 内推 我的内推码 90OF50 宁波银行金融科技部2023届校招开始了 内推码 90OF50 社招请直接与我联系哦 1 说明 本文是对很多朋友都关心的一些问题的集中解答 以免大家重复地询问一样的问题 大家自取自己关注的内容即可 顺序可能
  • Android Studio制作简单计算器

    代码地址 https github com xjhqre android calculator 效果演示 1 连续加法 2 连续减法 3 连续乘法 4 连续除法 5 优先级运算 6 退格功能 7 错误提示 制作步骤 1 创建按钮图片 1 1
  • bat小游戏代码大全_Python俄罗斯方块游戏代码

    本游戏共两个文件 blocks py和main py blocks py定义各类方块 main py定义游戏画面 blocks py import randomfrom collections import namedtuplePoint
  • CSS导航栏及下拉菜单

    导航栏对于一个网站来说非常重要 熟练地使用CSS可以转换成好看的导航栏而不是枯燥的HTML菜单 导航栏基本上是一个链接列表 所以使用 ul ul 和 li li 元素非常有意义 导航栏就是建立在列表标签的精确熟练使用上 小复习 伪类的使用方
  • SQL的开窗函数

    引用 在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题 非常多都要通过复杂的相关子查询或者存储过程来完毕 为了解决这些问题 在2003年ISO SQL标准增加了开窗函数 开窗函数的使用使得这些经典的难题能够被轻松的解决 眼下在
  • 怎么查看端口号被哪个程序占用从而解决端口冲突

    在java后台开发过程中我们可能都会遇到端口被占用的问题 但是此时又不知道端口被哪个端口占用 用下面方法可以查看端口是被哪个程序占用 然后结束这个程序就可以解决端口被占用的问题 1 按windows R键 输入cmd命令 回车 2 输入ne
  • 【微信小程序开发】一文带你详解小程序组件和 API 的使用

    引言 在小程序开发中 组件和API是非常重要的部分 它们可以帮助我们构建丰富的用户界面和实现各种功能 本文将介绍小程序中常用的组件和API 并提供相应的代码示例 文章目录 引言 组件 文本组件 图片组件 按钮组件 输入框组件 列表组件 AP
  • 三大移动Web开发框架哪个适合你?

    我最近特别关注JavaScript驱动的移动应用开发解决方案 先后撰文介绍了众多的相关话题 包括jQuery Mobile jQTouch Sencha Touch和PhoneGap 我得承认 要搞清楚这一批前沿技术并非易事 于是我这回概述
  • java远程调试_Java 远程调试原理(学习笔记)

    Java远程调试的原理 JDWP Java Debug Wire Protocol 两个VM之间通过debug协议进行通信 然后以达到远程调试的目的 两者之间可以通过socket进行通信 其中 调试的程序常常被称为debugger 而被调试
  • postgis中将数据库备份到其它数据库中还原

    1 备份数据库 可以用命令操作 pg dump U postgres h hostip d joint boot Fc gt D python Project PG data joint jar 2 创建新的数据库 可以在其它postgis
  • vCard和MECARD格式

    vcard和MECARD都是电子名片的格式 这几篇文章介绍都很详细 MECARD格式的电子名片简单介绍 链接1 链接2 vCard格式 链接 分割线 补充一个只有微信扫码时会出现的问题 不管是vCard还是MECARD 也不管vCard是2
  • SpringBoot优缺点分析

    Spring的优点分析 Spring是Java企业版 Java Enterprise Edition JEE 也称J2EE 的轻量级代替品 无需开发重量级的Enterprise JavaBean EJB Spring为企业级Java开发提供
  • java进阶一:java集合

    1 集合简介 集合和数组类似 都是储存元素的容器 数组像是静态容器 长度一旦创建就不能再改变 元素类型必须统一 只能通过下标去索引元素等 集合像是动态容器 集合的长度可以动态的改变 元素类型可以不一致 可以用某个映射的关系去索引元素等 ja