博客源为书写的载体,书写以对思维的缓存 正文

Java 数组笔记


数组对于每一门编程语言来说都是重要的数据结构之一,不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素,复习复习温故而知新。

一:声明数组变量

必须先声明数组变量,才能在程序中使用数组。语法如下:

1.方式一:(推荐)
>>> dataType[] arrayName;
举例:
>>> int[] scoreList;

2.方式二:(效果相同但不推荐)
>>> dataType arrayName[];
举例:
>>> int scoreList[];

注意:
建议使用dataType[] arrayName的声明风格声明数组变量。dataType arrayName[] 风格是来自C/C++语言,在Java中采用是为了让C/C++程序员能够快速理解java语言。

二:创建数组

Java使用new操作符来创建数组,同时需要为数组分配内存空间。语法如下:

1.方式一:
>>> dataType[] arrayName;
>>> arrayName= new dataType[arraySize];    // arraySize:数组长度,也就是数组元素个数
举例:
>>> int[] scoreList;
>>> scoreList = new int[5];

2.方式二:
>>> dataType[] arrayName= new dataType[arraySize];    // 将方式一的两步骤进行合并
举例:
>>> int[] scoreList = new int[5];

三:初始化数组

初始化数组也就是为数组添加元素,既可以在声明数组的同时进行初始化(静态初始化),也可以在声明以后进行初始化(动态初始化)。

1.静态初始化
语法:
>>> dataType[] arrayName= new dataType[]{value0, value1, value2, ...};
举例:
>>> int[] scoreList = new int[]{85, 90, 98, 95, 99}; // 声明、创建、初始化一步到位
注意:静态初始化时无需设置"arraySize"数组长度。
或者:进一步简化
语法:
>>> dataType[] arrayName= {value0, value1, value2, ...};
举例:
>>> String[] nameList = {"张三", "李四", "王五"};     // 声明、创建、初始化一步到位(更简化)

2.动态初始化
语法:
>>> dataType[] arrayName= new dataType[arraySize];
>>> arrayRefVar[index0] = value1;
>>> arrayRefVar[index1] = value2;
>>> ...
举例:
>>> String[] nameList = new String[3];
>>> nameList[0] = "张三";
>>> nameList[1] = "李四";
>>> nameList[2] = "王五";
注意:数组中的元素都可以通过下标来访问或赋值,下标从 0 开始。

四:操作数组

1.实际开发中我们经常使用基本循环或者 foreach 循环来控制数组成员操作,关于Java 循环可参考我的:Java循环结构

1.基本循环:
public class TestArrayFor {
   public static void main(String[] args){
       String[] nameList = {"Tom", "Bob", "Jack"};
       // 普通for循环遍历所有元素
       for(int i = 0; i < nameList.length; i++){
           System.out.println(nameList[i]);
       }
   }
}
注意点:
1.nameList.length:获取数组的长度
2.数组下标范围为:0 至 数组长度-1,如果越界访问,就会报错(ArrayIndexOutOfBoundsException)。

2.foreach循环(也叫增加for循环):
语法:
for(声明语句 : 表达式){   //代码句子
}
(1)声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,
           其值与此时数组元素的值相等。
(2)表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
举例:

public class TestArrayForeach {
   public static void main(String[] args){
       String[] nameList = {"Tom", "Bob", "Jack"};
       // foreach循环遍历所有元素
       for(String name: nameList){
           System.out.println(name);
       }
   }
}

2.使用 Arrays 类操作数组

Arrays 类是Java提供的一个工具类,在 java.util 包中。该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序、比较;数组元素查找、赋值等等,它提供的所有方法都是静态的。

1.数组排序

方法:public static void sort(dataType[] a)

用法:Arrays.sort(数组名);
只要将数组名放在sort()方法的括号中,就可以完成对该数组的排序(升序排列)。
举例:
>>> import java.util.Arrays;

>>> int[] scoreList = {99, 87, 100};
>>> Arrays.sort(scoreList);
>>> for(int score : scoreList){
...     System.out.print(score);
... }
... 87, 99, 100

注意:
(1)Arrays.sort()方法是经过优化的"快速排序"。
(2)Arrays.sort()方法只提供了默认的升序排列,没有提供相应的降序排列。
(3)Arrays.sort()方法可以对任意的基本数据类型的数组进行排序。

2.数组间的比较

方法:public static boolean equals(dataType[] a1, dataType[] a2)

用法:Arrays.equals(数组1, 数组2);
举例:
>>> import java.util.Arrays;

>>> int[] scoreList1 = {99, 87, 100};
>>> int[] scoreList2 = {87, 99, 100};
>>> Arrays.equals(scoreList1, scoreList2);
... false

注意:
(1)Arrays.equals()方法返回布尔类型,如果两数组相等则返回true,否则返回false。
(2)只有两个数组以相同顺序排列、包含相同的元素,两个数组才相等。

3.数组元素查找

方法:public static int binarySearch(dataType[] a, elem)

用法:Arrays.binarySearch(数组名, 元素);
举例:
>>> import java.util.Arrays;

>>> int[] scoreList = {87, 99, 100};
>>> Arrays.binarySearch(scoreList, 87);
... 0
>>> Arrays.binarySearch(scoreList, 108);
... -4

注意:
(1)Arrays.binarySearch()是用二分查找算法在数组中搜索指定的元素然后返回该元素的下标。
(2)Arrays.binarySearch()使用时传入的数组必须按升序排列好的。
(3)如果查找的元素不存在,则返回(-(插入点)-1)。

4.数组元素赋值

方法:public static void fill(dataType[] a, val)

用法:Arrays.fill(数组名, 值);
举例:
>>> import java.util.Arrays;

>>> int[] scoreList = {87, 99, 100};
>>> Arrays.binarySearch(scoreList, 6);
>>> for(int score : scoreList){
...     System.out.print(score);
... }
... 6 6 6

注意:
(1)Arrays.fill()方法是
将指定的值分配给数组中的每个元素。

5.数组转换成字符串

方法:public static String toString(dataType[] a)

用法:Arrays.toString(数组名);
举例:
>>> import java.util.Arrays;

>>> int[] scoreList = {87, 99, 100};
>>> System.out.println(Arrays.toString(scoreList));
... [87, 99, 100];
>>> (Arrays.toString(scoreList).getClass().getName());
... java.lang.String;

注意:
(1)Arrays.toString()方法
将一个数组转换成字符串。
(2)Arrays.toString()方法会按顺序把数组元素连接在一起,元素之间使用逗号隔开,元素外部用"[]"包裹。

6.数组复制

方法:public static dataType[] copyOf(dataType[] a, int newLength)

用法:Arrays.copyOf(原数组名, 新数组长度);
举例:
>>> import java.util.Arrays;

>>> int[] scoreList1 = {87, 99, 100};
>>> int[] scoreList2 = Arrays.copyOf(scoreList1, 2);
... for(int score : scoreList2){
...     System.out.print(score);
... }
... 87 99;

>>> int[] scoreList3 = Arrays.copyOf(scoreList1, 5);
... for(int score : scoreList3){
...     System.out.print(score);
... }
... 87 99 100 0 0

注意:
(1)Arrays.copyOf()方法
将把数组复制成另一个指定长度的新数组。
(2)如果newLength小于原数组的长度,则截取原数组newLength个元素来组成新数组。
(3)如果newLength大于原数组的长度,则数值类型的数组多位补0,其它类型的数组多位补null。

Arrays 类还提供了许多其他方法来操作数组此处就不一一列举啦,想了解更多内容可自行查看API。

五:多维数组

多维数组可以看成是数组的数组,比如我们常用的二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

1.声明+创建(以二维数组为例):
>>> dataType[][] arrayName = new dataType[行的个数][列的个数];
举例:
>>> int[][] scoreLists = new int[2][3];
表示定义了一个int型的二维数组,其中包含2个一维数组,每个一维数组可以存储3个元素。

2.初始化(以二维数组为例):
1.动态初始化:
>>> int[][] scoreLists = new int[2][3];
>>> scoreLists[0][0] = 1;
>>> scoreLists[0][1] = 2;
>>> scoreLists[0][2] = 3;
>>> scoreLists[1][0] = 4;
>>> scoreLists[1][1] = 5;
>>> scoreLists[1][2] = 6;
直观来看:scoreLists = {{1, 2, 3}, {4, 5, 6}};
注意:
在定义二维数组时也可以只指定行的个数,然后再为每一行分别指定列的个数。如果每行的列数不同,则创建的是不规则的二维数组。
>>> int[][] scoreLists = new int[2][];
>>> scoreLists[0] = new int[2];    // 为第一行分配2列
>>> scoreLists[1] = new int[3];    // 为第二行分配3列
>>> scoreLists[0][0] = 100;
>>> scoreLists[1][1] = 200;
直观来看:scoreLists = {{100, 0}, {0, 200, 0}};    //数值类型的数组默认补0,其它类型的数组默认补null。

2.静态初始化语法:
>>> dataType[][] arrayName= {{元素1}, {元素2, 元素3}, ...};
举例:
>>> String[][] nameList = {{"张三"}, {"李四", "王五"}};    // 声明、创建、初始化一步到位

3.遍历多维数组(以二维数组为例):
二维数组的访问和输出与一维数组一样,只是多了一个下标而已。在循环输出时需要里面再内嵌一个循环,也就是使用二重循环来输出二维数组中的每一个元素。以此类推三维数组就需要三重循环来遍历...
举例:
public class MultidimensionalArrays {
   public static void main(String[] args) {
       // 定义两行三列的二维数组并赋值
String[][] name = {{"Tom", "Bob", "Jack"}, {"zhangsan", "lisi", "wangwu"}};
// 通过二重循环输出二维数组中元素的值
for (int i = 0; i < name.length; i++) {
   for (int j = 0; j < name[i].length; j++) {
System.out.println(name[i][j]);
   }
   System.out.println();
}
   }
}

六:最后

846.jpg