Java Class11

news2025/1/11 13:57:54

Java Class11

集合

概念

集合是用于存储对象的工具类容器,实现了常用的数据结构,提供了一系列公开的方法用于删除、修改、查找和遍历数据,降低了日常开发成本。

三种集合

在这里插入图片描述

Set
set集合中元素是无序、不可重复的

List
list集合中元素是从前到后遍历的
List分为ArrayList和LinkedList

Map
map集合采用键值对存储,一个键对应一个值

在这里插入图片描述

ArrayList

基本操作

public class Demo {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();//定义ArrayList集合
        //add增
        list.add(1);
        list.add(2);
        list.add(3);
        //remove删
        list.remove(2);
        //set改
        list.set(0,3);
        //get取
        list.get(0);

    }

}

三种遍历方式

public class A {
    public static void main(String[] args) {
        //定义ArrayList集合
        List<Integer> list=new ArrayList<>(1000);//开辟空间为1000,类型为Integer
        //进行add操作  添加元素
        list.add(1);
        list.add(2);
        list.add(3);

        for(int i=0;i<list.size();i++){//循环遍历集合的值
            System.out.println(list.get(i));//依次遍历输出元素的值
        }
        Iterator <Integer>it=list.iterator();//初始化迭代器

        while (it.hasNext()){//判断下一元素值是否存在
            Integer i=it.next();//遍历下一元素的值
            System.out.println(i);//打印当前元素的值
        }

        for(int i:list){//利用foreach循环遍历元素的值
            System.out.println(i);
        }
        //定义ArrayList集合并赋初值
        List<Integer> list2= Arrays.asList(1,2,3,4,5);
        //已经定义初值的集合不能对元素的个数进行修改
//        list2.add(6);
//        list2.remove(2);
//        list2.clear();
        list2.set(1,30);//set操作是修改元素的值,并没有改动元素个数
    }
}

可变形参

public class Demo {
    private int age;
    private String name;

    public void method1(int age1,String name1){
        age=age1;
        name=name1;
    }

    public void method2(int age1,int age2,String name1){
        age1=age2;
        age=age1;
        name=name1;
    }

    public void method3(String name,int...age){

    }
}

可变形参可以帮助解决重载问题,避免同一类型参数重复调用造成冗余

fail-safe

fail-fast
fail-fast存在多线程环境下,当线程1对集合进行遍历时,线程2在期间进行修改,造成线程1读取的结果发生变化

public class B {
    public static void main(String[] args) {
        List list=new ArrayList();//定义集合
        list.add(1);
        list.add(2);
        list.add(3);

        List list1=list.subList(0,2);
        list.remove(0);
        list.add(6);
//        输出子集合会报错,输出原集合不会报错
//        System.out.println(list1);
    }
}

上述代码中,两个list同时对其进行读写操作,控制台会报异常,启动sail-safe机制保证读写一致。

addAll

addAll可以看做是add操作的加强版,可以一次性将多个值一次存储到集合,避免了每次add都会进行的开堆操作。

public class C {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();//定义list集合
        Collection c=new ArrayList();//定义集合
        //向集合添加元素
        c.add("A");
        c.add("B");
        c.add("C");
        list.addAll(c);//addAll一次加入元素
        Iterator<String> it=list.iterator();//定义迭代器
        while (it.hasNext()){//判断是否还有下个元素
            System.out.println(it.next());//打印下个元素
        }

    }
}

CopyOnWriteArrayList

CopyOnWriteArrayList是基于ArrayList在多线程处理中出现异常而出现的。

CopyOnWriteArrayList在内部会进行加锁操作,在多线程时会复制一个新的集合,在原来的集合中进行读操作,而在复制集合中进行修改操作,修改操作完毕后将原集合指针指向复制集合,原集合做删除操作。

public class C1 {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();//定义list集合
        //向集合依次添加元素
        list.add("A");
        list.add("B");
        list.add("C");
        List<String> list2=new CopyOnWriteArrayList<>();//定义COW集合
        list.add("D");
        Iterator<String> it=list.iterator();//定义迭代器
        while (it.hasNext()){//判断是否由下一个元素
            System.out.println(it.next());//进行打印
        }
    }
}

CopyOnWriteArrayList的内存占用很大,所以不适合进行多次修改操作

原来集合内存占用:100M
复制集合占用:100M
插入大小占用:10M

总共:100+100+10=210M

LinkedList

LinkedList是双向链表,LinkedList插入和删除快,但查找慢。

public class D {
    public static void main(String[] args) {
        Queue<String> q=new LinkedList<>();//定义Linked集合
        //依次输入元素的值
        q.offer("北京");
        q.offer("上海");
        q.offer("广州");
        String str="";//定义字符串
        while ((str=q.poll())!=null){//判断是否为空
            System.out.println(str);//打印元素的值
        }
    }
}

ArrayList与LinkedList比较

ArrayList底层采用顺序表进行存储,所以查找容易,增删改操作效率较低

LinkedList底层采用双向链表进行存储,所以增删改操作容易,但查找不如ArrayList

HashMap

在这里插入图片描述
HashMap在JDK8.0前是是顺序表+链表
JDK8.0后是顺序表+链表+红黑树

slot哈希槽:位置标识,类似指针对应数组的下标
table顺序表:是一个数组,做bucket的表头
bucket哈希桶:用链表存储对应的元素的值

public class E {
    public static void main(String[] args) {
        Map<String,Object> map=new HashMap(100);//定义HashMap
        map.put("北京",100);
        map.put("上海",200);
        map.put("天津",300);
        map.put(null,null);

        List list=new ArrayList();//定义list集合
        list.add("张");
        list.add("王");
        list.add("李");

        Iterator it=map.keySet().iterator();//定义迭代器
        //输出键
        while (it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println();
        Iterator it2=map.values().iterator();//定义迭代器
        //输出值
        while (it2.hasNext()){
            System.out.println(it2.next());
        }
    }
}

HashMap存在的问题

1.数据丢失
两个线程同时进行修改操作时,后一个操作会覆盖前一个,造成对象丢失

2.已遍历区间新增元素会丢失
使用迁移方法时,新增的元素会落在已遍历过的哈希槽上,在遍历完成后,table数组引用指向了newTable,这时新增元素会被当做垃圾回收

3.新表会被覆盖

4.迁移丢失

ConcurrentHashMap

ConcurrentHashMap采用volatile关键字而不使用加锁方法,牺牲部分效率,但性能较好

ConcurrentHashMap利用锁分段技术加强锁的数量,使争夺同一把锁的线程数目得到控制。

在这里插入图片描述

使用锁分段技术,在面对大量数据的时候,想要处理部分数据不需要对整体加锁(这样频繁操作会大大降低效率),而是采用锁分段技术对每段数据进行加锁,这样只需要对该部分进行解锁,而不改变其他数据段,从而提高效率

但在面对size(判断大小)containsValue(查找值)等操作需要遍历整体才能得出结果时,还是需要对整体进行加锁

ConurrentHashMap由Segment和HashEntry组成。
Segment是一种可重入锁
HashEntry用来存储键值对数据

Segment结构和HashMap类似,一个Segment包含一个HashEntry数组

Set

Set中不允许出现重复元素
常用HashSet、TreeSet、LinkedSet等

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

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

相关文章

公众号免费搜题功能搭建

公众号免费搜题功能搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xf…

基于C语言实现进度条 | 附源码

进度条的应用在软件中无处不在&#xff0c;拷贝一个文件需要一个进度条&#xff0c;加载一个文件也需要一个进度条&#xff0c;来标志完成与否。 那么 &#xff0c;一个进度条有哪些元素呢&#xff1a; 一个不断向右生长的容器&#xff08;直观的看出当前的进度&#xff09; …

Spring的循环依赖问题

Spring中循环依赖场景有&#xff1a; 构造器的循环依赖&#xff08;构造器注⼊&#xff09; Field 属性的循环依赖&#xff08;set注⼊&#xff09; 各场景下循环依赖解决的情况 单例 bean 构造器参数循环依赖&#xff08;⽆法解决&#xff09; 构造器在Bean的生命周期中实例…

GitHub最新发布,阿里十年架构师手写版spring全家桶笔记全新开源

嗨咯&#xff0c;大家好&#xff01; 没错&#xff0c;又是我&#xff0c;还跟前面一样&#xff0c;有好东西我才会出现。那是什么好东西呢&#xff1f;今天啊&#xff0c;给他分享阿里在Github最新发布的spring全家桶笔记第九版&#xff0c;这份笔记一共分三份&#xff1a;sp…

G1垃圾回收器

概述 官网 https://docs.oracle.com/en/java/javase/16/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573 简介 G1垃圾回收器可以同时回收新生代和老年代的对象&#xff0c;不需要两个垃圾回收器配合起来运作&#xff0c;他一…

高项 进度管理论文

七个过程&#xff1a; 项目进度管理包括为管理项目按时完成所需的7个过程&#xff0c;具体为&#xff1a; &#xff08;1&#xff09;规划进度管理&#xff1a;为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档过程。 &#xff08;2&#xff09;定义活动&…

【C语言】初阶指针的简单使用 _指针运算 指针和数组的关系[初阶篇 _学习专用]

1.指针是什么&#xff1f; 在学习指针的时候&#xff0c;我们经常会看到下面这段代码&#xff1a; int main() {int a 10;int* pa &a;*pa 20; } 之前并没有接触过指针的朋友们看到后可能是一头雾水&#xff0c;根本不知道从哪里去理解&#xff1b;下面我们就通过一些…

STM32开发时HardFault错误的排查

STM32开发时HardFault错误的排查 本篇是 嵌入式开发-STM32硬件I2C驱动OLED屏 一文的扩展。 把相关的问题记录一下&#xff0c;给遇到HardFault_Handler问题的朋友做个参考。 故障现象 做STM32开发&#xff0c;经常遇到HardFault错误&#xff0c;也就是程序不会正常运行&…

WPF动画(2)

动画的生命周期 从技术的角度看&#xff0c;WPF动画只是暂时的&#xff0c;这意味着它们不能真正改变基本属性的 值&#xff0c;当动画处于活动状态时&#xff0c;只是覆盖了属性的值 。 单向动画&#xff0c;在动画运行结束后会保持处于活动状态&#xff0c;这是因为动画需要…

(十一)手写简单的Spring框架

文章目录第一步&#xff1a;搭建环境第二步&#xff1a;准备好要管理的Bean第三步&#xff1a;准备myspring.xml配置文件第四步&#xff1a;编写MyApplicationContext接口第五步&#xff1a;编写MyClassPathXmlApplicationContext第六步&#xff1a;采用Map集合存储Bean第七步&…

第十一章 Golang面向对象编程(下)

面向对象编程三大特性 基本介绍 Golang仍然有面向对象编程的继承&#xff0c;封装和多态的特性&#xff0c;只是实现的方式和其他OOP语言不一样。 封装 面向对象编程思想-抽象 我们在前面去定义一个结构体的时候&#xff0c;实际上就是把一类事物共有的属性&#xff08;字段…

Presto 之 explain and explain analyze的实现

一. 前言 本文主要探索在Presto中Explain功能是如何实现的。在Presto中&#xff0c;Explain用法有两种&#xff0c;一种是单纯的explain&#xff0c;此场景只会显示经过RBO优化后的执行计划&#xff0c;但是查询并不会真正地执行。第二种是explain analyze&#xff0c;此场景会…

JVM常用参数

JVM内存相关的几个核心参数 -Xms&#xff1a;Java堆内存初始大小-Xmx&#xff1a;Java堆内存的最大大小-Xmn&#xff1a;Java堆内存中的新生代大小&#xff0c;扣除新生代剩下的就是老年代的内存大小了-XX:PermSize&#xff1a;永久代大小-XX:MaxPermSize&#xff1a;永久代最…

疾控物资管理系统-疾控中心物资管理系统

一、系统概述 东识科技&#xff08;DONWIT&#xff09;疾控中心物资管理系统&#xff08;智物资DW-S300&#xff09;是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 随着疫情的突…

(STM32)从零开始的RT-Thread之旅--GPIO

上一篇&#xff1a; (STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置 无论什么开发板&#xff0c;最先调试的肯定是GPIO&#xff0c;一般用来用作指示灯或者按键输入。本篇只是很简单的GPIO应用&#xff0c;没有具体分析RTT框架实现。 首先先创建一个BSP文件夹&…

机器人操作系统ROS(21) jetson nano安装torch tensorflow

安装torch、tensorflow其实跟普通在Linux系统安装没有区别&#xff0c;但是Linux是arch64位的&#xff0c;而jetson是aarch64位的&#xff0c;所以还是不太一样。 另外一个坑是&#xff1a;购买的创乐博的机器人&#xff0c;已经安装ros&#xff0c;但是安装torh的时候需要apt …

使用Spring实现工厂+策略模式

使用Spring实现工厂策略模式 这里使用发短信业务&#xff1a; 不同短信有不同模板但是发送方法都相同只是发送内同不同 1. 定义短信发送策略接口&#xff1a; //策略接口 public interface SmsTemStrategy {public void sendSms(Map<String,String> params); }2.短信…

【Python】Numpy傅里叶变换总结

文章目录简介fft简介 Fourier变换极其逆变换在数学上的定义如下 F(ω)∫−∞∞f(t)e−iωtdtf(t)π2∫−∞∞F(ω)eiωtdωF(\omega)\int^\infty_{-\infty}f(t)e^{-i\omega t}\text dt\\ f(t)\frac{\pi}{2}\int^\infty_{-\infty}F(\omega)e^{i\omega t}\text d\omega F(ω)∫−…

飞行机器人专栏(八)-- AGX Xavier 通信、控制及视觉应用开发

目录 0. Introduction of Jetson Developer kits 1. 硬件对比 Jetson 模组系列 Jetson AGX Orin 系列 Jetson Orin NX 系列 Jetson AGX Xavier 系列 Jetson Xavier NX 系列 Jetson TX2 系列 Jetson Nano 2. 应用场景 1. Introduction of AGX Xavier Taking Perform…

HTML+PHP+MySQL实现新闻列表模块(1+X Web前端开发中级 例题)——初稿

&#x1f4c4;题目要求 阅读下列说明、效果图、MySQL数据库操作和代码&#xff0c;进行动态网页开发&#xff0c;填写&#xff08;1&#xff09;至&#xff08;15&#xff09;代码。&#x1f9e9;说明 该程序为一个html和php混合的新闻列表模块&#xff0c;使用PHP语言&#x…