4.1数组的概述
数组是具有相同数据类型的一组数据的集合。例如,球类集合——足球、篮球、羽毛球等;数组中的每个元素具有相同的数据类型,我们经常使用的数组包括一维数组和二维数组等。
随着处理的信息量越来越大,工作也就越来越烦琐,这时可以使用数组或集合来存储信息。通过使用数组,可以在很大程度上缩短和简化程序代码,从而提高应用程序的效率。
数组(array)是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。
在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:
一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
有序性:数组中的元素是有序的,通过下标访问。
不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。
总的来说,数组具有以下特点:
数组可以是一维数组、二维数组或多维数组。
数值数组元素的默认值为 0,而引用元素的默认值为 null。
数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)。
数组元素可以是任何类型,包括数组类型。
数组类型是从抽象基类 Array 派生的引用类型。
4.2 一维数组
数组名字为一个合法的标识符,符号“[ ]”指明该变量是一个数组类型变量。单个“[ ]”表示要创建的数组是一个一维数组
4.2.1 创建一维数组
声明一维数组有两种方式:
int [ ] a ; //数组元素类型[ ] 数组名字
int a [ ] ; //数组元素类型 数组名字
声明一维数组,语法如下:
int arr [ ];//声明int型数组,数组中的每个元素都是int型数值
double[ ] dou;//声明double型数组,数组中的每个元素都是double型数组
数据类型[ ] 数组名 = new 数据类型[数组长度];
int[ ] a = new int [ 5 ];
4.2.2初始化一维数组
数组的初始化可分别初始化数组中的每个元素。数组的初始化有以下3种方式:
int a [ ] = { 1,2,3 } ; //第一种方式
int b [ ] = new int [ ] { 4,5,6 } ;//第二种方式
int c [ ] = new int [ ] ; //第三种方式
c [ 0 ] = 7 ; //给第一个元素赋值
c [ 1 ] = 8 ; //给第一个元素赋值
c [ 2 ] = 9; //给第一个元素赋值
注意:Java中的数组第一个元素,索引是以0开始的。
如果程序员只指定了数组的长度,那么系统将负责为这些数组元素分配初始值。指定初始值时,系统按如下规则分配初始值。
数组元素的类型是基本类型中的整数类型(byte、short、int 和 long),则数组元素的值是 0。
数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值是 0.0。
数组元素的类型是基本类型中的字符类型(char),则数组元素的值是‘\u0000’。
数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是 false。
数组元素的类型是引用类型(类、接口和数组),则数组元素的值是 null。
4.2.3 获取数组长度
arr . length
arr :数组名。
length:数组长度属性,返回int值
4.2.4 使用一维数组
在Java中,一维数组是最常见的一种数据结构。
4.3 二维数组
二维数组常用于表示表,表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
声明二维数组有两种方式:
int a [ ] [ ] ;// 数组元素类型 数组名字[ ] [ ];
int [ ] [ ] a ;// 数组元素类型 [ ] [ ] 数组名字;
声明二维数组。代码如下:
int tdarr1 [ ][ ] ;
char [ ][ ] tdarr2;
为二维数组分配内存有两种方式:
int a [ ][ ];
a = new int [ 4 ] [ 2 ] ; // 直接分配行列
int b [ ][ ];
b = new int [ 2 ] [ ] ; //先分配行,不分配列
b [ 0 ] = new int [ 2 ] ; //给第一行分配列
b [ 1 ] = new int [ 2 ] ; ///给第二行分配列
4.4 数组的基本操作
4.4.1 遍历数组
遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现的。遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。
4.4.2数组填充
import java.util.Arrays;
public class Main {
private static int i;
public static void main(String[] args) {
// write your code here
int arr[] = new int[5];
Arrays.fill(arr,8);
for (int i = 0; i < arr.length; i++);
System.out.println( +arr[i]);
}}
public static void main(String[] args) {
int[] number = new int[5];
System.out.println("number —共有 " + number.length + " 个元素,它们分别是:");
for (int i = 0; i < number.length; i++) {
Arrays.fill(number, i);
System.out.println("number[" + i + "]=" + i);
}
}
4.4.3复制数组
Arrays 类的 copyOf() 方法
Arrays 类的 copyOfRange() 方法
System 类的 arraycopy() 方法
Object 类的 clone() 方法
1.copyOf()方法
Arrays.copyOf(arr,int newlength)
数据类型[ ] 新数组名 = Arrays.copyOf(旧数组名,新数组长度)
2.copyOfRange()方法
Arrays.copyOfRange ( arr , int formIndex , int toIndex , int toIndex)
数据类型[]新数组名 = Arrays.copyOfRange(旧数组名,数组前序号,数组后序号);
4.5数组的排序
4.5.1算法:冒泡排序
冒泡排序(Bubble Sort)是常用的数组排序算法之一,它以简洁的思想与实现方法而备受青睐,也是广大学习者最先接触的一种排序算法。
冒泡排序的基本思想是:对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),这样数组元素就像气泡一样从底部上升到顶部。
冒泡排序的算法比较简单,排序的结果稳定,但时间效率不太高。Java 中的冒泡排序在双层循环中实现,其中外层循环控制排序轮数,总循环次数为要排序数组的长度减 1。而内层循环主要用于对比相邻元素的大小,以确定是否交换位置,对比和交换次数依排序轮数而减少。
4.5.2 算法:选择排序
直接选择排序方法属于选择排序的一种,它的排序速度要比冒泡排序快一些,也是常用的排序算法。 使用选择排序法也可以对上述数组中的元素进行排序,但是它与冒泡排序不同。选择排序是指每一趟从待排序的数据元素中选出最大(或最小)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
4.5.3Array.Sort(方法)
public static void main(String[] args) {
// 定义含有5个元素的数组
double[] scores = new double[] { 78, 45, 85, 97, 87 };
System.out.println("排序前数组内容如下:");
// 对scores数组进行循环遍历
for (int i = 0; i < scores.length; i++) {
System.out.print(scores[i] + "\t");
}
System.out.println("\n排序后的数组内容如下:");
// 对数组进行排序
Arrays.sort(scores);
// 遍历排序后的数组
for (int j = 0; j < scores.length; j++) {
System.out.print(scores[j] + "\t");
}
}
本章重点是创建数组,给数组赋值以及读取数组中元素的值。