Java——数组

本文详细讲解了Java中数组的创建、动态与静态初始化,包括不同类型数组的处理,以及数组的遍历、作为函数返回值、参数和拷贝,还介绍了多维数组的使用。重点讲解了数组作为引用类型的特点,以及如何正确操作和理解数组在内存中的行为。
摘要由CSDN通过智能技术生成

本文简要介绍Java中数组的创建以及初始化,以及数组的一些使用。

一、数组概述


数组对于每一门编程语言都是一个重要的存在,Java中提供的数组是用来存储固定大小的同类型元素的。
特点:

  • 所有元素类型相同。
  • 数组内存储元素的空间是连续的。
  • 每个数组内的元素都有自己的编号。

1、数组的创建

语法格式:类型[] 数组名= new 类型[元素个数]
示例:

int[] arr1 = new int[5]; // 创建一个可以容纳5个int类型元素的数组
double[] arr2 = new double[10]; // 创建一个可以容纳10个double类型元素的数组
String[] arr3 = new double[15]; // 创建一个可以容纳15个字符串元素的数组

2、数组的初始化

数组的初始化方法包括动态初始化和静态初始化。

2.1 动态初始化

创建数组时,直接给出数组中元素的个数。
例如:int[] arr = new int[5];

2.2 静态初始化

创建数组时不直接给出元素的个数,而是给出数组内的具体内容。编译器会根据元素个数来确定数组的长度
例如:

int[] arr1 = new int[]{1,2,3,4,5};
double[] arr2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] arr3 = new String[]{"Hello", "World", "!"};

// 简写
int[] arr4 = {1,2,3,4,5};

// 也可以分成两条语句书写
int[] arr5;
arr5 = new int[10];
int[] arr6;
arr6 = new int[]{1,2,3,4,5};

注:

  • 初始化时的数组中的元素为基类类型,默认值则为基类类型的默认值。如:int[] arr = new int[5]的默认值为0;
  • 如果存储的为引用类型则为null
基本类型默认值
byte0
short0
int0
long0L
float0.0f
double0.0
char‘\u0000’
booleanfasle
引用类型null

3、数组类型为引用类型

内存是一段连续的存储空间,为了更好的使用内存,JVM对所使用的内存按照功能进行了不同的划分:
在这里插入图片描述

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

3.1 基本类型和引用类型的区别

  • 基本类型创建的变量为基本变量,该变量存放的是其所对应的值
  • 引用类型创建的变量,一般称为对象的引用,其所存放的是对象所在空间的地址

示例:

public static void myArray() {
	int a = 10;
	int b = 20;
	int[] arr = new int[]{1,2,3,4,5};
}

a,b,arr都是方法内部的变量,因此空间都在myArray方法对应的栈帧中分配。
在这里插入图片描述

数组是通过地址操作对象的。

二、数组的使用


想要访问数组的内的元素,通过下标来进行访问,每一个下标对应一个元素,数组的第一个位置下标为0。数组的元素存放在连续的空间内,因此支持随机访问,通过下标随机访问数组中任意元素。

int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
// 使用数组时一定注意不要越界访问,数组下标为[0,N),不包括N。

1、数组的遍历

int[] arr = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++){
	System.out.println(arr[i]);
}

可通过arr.length来获取arr数组的长度


int[] arr = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i < arr.length; i++){
	System.out.println(arr[i]);
}

也可使用for-eachfor循环来实现相同的功能

int[] arr = {1, 2, 3};
for (int x : arr) {
	System.out.println(x);
}

2、数组作为函数的返回值

public static int[] reverse(int[] list) {
  int[] result = new int[list.length];
 
  for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
    result[j] = list[i];
  }
  return result;
}

3、数组作为函数的参数

//修改arr[0]的值
public static void main(String[] args) {
	int[] arr = {1, 2, 3};
	myArray(arr);
	System.out.println("arr[0] = " + arr[0]);
}
public static void myArray(int[] a) {
	a[0] = 10;
	System.out.println("a[0] = " + a[0]);
}

在这里插入图片描述
在myArray方法内部修改数组内容,方法外的数组内容也就发生了变化。因为数组是引用类型,所以可以修改到内部存放的内容。

4、数组的拷贝

import java.util.Arrays;
public static void func(){
	// 浅拷贝:newArr和arr引用的是同一个数组
	// 因此newArr修改空间中内容之后,arr也可以看到修改的结果
	int[] arr = {1,2,3,4,5,6};
	int[] newArr = arr;
	newArr[0] = 10;
	System.out.println("newArr: " + Arrays.toString(arr));
	
	// 深拷贝:copyOf方法在进行数组拷贝时,创建了一个新的数组
	// arr和newArr引用的不是同一个数组
	arr[0] = 1;
	newArr = Arrays.copyOf(arr, arr.length);
	System.out.println("newArr: " + Arrays.toString(newArr));
	
	// 因为arr修改其引用数组中内容时,对newArr没有任何影响
	arr[0] = 10;
	System.out.println("arr: " + Arrays.toString(arr));
	System.out.println("newArr: " + Arrays.toString(newArr));
	// 拷贝某个范围.
	int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
	System.out.println("newArr2: " + Arrays.toString(newArr2));
}
  • 浅拷贝: 引用的是同一个数组,同一个地址空间。
int[] arr = {1,2,3,4,5,6};
int[] newArr = arr;

在这里插入图片描述

  • 深拷贝: 创建了一个新的数组,引用的不是同一个地址。
int[] arr = {1,2,3,4,5,6};
newArr = Arrays.copyOf(arr, arr.length);

在这里插入图片描述

5、多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
基本语法格式:数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
示例:String str[][] = new String[3][4]; 二维数组 str 可以看成一个3行4列的数组。

int[][] arr = {
	{1, 2, 3, 4},
	{5, 6, 7, 8},
	{9, 10, 11, 12}
};
for (int row = 0; row < arr.length; row++) {
	for (int col = 0; col < arr[row].length; col++) {
		System.out.printf("%d\t", arr[row][col]);
	}
	System.out.println("");
}

在这里插入图片描述
多维数组的引用:arr[0][1]

Java中,数组是一种用于存储多个相同类型的数据的数据结构。数组的用法包括声明、初始化、访问和遍历。 1. 声明数组:可以使用以下方式声明数组: - `int[] arr;`:声明一个整型数组 - `String[] names;`:声明一个字符串数组 - `double[] scores;`:声明一个双精度浮点数数组 2. 初始化数组:可以使用以下方式初始化数组: - `arr = new int;`:初始化一个长度为5的整型数组 - `names = new String[]{"Alice", "Bob", "Charlie"};`:初始化一个包含指定元素的字符串数组 - `scores = {98.5, 87.0, 92.5};`:简化形式的初始化数组 3. 访问数组:可以使用索引来访问数组中的元素,索引从0开始计数。例如,`arr`表示数组中的第一个元素,`names`表示数组中的第三个元素。 4. 遍历数组:可以使用循环结构来遍历数组中的所有元素。例如,可以使用for循环来遍历整型数组: ``` for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } ``` 5. 数组拷贝:可以使用`System.arraycopy()`方法或`Arrays.copyOf()`方法来进行数组的拷贝操作。 6. 数组排序:可以使用`Arrays.sort()`方法对数组进行排序。 7. 不规则数组Java中也支持不规则数组,即数组中的元素可以是数组。例如,可以创建一个二维数组`int[][] array`,其中每个元素都是一个一维数组。可以通过循环嵌套来遍历和访问不规则数组中的元素。 以上是Java数组的基本用法。可以根据具体的需求和情况使用数组来存储和处理数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java——数组的使用](https://blog.csdn.net/qq_59599094/article/details/127728786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值