第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. 二维数组:
  • 声明未创建(没有指定数组大小):编译报错
  • 声明并初始化(指定数组大小):
  • 指定两个大小:输出数组显示内存地址、输出一维元素显示内存地址或一维数组、输出二维元素为默认值或指定值
  • 指定一个大小:输出数组显示内存地址、输出一位元素显式为空、输出二维元素编译不报错,运行报错
目录
相关文章
|
23天前
|
存储
数组的初识
数组的初识
|
11天前
|
存储 搜索推荐 算法
C数组
C数组
18 0
|
10天前
|
存储 C++ 索引
c++数组
c++数组
20 2
|
15天前
|
存储 C++ 索引
C++数组
C++数组
22 0
|
23天前
数组操作吧
数组操作吧
|
23天前
|
存储 程序员 C++
c++数组详细介绍(一)
前言 深入理解C++的数组和字符串是成为熟练C++程序员的重要一步。本文将探索C++中数组和字符串的基本概念,从基础到进阶,包括数组的声明、初始化、访问和多维数组的操作,以及字符串类的使用和与字符数组的转换。还将涉及异常处理、动态内存分配、STL中的其他容器、常用字符串操作。
63 0
|
7月前
|
机器学习/深度学习 Java
【数组的使用】
【数组的使用】
34 0
|
10月前
|
存储 编译器 程序员
|
存储 算法 Java
4 数组
4 数组
94 0
|
存储 算法 编译器

热门文章

最新文章