当前位置: 首页 > news >正文

【JavaSE】数组的定义和使用(下)

数组的定义和使用(下)

    • 4. 数组练习
      • 4.1 模拟实现toString
      • 4.2 数组拷贝
      • 4.3 比较两个数组是否相同
      • 4.4 填充数组
      • 4.3 求数组中元素的平均值
      • 4.4 查找数组中指定元素(顺序查找)
      • 4.5 查找数组中指定元素(二分查找)
      • 4.6 数组排序(冒泡排序)
      • 4.7 数组逆序
    • 5. 二维数组

4. 数组练习

4.1 模拟实现toString

public static String my_toString(int[] arr) {String ret = "[";for (int i = 0; i < arr.length; i++) {if(i == arr.length - 1) {ret += arr[i] + "";break;}ret = ret + arr[i] + ", ";}ret += "]";return ret;
}public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(my_toString(arr));System.out.println(Arrays.toString(arr));
}
//---------------
//编译器运行结果为
//[1, 2, 3, 4, 5]
//[1, 2, 3, 4, 5]

或者

public static String my_toString(int[] arr) {String ret = "[";for (int i = 0; i < arr.length; i++) {ret = ret + arr[i] ;if(i != arr.length - 1) {ret += ", ";}}ret += "]";return ret;
}public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(my_toString(arr));System.out.println(Arrays.toString(arr));
}
//-------------
//编译器运行结果为
//[1, 2, 3, 4, 5]
//[1, 2, 3, 4, 5]

但是为了防止实参为空指针的情况,所以我们应该进行判定。

public static String my_toString(int[] arr) {//判定是否为空指针if(arr == null) {return "null";}String ret = "[";for (int i = 0; i < arr.length; i++) {ret = ret + arr[i] ;if(i != arr.length - 1) {ret += ", ";}}ret += "]";return ret;
}public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(my_toString(arr));System.out.println(Arrays.toString(arr));
}

4.2 数组拷贝

这种情况属于数组拷贝吗?

public static void main(String[] args) {int[] array = {1, 2, 3, 4};System.out.println(Arrays.toString(array));int[] array2 = array;System.out.println(Arrays.toString(array2));
}
//--------
//编译器运行结果为
//[1, 2, 3, 4]
//[1, 2, 3, 4]

不属于,因为这里的对象只有一个,只是把对象的地址拷贝了过来而已。

数组拷贝的结果应该出现两个对象。

代码示例

public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] copyArr = new int[arr.length];for (int i = 0; i < arr.length; i++) {copyArr[i] = arr[i];}System.out.println(Arrays.toString(copyArr));System.out.println(Arrays.toString(arr));
}
//-------------
//编译器运行结果为
//[1, 2, 3, 4, 5]
//[1, 2, 3, 4, 5]

在Java当中其实我们有对数组拷贝的方法一****Arrays.copyof

public static int[] copyOf(int[] original, int newLength)
返回值为拷贝好的数组的地址

代码示例

public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = Arrays.copyOf(arr,arr.length);System.out.println(Arrays.toString(ret));
}
//--------------
//编译器运行结果为
//[1, 2, 3, 4, 5]

也可以当作扩容来用

public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = Arrays.copyOf(arr,arr.length*2);System.out.println(Arrays.toString(ret));
}
//-----------
//编译器运行结果为
//[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

补充

image-20221116203004562

copyof方法中用到了arraycopy方法二

下面是arraycopy的使用示例。

public static void main(String[] args) {int[] array = {1,2,3,4};int[] copy = new int[array.length];System.arraycopy(array,0,copy,0,array.length);//拷贝那个数组,从(源)数组的哪个位置开始复制,拷贝到哪个数组,从(目标)数组的哪个位置开始粘贴,拷贝多长 
}

还有拷贝的方法三是**Arrays.copyOfRange**

public static void main(String[] args) {int[] arr = {1,2,3,4};int[] ret = Arrays.copyOfRange(arr,1,3);System.out.println(Arrays.toString(ret));
}
--------------
编译器运行结果为
[2, 3]

原因:

image-20221116205403226

在Java当中像这种from...to...的情况下范围是左闭右开的。

方法四

代码示例

public static void main(String[] args) {int[] arr = {1,2,3,4};int[] arr2 = arr.clone();System.out.println(Arrays.toString(arr2));
}
//---------
//编译器运行结果为
//[1, 2, 3, 4]

clone克隆的意思就是产生一个副本(深拷贝)

深拷贝与浅拷贝

image-20221116213045567

4.3 比较两个数组是否相同

用到的方法是Arrays.equals()

public static boolean equals(int[] a,int[] a2)

如果两个数组相同,则返回true,否则返回false

代码示例

public static void main(String[] args) {int[] arr1 = {1,2,3,4};int[] arr2 = {1,2,3,4};System.out.println(arr1 == arr2);System.out.println(Arrays.equals(arr1,arr2));
}
//----------
//编译器运行结果为
//false
//true

如果仅仅是简单的比较是否相等,那么比较的两个数组的地址。

4.4 填充数组

Arrays.fill

public static void fill(int[] a,int val)
//a是填充的数组,val是存储在数组的所有元素中的值

代码示例

public static void main(String[] args) {int[] arr = new int[10];Arrays.fill(arr,-1);System.out.println(Arrays.toString(arr));
}
//-----------
//编译器运行结果为
//[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]

也可以指定范围进行填充

public static void fill(int[] a,int fromIndex,int toIndex,int val)
//a填充的数组,fromIndex起始位置,toIndex终止位置,val填充的数字。
但是是左闭右开的。

代码示例

public static void main(String[] args) {int[] arr = new int[10];Arrays.fill(arr,2,3,-1);System.out.println(Arrays.toString(arr));
}
------------
编译器运行结果为
[0, 0, -1, 0, 0, 0, 0, 0, 0, 0]

补充

在Java当中我们在Arrays中经常用到的有

sort()
toString()
fill()
copyOf()

4.3 求数组中元素的平均值

代码示例

public static void main(String[] args) {int[] arr = {1,2,3,4,5,6};System.out.println(avg(arr));
}
public static double avg(int[] arr) {int sum = 0;for (int x : arr) {sum += x;}return (double)sum / (double)arr.length; }
// 执行结果
3.5

注意的是求平均值的时候要进行强制类型转换。

4.4 查找数组中指定元素(顺序查找)

public static int findElement(int[] arr,int val) {for (int i = 0; i < arr.length; i++) {if(arr[i] == val) {return i;}}return -1;
}
public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(findElement(arr, 4));
}
//------------
//编译器运行结果为
//3

4.5 查找数组中指定元素(二分查找)

4.6 数组排序(冒泡排序)

4.7 数组逆序

public static int[] reverseArray(int[] arr) {int left = 0;int right = arr.length - 1;while (left <= right) {int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}return arr;
}
public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(Arrays.toString(reverseArray(arr)));
}
//-----------
//编译器运行结果为
//[5, 4, 3, 2, 1]

5. 二维数组

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。

创建二维数组

方式一

int[][] arr = {{1,2,3},{4,5,6}};

方式二

int[][] arry = new int[][]{{1,2,3},{4,5,6}};

方式三

int[][]arr = new int[2][3];

遍历二维数组方法一

public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {System.out.print(arr[i][j] + " ");}System.out.println();}
}
//-------------
//编译器运行结果为
//1 2 3 
//4 5 6 

补充

二维数组就是特殊的一维数组

image-20221117180443408

public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};System.out.println(Arrays.toString(arr[0]));System.out.println(Arrays.toString(arr[1]));
}
//--------------
//编译器运行结果为
//[1, 2, 3]
//[4, 5, 6]

求数组的行数和列数

public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};System.out.println(arr.length);System.out.println(arr[0].length);
}
//--------------
//编译器运行结果为
//2
//3

所以我们的数组遍历方法二就可以写成

public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println();}
}
//---------
//编译器运行结果为
//1 2 3 
//4 5 6 

数组遍历方法三

for-each

public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};for (int[] x:arr) {for (int y:x) {System.out.print(y + " ");}}
}
//-------------
//编译器运行结果为
//1 2 3 4 5 6 

数组遍历方法四

public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};System.out.println(Arrays.deepToString(arr));
}
//-------------
//编译器运行结果为
//[[1, 2, 3], [4, 5, 6]]

不规则数组

public static void main(String[] args) {int[][] arr = new int[2][];//在Java当中,行不可以省略,列可以省略//如果不进行指定行初始化的话,那么arr[0],arr[1]里面存放的是nullarr[0] = new int[2];arr[1] = new int[4];System.out.println(Arrays.deepToString(arr));
}
//------------
//编译器运行结果为
//[[0, 0], [0, 0, 0, 0]]

当然这种不规则数组一定要进行赋值,否则会报空指针异常。

因为

public static void main(String[] args) {int[][] arr = new int[2][];System.out.println(arr[0]);System.out.println(arr[1]);
}
//------------
//运行结果为
//null
//null

补充

栈上放的是局部变量

引用一定在栈上吗?不是的,在不在栈上和引用没有关系,只看是不是局部变量。

相关文章:

【JavaSE】数组的定义和使用(下)

数组的定义和使用&#xff08;下&#xff09;4. 数组练习4.1 模拟实现toString4.2 数组拷贝4.3 比较两个数组是否相同4.4 填充数组4.3 求数组中元素的平均值4.4 查找数组中指定元素&#xff08;顺序查找&#xff09;4.5 查找数组中指定元素&#xff08;二分查找&#xff09;4.6…...

Oracle 实现对全局错误语句的审计监控 ORA- alert

--将所有数据库ora-错误写入表create table error_tab (username varchar2(4000), d_current_nr_error varchar2(4000), ora_server_error_msg varchar2(4000), full_text varchar2(4000),errdate date);create or replace trigger error_triggerafter servererror on database…...

React解决样式冲突问题的方法

React解决样式冲突问题的方法 前言&#xff1a; 1、React最终编译打包后都在一个html页面中&#xff0c;如果在两个组件中取一样类名分别引用在自身&#xff0c;那么后者会覆盖前者。 2、默认情况下&#xff0c;只要导入了组件&#xff0c;不管组件有没有显示在页面中&#x…...

Go项目(用户操作微服务)

简介 用户留言、收藏、修改收货地址等&#xff0c;统一放在用户操作微服务这里按照业务类型划分微服务表设计&#xff0c;三张表// 用户收藏 type UserFav struct {BaseModel// 联合索引 idx_user_goods&#xff0c;且唯一User int32 gorm:"type:int;index:idx_user_goo…...

Spring Boot统一功能处理

目录 一、统一用户登录权限验证 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置 1.3 统一访问前缀 二、统一异常处理 三、统一数据格式返回 一、统一用户登录权限验证 1.1 自定义拦截器 拦截器是一个普通的类&#xff0c;需要实现HandlerInterceptor接口并重写pre…...

ETCD多次出现CONTEXT DEADLINE EXCEEDED

roothqa-master-01:~# etcdctl --endpoints$ETCD_ENDPOINTS member list --write-outtable {“level”:“warn”,“ts”:“2020-03-23T14:19:45.0330800”,“caller”:“clientv3/retry_interceptor.go:61”,“msg”:“retrying of unary invoker failed”,“target”:“endpoi…...

git 提交 多人开发避免冲突

代码正常提交 git add . git commit -m ‘备注信息’ git status 查看本地提交状态 git pull 拉取代码 git push origin master 指定远程仓库名和分支名 ‘’ 如果多人开发 A和B 提交避免冲突 B拉取代码修改内容直接提交后 A也修改了内容在git add / git commit / git pull / g…...

求职复盘:干了四年外包出来,面试5次全挂

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…...

AXI总线核心解读---基于官方文档

AXI总线 何处使用AXI ZYNQ异构芯片&#xff0c;内部总线使用的AXI总线纯FPGA的IP接口也要用高速接口&#xff0c;DDR&#xff08;AXI、传统&#xff09;等模块都有涉及到 什么是AXI总线 AXI的三种形式: AXI-FULL&#xff1a;高性能的存储器映射需求—可以256个以内发送 存储器…...

【Linux修炼】15.进程间通信

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 进程间通信进程间通信一.理解进程间通信1.1 什么是通信1.2 为什么要有通信1.3 如何进行进程间通信二.管道2.1 匿名管道2.2 匿名管道编码部分2.3 管道的特点2.4 如何理解命令行中的管道2.5 进程控制多个子进程三.命名管道3.…...

每天一道大厂SQL题【Day15】微众银行真题实战(五)

每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…...

如何优化查询大数据量的表

给你100万条数据的一张表&#xff0c;你将如何查询优化&#xff1f;1.两种查询引擎查询速度&#xff08;myIsam 引擎 &#xff09;InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多…...

卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对测试工具的使用感到困扰&#xff1f;前言性能测试是一个全栈工程师/架构师必会的技能之一&#xff0c;只有学会性能测试&#xff0c;才能根据得到的测试报告进行分析&#xff0c;找到系统性…...

力扣-树节点

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目&#xff1a;608. 树节点二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …...

MySQL8启动错误“Neither found #innodb_redo subdirectory, nor ib_logfile* files”

今天做MySQL备份文件回复测试,用来检验MySQL备份文件可用性。 MySQL版本8.0.32 备份文件为腾讯云MySQL实例,版本8.0 使用xtrabackup恢复备份。执行过程顺利,启动MySQL时发生错误。提示如下: 注意,这里使用了systemctl stop mysql。虽然启动失败了,但是如果不执行这条…...

JVM系列——详细说明Volatile,原子性/可见性,先行发生原则

上篇我们讨论了JMM中的工作内存和主内存、内存直接的交互指令&#xff0c;以及指令之间的顺序规则。 本篇将会以上篇为基础&#xff0c;详细介绍并发编程中的三个重要概念/工具&#xff1a;Volatile、原子性/可见性和先行发生&#xff08;happens-before)原则。 volatile型变量…...

ArcGIS:栅格计算器的运算符和函数详解

01 栅格计算器在哪&#xff1f;02 运算符说明栅格计算器的表达式书写与Python语法一致&#xff08;由于其为解释型语言并且语言简洁优美&#xff0c;因此简单上手&#xff09;&#xff0c;这里主要简单说明各个运算符即可使用栅格计算器构建地图代数表达式以输出要求的栅格图像…...

spring的beanfactory与applicationContext的区别以及继承关系

applicationContext继承关系 首先可以看一张图 ListableBeanFactory 可列举的bean工厂 hierarchical 分层bean工厂 messageSource 国际化信息 //国际化&#xff08;internationalization&#xff09;是设计和…...

分享一个 hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题

最近在针对某系统进行性能优化时&#xff0c;发现了一个hive on spark 模式下使用 HikariCP 数据库连接池造成的资源泄露问题&#xff0c;该问题具有普适性&#xff0c;故特地拿出来跟大家分享下。 1 问题描述 在微服务中&#xff0c;我们普遍会使用各种数据库连接池技术以加快…...

MySQL 行锁

行锁 : 对表中行记录的锁 MySQL 的行锁 : 由各个引擎自己实现MyISAM 不支持行锁InnoDB 支持行锁 两阶段锁协议 : 行锁是在需要时才加上&#xff0c;要等到事务结束才释放 例子 : id 是表 t 的主键的 B 的 update 会阻塞&#xff0c;直到 A 执行 commit 后&#xff0c;B 才能…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...