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

news2024/11/16 17:59:06

数组的定义和使用(下)

    • 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]里面存放的是null
    arr[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

补充

栈上放的是局部变量

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

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

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

相关文章

力扣-树节点

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

基于nvidia xavier智能车辆自动驾驶域控制器设计与实现-百度Apollo架构(二)

智能车辆操作系统 智能车辆操作系统是智能车辆系统的重要组成部分。现代汽车软件组件通常首 先由不同的供应商开发&#xff0c;然后在有限的资源下由制造商进行集成[42]。智能车辆操作 系统需要采用模块化和分层化设计思想来兼容传感器、分布式通信和自动驾驶通用 框架等模块&a…

适当的合同管理有什么积极影响?若管理不善有什么后果?

合同管理将决定合同是主要的风险因素还是业务增长的工具。事实是&#xff0c;如何处理合同会影响企业的底线。据研究显示&#xff0c;糟糕的合同管理使企业每年损失超过9%的收入。实施合同管理最佳实践将帮助企业提高合同签约效率。 什么是合同管理&#xff1f; 合同管理是对合…

玩转CodeQLpy之用友GRP-U8漏洞挖掘

0x01 前言CodeQLpy是作者使用python3实现的基于CodeQL的java代码审计工具&#xff0c;github地址https://github.com/webraybtl/CodeQLpy。通过CodeQLpy可以辅助代码审计人员快速定位代码中的问题&#xff0c;目前支持对SprintBoot的jar包&#xff0c;SpringMVC的war包&#xf…

初探git——版本控制工具git实用教程

文章目录前言基本配置基本操作1.初始化2.查看修改状态(status)3.添加工作区到暂存区4.提交暂存区到本地仓库5.查看提交日志6.版本回退7.添加文件至忽略列表分支1.基本命令2.分支冲突git远程仓库1.创建远程仓库2.配置公钥3.操作远程仓库idea配置git前言 Git是目前世界上最先进的…

九龙证券|业绩增长态势向好 沪市数字产业公司活力迸发

3月8日晚间&#xff0c;中国联通发表年报并举行成绩说明会&#xff0c;年报显现&#xff0c;公司2022年完成经营收入&#xff08;兼并报表&#xff09;3549.44亿元&#xff0c;同比增加8.30%&#xff1b;归属于母公司股东净利润72.99亿元&#xff0c;同比增加15.80%&#xff0c…

【计算机视觉】Zero-shot, One-shot和Few-shot的理解

机器学习任务按照对 样本量 的需求可以分为&#xff1a;传统监督式学习、Few-shot Learning、One-shot Learning、Zero-shot Learning。 文章目录一、传统监督式学习二、Zero-shot learning &#xff08;零样本学习&#xff0c;简称ZSL&#xff09;三、Few-shot learning3.1 什…

【SpringMVC】 一文掌握 》》》 @RequestMapping注解

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ RequestMapping注解一、SpringMVC环境准备1.相…

阿里云服务器使用教程:CentOS 7 安装JDK及Tomcat(以jdk1.8、tomcat9.0.37为例)

目录 1、下载JDK及Tomcat的安装包并上传至服务器 2、安装JDK 3、安装Tomcat 4、Tomcat启动后无法打开Tomcat首页的原因 1、下载JDK及Tomcat的安装包并上传至服务器 &#xff08;1&#xff09;下载JDK1.8版本压缩包 官网&#xff1a;Java Downloads | Oracle &#xff08…

C++回顾(十七)—— 类型转换

17.1 static_cast(expr) static_cast强制类型转换 用于基本类型间的转换&#xff0c;但不能用于基本类型指针之间的转换 用于有继承关系类对象之间的转换和类指针之间的转换 static_cast是在编译期间转换的&#xff0c;无法在运行时检测类型 所以类类型之间的转换有可能存在风…

002 第一季SpringBoot2核心技术-核心功能:

三、核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式。 1.1.2 yaml 1) 简介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一种标记语言&#xff09;的递归缩写。在开发的这种语言时…

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

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

给力|这是一个专业的开源快速开发框架!

在低代码开发市场&#xff0c;专业的开源快速开发框架可以助力企业提升办公协作效率&#xff0c;实现提质增效的办公自动化的发展目标。 流辰信息低代码技术开发平台服务商&#xff0c;拥有丰富的技术经验和案例合作经验&#xff0c;针对不同的客户需求&#xff0c;提供个性化、…

Docker-数据卷之Dockerfile

dockerfile相当于一个脚本通过该脚本可以生成一个自定义的镜像Dockerfile命令:注意&#xff1a;Dockerfile中的指令必须都是大写#基础镜像&#xff0c;一切从这儿开始构建 FROM #镜像是谁写的&#xff0c;姓名邮箱 MAINTAINER #镜像构建时候需要运行的命令 RUN #步骤&#xff1…

Nginx 文件名逻辑漏洞(CVE-2013-4547)

注意&#xff1a;仅用于技术讨论&#xff0c;切勿用于其他用途&#xff0c;一切后果与本人无关&#xff01;&#xff01;&#xff01; 个人博客地址&#xff1a;HJW个人博客 理论基础&#xff1a; 建议提前学习nginx的原理&#xff1a;Nginx服务漏洞详解 - 知乎 漏洞原理&a…

【项目实战】如何使用Postman调用WebSocket程序

一、背景说明 项目中需要使用WebSocket进行通信&#xff0c;开发完了WebSocket接口&#xff0c;总得测试吧&#xff0c;以下是Postman调用WebSocket程序的方法。 二、注意事项 2.1 为啥选Postman&#xff1f; 最近都在用ApiFox做接口调用&#xff0c;但是目前版本的ApiFox&…

新库上线 | CnOpenData注册会计师及事务所数据

注册会计师及事务所数据 一、数据简介 注册会计师是指取得注册会计师证书并在会计师事务所执业的人员&#xff0c;从事审计、咨询、税务等相关业务。事务所是指依法在中国境内设立&#xff0c;由中国公民组成&#xff0c;具有独立法人资格&#xff0c;接受投资者和其他利害关系…

Python之webmagic爬虫优点与使用

一、webmagic的优点它更偏向于java的语法&#xff0c;对于熟悉java的工程师来说学习成本较低提供多种选择器&#xff0c;如css选择器、xpath、正则等有一个模块pipeline&#xff1a;可通过简单地配置&#xff0c;可以将爬虫抽取到的信息&#xff0c;持久化到文件、数据库等。二…

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…

新品发布 | 单细胞转录组学

单细胞转录组学测序(Single cell RNA-seq)&#xff1a;是对单个细胞的转录组进行研究的一项技术&#xff0c;其原理是将分离的单个细胞中微量的mRNA通过扩增后再进行高通量测序&#xff0c;主要用于研究异质性细胞的独特表型和生物学功能&#xff0c;有助于发现新的稀有细胞类型…