第3章 数组和数组操作

简介: 一维数组、二维数组,如何定义以及如何操作数组数据。

3.1 数组介绍

3.1.1 一维数组

  1. 定义:存放同一类型数据的组合。是一种引用数据类型。
  2. 动态初始化——方式一:
  • 声明、创建、定义:
  • 数据类型 数组名[] = new 数据类型[大小]
  • 数据类型[] 数组名 = new 数据类型[大小]
  • 初始化:a[0] = 1;……
  1. 动态初始化——方式二:
  • 声明数组:
  • 数据类型 数组名[];
  • 数据类型[] 数组名;
  • 声明数组时,[]内不能写数组大小。
  • 创建数组(分配空间):数组名 = new 数据类型[大小];
  • 初始化:a[0] = 1;……
  1. 静态初始化——方式一:
  • 数据类型 数组名[] = {值1, 值2,……}
  • 数据类型[] 数组名 = {值1, 值2,……}
  • 静态初始化时,[]内不能写数组大小。
  1. 静态初始化——方式二:
  • 数据类型 数组名[] = new 数据类型[]{值1, 值2,……}
  • 数据类型[] 数组名 = new 数据类型[]{值1, 值2,……}
  • 静态初始化时,[]内不能写数组大小。
  1. 注意事项:
  • 数组创建后,如果没有进行初始化,默认初始值如下:
  • byte、short、int、long:0
  • float、double:0.0
  • char:\u0000(空字符)
  • boolean:false
  • String:null
  • 数组是引用类型,是对象类型的一种。
  • 数组定义后不能直接改变大小(容量),但可以通过以下两种方式改变大小
  • 数组的拷贝:将一个大容量的数组赋值给小容量的数组
  • 通过new关键字重新确定容量大小。
  • 动态初始化情况下改变传入变量的大小控制数组的大小。

3.1.2 二维数组

  1. 动态初始化——方式一:
  • 声明、创建、定义:
  • 数据类型 数组名[][] = new 数据类型[大小][大小]
  • 数据类型[][] 数组名 = new 数据类型[大小][大小]
  • 数据类型[] 数组名[] = new 数据类型[大小][大小]
  • 初始化:
  • a[0][0] = 1;……
  • 或者a[0] = {1,3……}
  • 未初始化的默认值:
  • a[0]:指向内存地址。
  • a[0][0]:输出该数组对应数据类型的默认值。
  1. 动态初始化——方式二:
  • 声明数组:
  • 数据类型 数组名[][];
  • 数据类型[][] 数组名;
  • 数据类型[] 数组名[];
  • 创建数组(分配空间):数组名 = new 数据类型[大小][大小];
  • 初始化:
  • a[0][0] = 1;……
  • 或者a[0] = {1,3……}
  • 未初始化的默认值:
  • a[0]:指向内存地址。
  • a[0][0]:输出该数组对应数据类型的默认值。
  1. 动态初始化——列数不确定:
  • 声明数组:
  • 数据类型 数组名[][] = new 数据类型[大小][]
  • 数据类型[][] 数组名 = new 数据类型[大小][]
  • 数据类型[] 数组名[] = new 数据类型[大小][]
  • 数据类型 数组名[][];数组名 = new 数据类型[大小][];
  • 数据类型[][] 数组名;数组名 = new 数据类型[大小][];
  • 数据类型[] 数组名[];数组名 = new 数据类型[大小][];
  • 初始化:
  • a[0] = new int[1];……
  • 或者a[0] = {1,3……}
  • 注意点:
  • 数据类型 数组名[][] = new 数据类型[a][]声明了具有a个一维数组的二维数组,但一维数组内部的元素个数还不确定。
  • 数据类型 数组名[][] = new 数据类型[][a]这种声明方式非法。
  • 未初始化的默认值:
  • a[0] = new int[3];a[0]:指向内存地址。
  • 没有a[0] = new int[3];直接a[0]:null。
  • a[0] = new int[3];a[0][0]:输出该数组对应数据类型的默认值,本例为0。
  • 没有a[0] = new int[3];直接a[0]:报错。
  1. 静态初始化——方式一:
  • 数据类型 数组名[][] = {{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
  • 数据类型[][] 数组名 = {{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
  • 数据类型[] 数组名[] = {{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
  • 静态初始化时,[]内不能写数组大小。
  1. 静态初始化——方式二:
  • 数据类型 数组名[][] = new int[][]{{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
  • 数据类型[][] 数组名 = new int[][]{{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
  • 数据类型[] 数组名[] = new int[][]{{值1, 值2,……},{值1, 值2,……},{值1, 值2,……}}
  • 静态初始化时,[]内不能写数组大小。
  1. 特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。

3.2 数组操作

3.2.1 基本操作

  1. 拷贝数组:
  • 基本数据类型:b=0;a=b;,两个数值互不影响,拷贝的是数据。
  • 引用数据类型:int[] arr1 = {1,2……};arr2 = arr1;
  • 默认情况下:拷贝的是内存中的地址,arr1和arr2不论哪个的值变化,都会引起另外一个的变化。
  • 值拷贝方式:给arr1和arr2分别开辟独立的内存空间。int[] arr1 = {1,2……};int[] arr2 = new int[arr1.length];
  1. 反转数组:
  • 交换数据法:
  • 逆序赋值法:
  1. 数组扩容:
  • 创建新数组,新数组添加元素,将新数组赋值给旧数组。
  1. 数组缩减:

创建新数组,新数组长度比旧数组少1,循环赋值。

  1. 数组排序:
  • 内部排序:将所有数据加载到内存中进行排序。
  • 冒泡排序:
  • 外部排序:数据量过大,无法全部加载到内存中,借助外部的存储空间进行排序。
  1. 数组查找:
  • 顺序查找:
  • 二分查找:

3.2.2 Arrays工具类(常用)

  1. Arrays.equals(int[] a, int[] b)
  • 返回booleanboolean isEquals = Arrays.equals(a, b);
  • 返回true的条件:两数组指向同一个内存地址(a=b)、a和b内部的元素值相等
  • 返回false的条件:两数组均为null、a和b内部的元素值不想等
  • 除int外,其余各种类型的对象都可判断
  1. Arrays.toString(int[] a)
  • 返回StringString aStr = Arrays.toString(a);
  • 输出为[值1,,……]的形式,实际为字符串的拼接
  1. Arrays.fill(int[] a,10)
  • 返回为空,所以不能赋值给其他语句。
  • 表示将数组a的所有元素替换为10。
  1. Arrays.sort(int[] a)
  • 返回为空,所以不能赋值给其他语句。
  • 表示将数组a按照从小到大的顺序排序,底层排序方式为快速排序。
  1. Arrays.binarySearch(int[] a, 10)
  • 返回intint index = Arrays.binarySearch(a, 10);
  • 返回值为正数时,为目标数据(10)所在的元素下标。返回值为负数时,表示没找到。
  • 底层排序方式为二分法查找。
  1. 使用上述方法需要引入对应的工具类:import java.util.Arrays;

1.4.5 数组常见异常

  1. 编译时不报错,运行出错。
  2. ArrayIndexOutOfBoundsExcetion
  • 角标越界:
  • 角标为负数
  • 角标为数组长度(应为数组长度-1)
  1. NullPointerException
  • 数组指向null
  • 数组只声明、未初始化
  • 数组赋值为null
  • 不定列二维数组某个一维数组未初始化,访问了该一维数组的具体值。
  • 一维字符串数组的某个值赋值为空。

3.2.4 数组输出问题

  1. 详见(详见Java问答,1.4.14).
  2. 一维数组:
  • 声明未创建(没有指定数组大小):编译报错
  • 声明并初始化(指定数组大小):输出数组显示内存地址、输出元素显示默认值或指定值
  1. 二维数组:
  • 声明未创建(没有指定数组大小):编译报错
  • 声明并初始化(指定数组大小):
  • 指定两个大小:输出数组显示内存地址、输出一维元素显示内存地址或一维数组、输出二维元素为默认值或指定值
  • 指定一个大小:输出数组显示内存地址、输出一位元素显式为空、输出二维元素编译不报错,运行报错
目录
相关文章
|
8月前
|
C语言
【C语言】利用数组处理批量数据(一维数组和二维数组)
【C语言】利用数组处理批量数据(一维数组和二维数组)
|
2月前
将一个数组复制给另外一个数组
【10月更文挑战第29天】将一个数组复制给另外一个数组。
31 2
|
4月前
|
API Python
Numpy 数组的一些集合操作
Numpy 数组的一些集合操作
50 0
|
4月前
|
编译器 Linux API
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
59 0
|
8月前
|
编译器 C语言
多维数组名作函数参数
多维数组名作函数参数
50 0
|
8月前
|
存储 索引 Python
NumPy 数组切片及数据类型介绍
了解 NumPy 数组切片,用于从数组中提取子集。一维数组切片使用 `start:end:step`,如 `arr[1:5]`。二维数组切片如 `arr[1:3, 0:3]`。创建 5x5 数组并练习切片,例如打印第一行、第二列、对角线元素和 2x2 子数组。别忘了检查数据类型,如 `arr.dtype`,并使用 `astype()` 转换类型。
91 0
|
8月前
|
存储 机器学习/深度学习 数据挖掘
自定义数据类型与NumPy结构数组详解
【4月更文挑战第17天】本文详细介绍了NumPy中的自定义数据类型和结构数组。通过`numpy.dtype`可创建自定义数据类型,如示例中的包含整数和浮点数字段的数组。结构数组能存储不同类型的元素,每行作为一个记录,包含多个字段。创建结构数组时,定义字段及其数据类型,然后通过字段名进行访问和操作。掌握这些技术能提升数据处理效率和灵活性,尤其在科学计算和数据分析领域。
|
8月前
|
C语言
指针和多维数组
指针和多维数组
|
8月前
数组操作吧
数组操作吧
|
存储 C语言
C语言基础——(6)数组、变长数组、多维数组
数组 之前在说数据类型的时候就提到了数组,这里重点细说一下。数组名称不可以代表存储区,数组名称可以代表数组里第一个存储区的地址,也可以这么理解:数组的名称是一个指向数组第一个存储区的指针。
138 0
C语言基础——(6)数组、变长数组、多维数组