Java——数组

本文简要介绍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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值