JAVA数组、String与集合详解

news2024/11/27 9:33:35

目录

1. 数组

1.1 初始化

1.2 遍历

1.3 数组执行原理

1.4 Arrays操作数组

2. String字符串

3. 集合

3.1 Collection

3.1.1 常用方法

3.1.2 分类

3.1.3 遍历方式

3.1.4 List

 3.1.5 Set

3.1.6 适用场景

 3.1.7 Collection总结

3.2 Collection其他操作 

3.2.1 并发修改异常

 3.2.2 可变参数

3.2.3 Collections工具类

1. 数组

一种数据结构,特点是不可变,有索引,有序。

1.1 初始化

  • 静态初始化:int[] nums=[1,2,3]
  • 动态初始化:int[] nums2 = new int[5]

1.2 遍历

  • for循环
  • 增强for循环

1.3 数组执行原理

JAVA是把编译后的字节码加载到Java虚拟机中执行的。

为了方便虚拟机执行程序,将虚拟机划分为方法区、堆、栈、本地方法栈、寄存器五块区域。重点关注方法区、堆、栈。

  • 方法区:字节码文件先加载到这里。
  • 堆:存储new出来的对象,并分配地址。
  • 栈:方法运行时进入的区域,变量在这个区域中。

1.4 Arrays操作数组

JAVA定义了Arrays工具类来操作数组。常用方法有:

  • Arrays.toString(); //将数组中的内容全部打印出来
  • Arrays.sort(); //数组排序

2. String字符串

表示字符串类型,属于引用类型,不属于基本类型。

双括号括起来的字符串,是不可变的,会存储在方法区的常量池中。

但new出来的String存储在堆中,且分配不同地址。

 常用方法

3. 集合

 大框架分为单列集合Collection和双列集合Map。

List元素有序,可重复,有索引。

Set元素无序,不可重复,无索引。

Map是无序,无索引的键值对。

3.1 Collection

3.1.1 常用方法

3.1.2 分类

List:元素有序,可重复,有索引

  • ArrayList:数组实现,查询快,没有同步,线程不安全
  • LinkedList:链表实现,增删快,没有同步,线程不安全
  • Vector:数组实现,同步,线程安全。Stack是Vector的实现类

Set:元素无序,不重复,无索引

  • HashSet:Hash表存储元素,LinkedHashSet维护元素插入顺序
  • TreeSet:二叉树实现,做内部排序

3.1.3 遍历方式

  • 迭代器遍历:Iterator<String> it = c.iterator();  t.hasNext();   it.next()
  • 增强for循环
  • forEach遍历,也就是Lambda表达式遍历。list.forEach(e->sout(e))

3.1.4 List

ArrayList底层原理: 基于数组结构实现。

数组长度固定,ArrayList可变原理:

  1. 利用无参构造器创建的集合,会在底层默认创建长度为0的数组。
  2. 添加第一个元素时,底层会创建一个新的长度为10的数组。
  3. 存满时,会扩容1.5倍。
  4. 如果一次添加多个元素,1.5倍放不下,会以实际内容为准

数组扩容并不是在原数组上扩容,而是创建一个新的数组,将原来数组内容复制过去。

遍历方式:可以使用普通For循环,外加上面三种方式。

 3.1.5 Set

Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只 是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素。

(1)HashSet

底层原理:HashSet底层时基于Hash表实现的。

  • JDK8以前:Hash表=数组+链表
  • JDK8以后:Hash表=数组+链表+红黑树

所以说要想使用HashSet存储元素,此元素对象要有两个方法:一个是hashCode方法获取元素的hashCode值(哈希值);另一个是调用了元素的equals方法,用来比较新添加的元素和集合中已有的元素是否相同。  

  • 只有新添加元素的hashCode值和集合中以后元素的hashCode值相同、新添加的元素调用equals方法和集合中已有元素比较结果为true, 才认为元素重复。

  • 如果hashCode值相同,equals比较不同,则以链表的形式连接在数组的同一个索引为位置(如上图所示)

在JDK8开始后,为了提高性能,当链表的长度超过8时,就会把链表转换为红黑树,如下图所示:

(2)LinkedHashSet

底层原理:也是Hash表,多了双向链表来维护元素的存取顺序。

(3)TreeSet

底层原理:二叉树(红黑树数据结构)

有序,不重复,无索引。

排序时必须指定规则,tring类型的元素,或者Integer类型的元素,它们本身就具备排序规。

两种方式定义排序规则:

  • 让元素的类实现Comparable接口,重写compareTo方法
  • 在创建TreeSet集合时,通过构造方法传递Compartor比较器对象。
@Override
public int compareTo(Student o) {
    //this:表示将要添加进去的Student对象
    //o: 表示集合中已有的Student对象
    return this.age-o.age;
}




Set<Student> set = new TreeSet<>(((o1, o2) -> o1.getAge()- o2.getAge()));

3.1.6 适用场景

 3.1.7 Collection总结

3.2 Collection其他操作 

3.2.1 并发修改异常

在使用迭代器遍历集合时,可能存在并发修改异常。

List<String> list = new ArrayList<>();
list.add("王麻子");
list.add("小李子");
list.add("李爱花");
list.add("张全蛋");
list.add("晓李");
list.add("李玉刚");
System.out.println(list); // [王麻子, 小李子, 李爱花, 张全蛋, 晓李, 李玉刚]

//需求:找出集合中带"李"字的姓名,并从集合中删除
Iterator<String> it = list.iterator();
while(it.hasNext()){
    String name = it.next();
    if(name.contains("李")){
        list.remove(name);
    }
}
System.out.println(list);

运行上面的代码,会出现下面的异常。这就是并发修改异常

为什么会出现这个异常呢?那是因为迭代器遍历机制,规定迭代器遍历集合的同时,不允许集合自己去增删元素,否则就会出现这个异常。

怎么解决?交给迭代器就行

//需求:找出集合中带"李"字的姓名,并从集合中删除
Iterator<String> it = list.iterator();
while(it.hasNext()){
    String name = it.next();
    if(name.contains("李")){
        //list.remove(name);
        it.remove(); //当前迭代器指向谁,就删除谁
    }
}

 3.2.2 可变参数

  • 可变参数是一种特殊的形式参数,定义在方法、构造器的形参列表处,它可以让方法接收多个同类型的实际参数。

  • 可变参数在方法内部,本质上是一个数组

public class ParamTest{
    public static void main(String[] args){
        //不传递参数,下面的nums长度则为0, 打印元素是[]
        test();	
        
        //传递3个参数,下面的nums长度为3,打印元素是[10, 20, 30]
        test(10,20,30); 
        
        //传递一个数组,下面数组长度为4,打印元素是[10,20,30,40] 
        int[] arr = new int[]{10,20,30,40}
        test(arr); 
    }
    
    public static void test(int...nums){
        //可变参数在方法内部,本质上是一个数组
        System.out.println(nums.length);
        System.out.println(Arrays.toString(nums));
        System.out.println("----------------");
    }
}

注意:

  • 一个形参列表中,只能有一个可变参数;否则会报错

  • 一个形参列表中如果多个参数,可变参数需要写在最后;否则会报错

3.2.3 Collections工具类

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

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

相关文章

系统配置与性能评价

系统配置与性能评价 考点概况性能指标性能评价方法阿姆达尔解决方案 考点概况 性能指标 标红的常考 了解性能指标对应哪一个的 性能指标是干嘛的 网络和路由器都有吞吐量&#xff0c;优先选择网络 d 数据处理速度&#xff1a;PDR c D A 根据选项去选择最合适的就行 B和D都是网…

把DTC从Excel导入cdd的方法

本文是基于CANdelaStudio12.0讲解 问题一&#xff1a;当导入DTC的xxx.cdi文件报如下红色错误 可能原因&#xff1a;在设置具有下拉框的属性的内容时&#xff0c;输入的内容不在下拉框列表中 解决办法:在.cddt文件中更新“”Error Code Table“”内容&#xff0c;把新的选项更新…

Matlab信号处理2:方波信号的合成与分解

周期信号可展开为傅里叶级数&#xff0c;因此方波信号可用若干谐波去拟合。以下是Matlab的实现&#xff1a; %% 方波信号的分解% 1.生成方波信号 % 方波信号周期、基波频率 T0 2; w0 (2 * pi) / T0; % 方波信号值为1的区间 T1 0.5; % 绘图周期&#xff1a;(2*n1)个周期 n …

SpringBoot项目--电脑商城【用户注册】

1.创建数据表 1.1 创建t_user表 CREATE TABLE t_user (uid INT AUTO_INCREMENT COMMENT 用户id,username VARCHAR(20) NOT NULL UNIQUE COMMENT 用户名,password CHAR(32) NOT NULL COMMENT 密码,salt CHAR(36) COMMENT 盐值,phone VARCHAR(20) COMMENT 电话号码,email VARCH…

S7-1500/ET200MP 使用 TIA STEP7 进行自由口通讯

1. 硬件列表 2. 组态和配置 1) 新建项目 2) 创建CPU1500站点 3) 组态CM PtP 串口 4) 设置协议自由口 3. 编写通信程序 1) 逻辑地址的填写 2) 调用发送接收功能块 3) 创建发送DB块和接收DB块 4. 设备连接 5. 通信测试 1) 设置串口调试调试软件SSCOM32 2)…

某米ax3000路由器组网解析

我们使用某米k60手机与某米ax3000 wifi6路由器组网&#xff0c;来分析和学习网络速率与瓶颈限制。 某米 AX3000 路由器简介 某米 AX3000 路由器是一款支持 WiFi 6 的双频路由器&#xff0c;它的 MIMO 是 22&#xff0c;也就是两根天线。MIMO 是 Multiple Input Multiple Outpu…

[hpsupport@privatemail.com].Elbie勒索病毒的最新威胁:如何恢复您的数据?

引言&#xff1a; 随着技术的不断发展&#xff0c;网络犯罪分子也在不断进化和改进他们的方法&#xff0c;其中之一就是恶名昭著的勒索病毒。最近&#xff0c;出现了一种新的威胁&#xff0c;名为 [ hpsupportprivatemail.com ].Elbie 勒索病毒。让我们一起深入探索这个威胁&am…

拥抱国产化,生态软件信创兼容适配之路

国产化是指技术引进项目投产后所生产的产品中&#xff0c;国内生产件的数量占整件产品生产件数量。换句话说&#xff0c;软件国产化的占比&#xff0c;直接影响到技术是否会在某一个时点上被”卡脖子“。 随着国家经济的发展和技术水平的提高&#xff0c;国家整体实力大大增强…

视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

深入synchronized

##深入synchronized 2.1 类锁、对象锁 synchronized的使用一般就是同步方法和同步代码块。 synchronized的锁是基于对象实现的。 如果使用同步方法 static&#xff1a;此时使用的是当前类.class作为锁&#xff08;类锁&#xff09; 非static&#xff1a;此时使用的是当前对…

【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入

目录 0x00 前言&#xff1a; 0x02 解决&#xff1a; 0x00 前言&#xff1a; 本篇博文可能会有一点点的超级呆 0x02 解决&#xff1a; 你是不是也会想&#xff1a; 使用pyrhon将指定文件夹位置里面的1.txt中数据全部删除以后---->然后再将参数req_text的值写入到1.txt …

【C++】反向迭代器精讲(以lIst为例)

目录 二&#xff0c;全部代码 三&#xff0c;设计思路 1. 讨论 2. 关于迭代器文档一个小细节 结语 一&#xff0c;前言 如果有小伙伴还未学习普通迭代器&#xff0c;请参考这篇文章中的普通迭代器实现。 【STL】list用法&试做_底层实现_花果山~~程序猿的博客-CSDN…

Android架构 架构和 CPU ABI - NDK

查看设备架构 adb -s emulator-5554 shell getprop ro.product.cpu.abi C:\Users\liyd>adb -s emulator-5554 shell getprop ro.product.cpu.abi x86_64C:\Users\liyd>adb -s 804c11f1 shell getprop ro.product.cpu.abi arm64-v8amumu模拟器12 C:\Users\liyd>adb …

MobaXterm 突破14个session限制

通常情况下&#xff1a;随着工作时间的增长&#xff0c;我们会保存许许多多的linux到本地的mobastream&#xff0c;然后当超过14个&#xff0c;就会被被限制&#xff0c;这个会让人很头疼。 1. 安装python&#xff0c;配置好环境变量 测试安装成功&#xff1a; 2. 基于项目进行…

uniapp点击事件在小程序中无法传参

这个问题很是神奇&#xff0c;第一次遇到。在h5中&#xff0c;点击事件可以正常传参&#xff0c;打包小程序后确失效了。 修改&#xff1a;for循环中的key&#xff0c;使用 index就好了

视频汇聚/视频云存储/视频监控管理平台EasyCVR启动时打印starting server:listen tcp,该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…

SpringBoot集成redis-Jedis

文章目录 1.相关概念2.环境搭建及测试 1.相关概念 Springboot学习笔记&#xff1a;https://blog.csdn.net/meini32/article/details/132544107 Redis快速入门&#xff1a;https://blog.csdn.net/meini32/article/details/132666283 2.环境搭建及测试 redis相关配置 Sprin…

车载域控制器DCU浪涌防护推荐TVS二极管

为了解决分布式EEA的这些问题&#xff0c;汽车工程师开始逐渐把很多功能相似、分离的ECU功能集成整合到一个比ECU性能更强的处理器硬件平台上&#xff0c;这就是汽车“域控制器&#xff08;Domain Controller Unit&#xff0c;DCU&#xff09;”。车载域控制器DCU大大优化整车的…

【Flink】关于jvm元空间溢出,mysql binlog冲突的问题解决

问题一&#xff1a;7张表是同一个mysql中的&#xff0c;我们进行增量同步时分别用不同的flink任务读取&#xff0c;造成mysql server-id冲突问题&#xff0c;如下&#xff1a; Caused by: io.debezium.DebeziumException: A slave with the same server_uuid/server_id as this…

LINUX内核启动流程-1

1、BIOS启动 硬件设置从OXFFFF0启动:CPU硬件设置加电即进入16位实模式状态运行,CPU硬件逻辑设计为加电瞬间强行将CS的值置为oxF000,IP的值置为0xFFF0,这样CS:IP就指向0xFFFF0这个地址位置。 BIOS程序的入口地址恰恰就是0xFFFF0 ! 也就是说,BIOS程序的第一条指令就设计在…