JavaSE--全盘拿下数组的关键要领

嗨嗨大家~我来啦!今天我们来进入数组的学习吧。

目录

一 数组的定义

1 创建数组

2 初始化数组 

二 数组的使用 

1 数组的访问

2 数组的遍历 

2.1 for 循环打印

2.2 for-each 打印数组 

三 数组是引用类型

3.1 JVM内存分布

3.2  区分基本类型与引用类型变量

3.3 认识null

四 实际应用数组

4.1 数组作为函数参数

4.2 修改数组内容 

1 直接传变量

2 传的是数组 

3 传数组返回的也是数组 

五 数组方法的使用

 5.1 toString

5.2 copyOf

六 查找数组中的元素 

6.1 顺序查找

6.2 二分查找 binarySearch

 七 数组排序

 7.1 冒泡排序

7.2 sort 排序方法 

八 数组逆置 

九 二维数组的定义 

十 二维数组的打印 


一 数组的定义

1 创建数组

T[] 数组名 = new T[N];  
T :表示数组中存放元素的类型
T[ ] :表示数组的类型
N :表示数组的长度

 代码示例:

int[] arr1 = new int[]{1, 2, 3}; // int[ ]为数组的类型 
int[] arr2 = {1, 2, 3}; 
int[] arr3 = new int[10]; // 创建一个可以容纳10个int类型元素的数组 

2 初始化数组 

数组的初始化主要分为动态初始化静态初始化

  • 动态初始化:在创建数组时,只定义数组中元素的个数,未给里面的元素进行赋值

例如:

int[] arr = new int[10];
  • 静态初始化:在创建数组时,不定义数据元素个数,而直接将数组里的数据内容进行赋值,编译器会自己判定数组有几个元素,后面的数据必须与前面定义的数据类型一致

例如:

int[] arr = new int[]{1,2,3};

注意:静态初始化可以简写,省去后面的new int[ ],代码示例如下:

//当前代码虽然省去了new arr[],但是编译器编译代码时还是会还原
int[]arr={0,1,2,3,4,5,6,7,8,9};

静态和动态初始化也可以分为两步,但分步的第二步中new int[ ] 不能省略,代码示例如下:

//动态初始化
int[]arr1;
arr1=new int[10];//静态初始化
int[]arr2;
arr2=new int[]{1,2,3};
如果数组中存储元素类型为 基类 引用 类型,默认值为基类类型对应的默认值,比如:
类型默认值
byte0
short0
int0
long0
float0.0f
double0.0
char/u0000
booleanfalse
引用null

二 数组的使用 

1 数组的访问

   数组在内存中是一段连续的空间,空间的编号都是从 0 开始的,依次递增,该编号称为数组的下标,数组可以通过 下标访问其任意位置的元素,如:

public class Test{public static void main(String[] args){int[] arr = {1,2,3};System.out.println(arr[2]);}
}

注意:数组的下标是从0开始的,所以数组用下标访问最大限度是 数组长度-1.

一旦超过访问的最大限度,实行结果便会报异常,如下示例:

public class Test {public static void main(String[] args) {int[] arr={1,2,3};System.out.println(arr[3]);}
}

2 数组的遍历 

   "遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作 ,下面我们来进行数组的打印。

2.1 for 循环打印

public class Test{public static void main(String[] args) {int[] arr={1,2,3};for (int i=0;i<arr.length;i++){System.out.println(arr[i]+"");}}
}

注意:在数组中可以通过数组对象.length来获取数组的长度 

2.2 for-each 打印数组 

语法形式:

for(元素类型t 元素变量x:遍历对象obj){引用了x的java语句;
}

代码示例: 

public class Test{public static void main(String[] args) {int[] arr={1,2,3};for (int x:arr){System.out.println(x);}}
}

注意:for-each for 循环的另外一种使用方式, 能够更方便的完成对数组的遍历,可以避免循环条件和更新语句写错

三 数组是引用类型

3.1 JVM内存分布

我们要知道数组在内存里面的情况,就要了解Java内存分布情况,这里做必要的介绍。Java经过编译后产生的.class文件被加载到JVM虚拟机里面的本地方法栈里面运行。为了高效管理内存,JVM对内存进行了划分(JVM是一个软件,由C/C++编写的软件。这是因为系统之类的由C/C++代码编写比较高效)。

  1. 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据, 方法编译出的的字节码就是保存在这个区域;
  2. 虚拟机栈:与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表操作数栈动态链接返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了
  3. 本地方法栈:本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的
  4. 堆:JVM所管理的最大内存区域. 使用new 创建的对象都是在堆上保存 (如前面的new int[ ] {1,2,3}) 
  5. 程序计数器:只是一个很小的空间, 保存下一条执行的指令的地址。

注意:在这里我们只简单关心堆和虚拟机栈这两块空间

3.2  区分基本类型与引用类型变量

public class Test{public static void func() {int a=8;  //基本数据类型int b=88; //基本数据类型int[] arr=new int[]{1,2,3}; //引用数据类型}
}
  • 基本数据类型,就是直接创建的变量,在变量空间里存放所赋的值。在此代码实例中a、b是基本数据类型, 其对应的栈帧空间里赋值为8和88;
  • 引用数据类型创建的变量,一般称为对象的引用,它在空间中存储的对象是所在空间的地址。在此代码实例中arr数组是引用类型,其内部保存的是数组在堆空间中的首地址 

下面来看一个代码,分析它的输出情况

 
public static void func(String[] args) {int[] arr1 = new int[3];arr1[0] = 10;arr1[1] = 20;arr1[2] = 30;int[] arr2 = new int[]{1,2,3,4,5};arr2[0] = 100;arr2[1] = 200; arr1 = arr2; //此时arr1指向了arr2所指向的空间,两者指向同一个空间arr1[2] = 300;arr1[3] = 400; arr2[4] = 500; //无论修改arr1或是arr2的值,都是修改同一个空间for (int i = 0; i < arr2.length; i++) {System.out.println(arr2[i]);}
}

 为了更好的方便大家理解,我们来画图分析:

3.3 认识null

null Java 中表示 " 空引用 " , 也就是一个不指向对象的引用。它表示一个无效的内存位置,所以不能对这个内存进行任何读写的操作,不然会报错 。
public class Test{public static void main(String[] args) {int[] arr=null;System.out.println(arr[0]);}
}

null 的作用类似于 C 语言中的 NULL ( 空指针 ), 都是表示一个无效的内存位置。 因此不能对这个内存进行任何读写操作。 一旦尝试读写 , 就会抛出 NullPointerException.

注意: Java 中并没有约定 null 0 号地址的内存有任何关联. 

四 实际应用数组

4.1 数组作为函数参数

数组array作为函数的参数,传递给print。

public class Test {public static void print(int[] array){for (int i = 0; i < array.length; i++) {System.out.print(array[i]+" ");}}public static void main(String[] args) {int[] array = {1,2,3,4,5,6};print(array);}
}

4.2 修改数组内容 

1 直接传变量

public class Test {public static void func(int x){x = 10;System.out.println("x:"+x);}public static void main(String[] args) {int num = 0;func(num);System.out.println("num:"+num);}
}

运行结果:

在此代码中,num的值没有被修改为10,因为方法传参的时候传的是形参形参相当于是实参的一份临时拷贝,形参的修改不会影响到实参(相当于调用方法时创建的栈帧里有一个变量的值为0,然后被修改为10,方法调用结束,创建的栈帧销毁,并无影响

2 传的是数组 

import java.util.Arrays;public class Test {public static void func(int[] array){array[0] = 10;}public static void main(String[] args) {int[] array = {1,2,3};func(array);System.out.println(Arrays.toString(array));}
}

运行结果:

3 传数组返回的也是数组 

import java.util.Arrays;public class Test {public static int[] func(int[] array){array[0] = 10;array[2] = 30;return array;}public static void main(String[] args) {int[] array = {1,2,3};func(array);System.out.println(Arrays.toString(array));}
}

运行结果: 

五 数组方法的使用

 5.1 toString

toString方法的作用是将数组的数据变成字符串类型数据。

import java.util.Arrays;public class Test {public static void main(String[] args) {int[] array = {1,2,3,4,5}; //定义一个数组String arrays = Arrays.toString(array); //用字符串类型接受方法的返回值System.out.println(arrays);}
}

运行结果:

  • 模拟实现toString
public class Test {public static String toString(int[] array){ //返回类型为字符串类型String array1 = "["; //定义一个字符串类型数据for (int i = 0; i < array.length; i++) {array1+=array[i];if(i!= array.length-1){array1+=",";}}array1+="]";return array1;}public static void main(String[] args) {int[] array = {1,2,3,4,5}; //定义一个数组String arrays = toString(array); //用字符串类型接收方法的返回值System.out.println(arrays);}
}

运行结果:

5.2 copyOf

基本用法:

public static int[] copyOf(int [] original,int newLength)
//第一个参数original:要复制的数组
//第二个参数newLength:要返回的副本长度
import java.util.Arrays;public class Test {public static void main(String[] args) {int[] array = {1,2,3,4,5};int[] newArray = new int[array.length]; //新数组newArray = Arrays.copyOf(array,array.length);System.out.println(Arrays.toString(newArray));}
}

运行结果:

  • 模拟实现copyOf
import java.util.Arrays;public class Test {public static int[] copyOf(int[] array,int length){int[] newArray = new int[array.length];for (int i = 0; i < array.length; i++) { //循环赋值newArray[i] = array[i];}return newArray;}public static void main(String[] args) {int[] array = {1,2,3,4,5};int[] newArray = copyOf(array, array.length);newArray[2] = 30; //将拷贝好的数组的第3个元素赋值为30,观察该改变是否对原数组是否有影响System.out.println("array:"+Arrays.toString(array));System.out.println("newArray:"+Arrays.toString(newArray));}
}

运行结果:

六 查找数组中的元素 

6.1 顺序查找

public class Test {public static int find(int[] array,int k){for (int i = 0; i < array.length; i++) {if(k == array[i]){return i;//找到了就返回下标}}return -1;//找不到返回-1}public static void main(String[] args) {int[] array = {1,2,3,0,7,8,9,4,5,6};int ret = find(array,4);System.out.println(ret);}
}

运行结果: 

6.2 二分查找 binarySearch

注意:二分查找必须是有序数组。

import java.util.Arrays;public class Test {public static void main(String[] args) {int[] array = {1,2,3,4,5,6,7,8,9,10};int ret = Arrays.binarySearch(array,4);System.out.println(ret);}
}

运行结果:

  • 模拟实现 binarySearch

 基本用法:

public static int binarySearch(int[] a,int key)
//a:要搜索的数组
//key:要搜索的值
public class Test {public static int binarySearch(int[] array,int k){int left = 0;int right = array.length-1;while(left<=right){int mid = (left+right)/2;if(array[mid]>k){ //查找范围左移right = mid-1;}else if(array[mid]<k){ //查找范围右移left = mid+1;}else{return mid;}}return -1;}public static void main(String[] args) {int[] array = {1,2,3,4,5,6,7,8,9,10};int ret = binarySearch(array,4);System.out.println(ret);}
}

运行结果:

 七 数组排序

 7.1 冒泡排序

 import java.util.Arrays;public class Test {public static void bubbleSort(int[] array){for (int i = 0; i < array.length-1; i++) {boolean flag = true;for (int j = 0; j < array.length-1-i; j++) {if(array[j]>array[j+1]){int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = false;}}if(flag == true){//已经有序break;}}}public static void main(String[] args) {int[] array = {1,2,3,6,5,0,4,8,7,9};bubbleSort(array);System.out.println(Arrays.toString(array));}
}

运行结果:

7.2 sort 排序方法 

import java.util.Arrays;public class Test {public static void main(String[] args) {int[] array = {1,2,3,6,5,0,4,8,7,9};Arrays.sort(array);System.out.println(Arrays.toString(array));}
}

运行结果:

八 数组逆置 

import java.util.Arrays;public class Test {public static void reverse(int[] array){int head = 0;int tail = array.length-1;while(head<tail){int tmp = array[head];array[head] = array[tail];array[tail] = tmp;head++;//后移tail--;//前移}}public static void main(String[] args) {int[] array = {1,2,3,4,5,6};reverse(array);System.out.println(Arrays.toString(array));}
}

运行结果:

九 二维数组的定义 

二维数组的三种定义方式:

public class Test {public static void main(String[] args) {int[][] array1 = {{1,2,3},{4,5,6}};int[][] array2 = new int[2][3];int[][] array3 = new int[][]{{1,2,3},{4,5,6}};}
}

十 二维数组的打印 

 注意:Arrays包里面的toString方法是将数组中的元素转换为字符串,用2个toString方法来打印二维数组时,第一个toString已经将数组转换为字符串,第二个toString是不能接收字符串的,所以不能用toString来打印二维数组,用deepToString来打印。

import java.util.Arrays;public class Test {public static void main(String[] args) {int[][] array = {{1,2,3},{4,5,6}};System.out.println(Arrays.deepToString(array));}
}

 运行结果:

 注意

  • 在Java中可以省略列不能省略行;
  • 在C语言中可以省略行不能省略列。

 以上就是今天要分享的全部内容啦,内容比较多,大家学完记得及时复习哈~那我们下期再见啦!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Taro 中 echarts 图表使用

1 下载 echarts4taro3 yarn add echarts4taro3 或 pnpm add echarts4taro3 或 npm i echarts4taro3 --save2 图表初始化需要先加载echarts模块 import * as echarts from "echarts4taro3/lib/assets/echarts"; // 这里用了内置的&#xff0c;也可以用自定义的 echa…

TCP与UDP协议(三次握手四次挥手)

TCP与UDP 简介TCP和UDP一、TCP1.1 TCP的三次握手问题来了&#xff1a;为啥是三次握手而不是两次呢&#xff1f; 1.2建立连接后的通信过程&#xff08;丢包与乱序问题&#xff09;1.3四次挥手问题来了&#xff1a;为什么要四次挥手&#xff1f; 二、UDP 简介TCP和UDP TCP、UDP都…

SQL第16课——更新和删除数据

介绍如何利用update和delete语句进一步操作表数据。 16.1 更新数据 使用update语句。两种使用方式&#xff1a; 1. 更新表中的特定行&#xff1b; 2. 更新表中的所有行。 &#xff01;&#xff01;&#xff01;&#xff08;使用update时不要省略where子句&#xff0c;因为…

链接伪类(:hover)CSS背景图片有闪动BUG的解决方法 vue3

现象&#xff1a; hover时候&#xff0c;图片还没加载出来&#xff0c;导致边框闪烁 在Vue 3中&#xff0c;如果你遇到了使用伪类(:hover)时背景图片出现闪烁的问题&#xff0c;可能是由于浏览器的渲染机制导致的。解决这个问题的方法可能包括&#xff1a; 使用background-pos…

spark:数据的关联与合并、缓存和checkpoint

文章目录 1. 数据的关联与合并1.1 join关联1.1.1 内关联1.1.2 左关联1.1.3 右关联 1.2 Union合并 2. 缓存和checkpoint 1. 数据的关联与合并 1.1 join关联 students表数据&#xff1a; 1.1.1 内关联 内关联只返回两个 DataFrame 中在连接键上匹配的行。 # join 关联 from…

【Linux】【Jenkins】后端项目打包教程-Linux版

本次安装版本&#xff1a;2.4 1、安装git环境2、安装mavne环境2.1 下载依赖2.2、解压、赋权2.2、配置环境变量2.3、验证安装 3、jenkins-插件下载3.1、进入jenkins-->系统管理3.2、进入系统管理-->插件管理3.3、下载两个插件&#xff08;如果之前下载了&#xff0c;这里是…

Docker 的使用-01

一、Docker 设置和镜像源 1.1、设置 #查看 Docker 信息 docker version docker info#守护线程启动&#xff1a; systemctl daemon-reload 重启Docker服务&#xff1a; systemctl restart docker#关闭Docker服务 sudo systemctl stop docker#启动Docker服务 systemctl start d…

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…

低成本轻量化5G网络部署redcap技术

RedCap&#xff08;Reduced Capability&#xff09;轻量化5G路由器旨在提供低功耗、成本效益高、性能较5G完整版稍微降低的解决方案。用于满足工业物联网&#xff08;IoT&#xff09;、消费电子产品和轻量级5G设备的需求。通过对5G技术进行一定程度的“功能裁剪”&#xff0c;降…

【华为】配置RIP协议

RIP&#xff08;Routing Information Protocol&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于小型网络中的动态路由。RIP有两个主要版本&#xff1a;‌RIPv1和‌RIPv2&#xff0c;它们之间存在一些关键区别&#xff1a; ‌分类支持‌&#xf…

医疗图像之基于UNet3+(UNet+++)的X射线图像牙齿分割

第一步&#xff1a;准备数据 X射线图像牙齿分割&#xff0c;总共有2000张 第二步&#xff1a;搭建模型 UNet3主要是参考了UNet和UNet两个网络结构。尽管UNet采用了嵌套和密集跳过连接的网络结构&#xff08;见图1(b)红色三角区域&#xff09;&#xff0c;但是它没有直接从多尺…

探索机器学习中的特征选择技术

在机器学习和数据科学领域&#xff0c;特征选择是一个关键步骤&#xff0c;它不仅有助于提高模型的性能&#xff0c;还能帮助我们更好地理解数据。本文将深入探讨特征选择的重要性、常见方法以及如何在实际项目中应用这些技术。 一、特征选择的重要性 降低维度&#xff1a;减…

二叉查找树(Binary Search Tree)Java语言实现

一、二叉查找树 二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;也称为二叉搜索树、有序二叉树&#xff08;Ordered Binary Tree&#xff09;或排序二叉树&#xff08;Sorted Binary Tree&#xff09;。 是指一棵空树或者具有下列性质的二叉树&#xff1a…

Android 无Bug版 多语言设计方案!

出海业务为什么要做多语言&#xff1f; 1.市场扩大与本地化需求&#xff1a; 通过支持多种语言&#xff0c;出海项目可以触及更广泛的国际用户群体&#xff0c;进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一&#xff0c;而语言本地化是其中的核心。使用用户的母语…

NFT Insider #151:The Sandbox 推出 Alpha 第4季;腾讯或将收购育碧

市场数据 加密艺术及收藏品新闻 Beeple 将于 11 月在南京德基美术馆举办个人首展 著名数字艺术家 Beeple 近日在X平台发布视频&#xff0c;宣布将于 2024 年 11 月 14 日在南京德基美术馆举办个人首次展览&#xff0c;名为《Beeple&#xff1a;来自合成未来的故事》。该展览将…

【计算机网络】详谈TCP协议确认应答机制捎带应答机制超时重传机制连接管理机制流量管理机制滑动窗口拥塞控制延迟应答

一、TCP 协议段格式 1.1、4位首部长度 4位首部长度的基本单位是4字节&#xff0c;也就是说如果4位首部长度填6&#xff0c;那报头长度就是24字节。报头长度的取值范围为[0,60]字节&#xff0c;也就是说选项的最大长度为40字节。 二、确认应答机制 发送数据和发送应答&#x…

vue3 在store的index.js

导入vuex&#xff0c;在store的index.js创建store对象 在main.js挂载store import store from ./storenew Vue ({/* 将store对象实例挂载到vue实例中 所有组件就可以直接从store中获取全局数据了*/ store, render: h > h(App) }).$mount(#app) 在store中的index.js进行声明…

Chainbase :链原生的 Web3 AI 基建设施

“随着 Chainbase 在生态系统和市场方面的进一步拓展&#xff0c;其作为链原生 Web3 AI 基建设施的价值将愈发显著。” 算法、算力和数据是 AI 技术的三大核心要素。实际上&#xff0c;几乎所有的 AI 大模型都在不断革新算法&#xff0c;以确保模型能够跟上行业的发展趋势&…

react实现实时计时的最简方式

js中时间的处理&#xff0c;不借助于moment/dayjs这样的工具库&#xff0c;原生获取格式化的时间&#xff0c;最简单的实现方式可以参考下面这样。 实现效果 代码实现 封装hooks import { useState, useEffect } from "react";export function useCountTime() {c…

手动nginx平滑升级

一、下载nginx安装包 wget http://nginx.org/download/nginx-1.24.0.tar.gz 二、解压缩 tar -zxf nginx-1.24.0.tar.gz 三、进入解压缩后文件 3.1 cd /usr/local/nginx/sbin 预编译 进入如下命令 ./configure -prefix/usr/local/nginx --with-http_ssl_module --with…