数组
1.一维数组
1.1一维数组的概念
-
同类型的一组数据存储到一块,有一个数组的名称用来调用,但是数组中的值是有顺序的进行管理的
-
数组中的名词:
- 数组名:整个容器当中只有这一个名称
- 下标:永远从0开始,并且不改变
- 长度:声明长度以后不可改变
-
注意:
- 数组本身是
引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。 - 创建数组对象会在内存中开辟一整块
连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型。 - 数组中的元素在内存中是依次紧密排列的,有序的。
- 数组,一旦初始化完成,其长度就是确定的。数组的
长度一旦确定,就不能修改。 - 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
- 数组名中引用的是这块连续空间的首地址。
- 数组本身是
-
使用数组:
- 数组声明的语法:数据类型[] 数组名称
- 数组初始化的语法 :
- 静态初始化:已经知道数组中的各个值是谁
- 数组名称 = new 数据类型[]{x,x,x,x}
- 数组的名称 = {x,x,x,x}
- 动态初始化-不知道数组的值,只知道数据的长度
- 数组的名称 = new 数据类型[数组的长度]
- eg:数组的长度只能写在后面new了之后的[]中
- 静态初始化:已经知道数组中的各个值是谁
- 数组的长度:数组名。length是数组的一个属性,不是方法
- 数组元素的引用:数组名[数组的索引值] 不能超过数组的索引长度
- 数组的遍历:访问数组中所有的数据 for循环
- 数组的默认值:
- 引用数据类型:基本数据类型的默认值为谁,那么数组中的默认值就为谁
- 基本数据类型:基本都为null
一维数组的遍历
public class ArrayTest4 {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印数组的属性,输出结果是5
System.out.println("数组的长度:" + arr.length);
//遍历输出数组中的元素
System.out.println("数组的元素有:");
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}
数组默认初始值
| 数组元素类型 | 运算符 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0 L |
| float | 0.0F |
| double | 0.0 |
| char | 0 |
| boolean | false |
| 引用类行 | null |
一维数组内存分析
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
| 区域名称 | 作用 |
|---|---|
| 虚拟机栈 | 用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放 |
| 堆内存 | 存储对象(包括数组对象),new来创建的,都存储在堆内存 |
| 方法区 | 存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据 |
| 本地方法栈 | 当程序中调用了native的本地方法时,本地方法执行期间的内存区域 |
| 程序计数器 | 程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址 |
多维数组的使用
- 对于二维数组的理解,可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
- 其实,从数组底层的运行机制来看,其实没有多维数组
高一年级三个班级均由多个学生姓名构成一个个数组。如下:
那从整个年级看,我们可以声明一个二维数组。如下:
- 应用举例3:
蓝框的几个元素,可以使用一维数组来存储。但现在发现每个元素下还有下拉框,其内部还有元素,那就需要使用二
维数组来存储:
int[] monthData = new int[]{23,43,22,34,55,65,44,67,45,78,67,66};
int[][] quarterData = new int[][]{{23,43,22},{34,55,65},{44,67,45},{78,67,66}};
String[] class1 = new String[]{“段誉”,“令狐冲”,“任我行”};
String[] class2 = new String[]{“张三丰”,“周芷若”};
String[] class3 = new String[]{“赵敏”,“张无忌”,“韦小宝”,“杨过”};
声明与初始化
声明
//推荐
元素的数据类型[][] 二维数组的名称;
//不推荐
元素的数据类型 二维数组名[][];
//不推荐
元素的数据类型[] 二维数组名[];
静态初始化
格式:
int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1}};
定义一个名称为arr的二维数组,二维数组中有三个一维数组
- 每一个一维数组中具体元素也都已初始化
- 第一个一维数组 arr[0] = {3,8,2};
- 第二个一维数组 arr[1] = {2,7};
- 第三个一维数组 arr[2] = {9,0,1,6};
- 第三个一维数组的长度表示方式:arr[2].length;
注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组
动态初始化
如果二维数组的每一个数据,甚至是每一行的列数,需要后期单独确定,那么就只能使用动态初始化方式了。动态初
始化方式分为两种格式:
格式1:规则二维表:每一行的列数是相同的
1)确定行数和列数
- 元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
- 其中,m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行
- 此时创建完数组,行数、列数确定,而且元素也都有默认值
- (2)再为元素赋新值
- 二维数组名[行下标][列下标] = 值;
- 举例:
定义了名称为arr的二维数组
- 二维数组中有3个一维数组
- 每一个一维数组中有2个元素
- 一维数组的名称分别为arr[0], arr[1], arr[2]
- 给第一个一维数组1脚标位赋值为78写法是: arr[0][1] = 7
格式2:不规则:每一行的列数不一样 - (1)先确定总行数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][]; - 此时只是确定了总行数,每一行里面现在是null
- (2)再确定每一行的列数,创建每一行的一维数组
二维数组名[行下标] = new 元素的数据类型[该行的总列数]; - 此时已经new完的行的元素就有默认值了,没有new的行还是null
- (3)再为元素赋值
二维数组名[行下标][列下标] = 值
举例:
int[][] arr = new int[3][
- 二维数组中有3个一维数组。
- 每个一维数组都是默认初始化值null (注意:区别于格式1)
- 可以对这个三个一维数组分别进行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
- 注: int[][]arr = new int[][3]; //非法
package com.six;
public class array18 {
public static void main(String[] args) {
/*
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
*/
int[][] arr = new int[5][];
//确定每一行的列数
for (int i = 0; i < arr.length; i++) {
/*
arr[0] 的列数是1
arr[1] 的列数是2
arr[2] 的列数是3
arr[3] 的列数是4
arr[4] 的列数是5
*/
arr[i] = new int[i + 1];
}
//确定元素的值
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = i + 1;
}
}
//遍历显示
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
数组的长度和角标
- 二维数组的长度/行数:二维数组名.length
- 二维数组的某一行:二维数组名[行下标],此时相当于获取其中一组数据。它本质上是一个一维数组。行下标的
范围:[0, 二维数组名.length-1]。此时把二维数组看成一维数组的话,元素是行对象。 - 某一行的列数:二维数组名[行下标].length,因为二维数组的每一行是一个一维数组。
- 某一个元素:二维数组名[行下标][列下标],即先确定行/组,再确定列。
二位数组的遍历
格式
for(int i=0; i<二维数组名.length; i++){ //二维数组对象.length
for(int j=0; j<二维数组名[i].length; j++){//二维数组行对象.length
System.out.print(二维数组名[i][j]);
}
System.out.println();
}
举例
public class Test23TwoDimensionalArrayIterate {
public static void main(String[] args) {
//存储3个小组的学员的成绩,分开存储,使用二维数组。
int[][] scores = {
{85,96,85,75},
{99,96,74,72,75},
{52,42,56,75}
};
System.out.println("一共有" + scores.length +"组成绩.");
for (int i = 0; i < scores.length; i++) {
System.out.print("第" + (i+1) +"组有" + scores[i].length + "个学员,成绩如下:");
for (int j = 0; j < scores[i].length; j++) {
System.out.print(scores[i][j]+"\t");
}
System.out.println();
}
}
}
内存解析
二维数组本质上是元素类型是一维数组的一维数组。
int[][] arr = {
{1},
{2,2},
{3,3,3},
{4,4,4,4},
{5,5,5,5,5}
};
//1、声明一个二维数组,并且确定行数
//因为每一行的列数不同,这里无法直接确定列数
int[][] arr = new int[5][];
//2、确定每一行的列数
for(int i=0; i<arr.length; i++){
/*
arr[0] 的列数是1
arr[1] 的列数是2
arr[2] 的列数是3
arr[3] 的列数是4
arr[4] 的列数是5
*/
arr[i] = new int[i+1];
}
//3、确定元素的值
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
arr[i][j] = i+1;
数组的常见算法
数值型数组特征值统计
- 平均值,最大值,最小值,总和等
package com.six;
public class array14 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = +arr[i];
}
double avg = (double) sum / arr.length;
System.out.println("sum=" + sum);
System.out.println("avg=" + avg);
}
}
class array20 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
long result = 1;
for (int i = 0; i < arr.length; i++) {
result *= arr[i];
}
System.out.println("result=" + result);
}
}
class array21 {
public static void main(String[] args) {
int[] arr = {4, 5, 6, 1, 9};
//统计偶数个数
int evenCount = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
evenCount++;
}
}
System.out.println("evenCount = " + evenCount);
}
}
class TestArrayMax {
public static void main(String[] args) {
int[] arr = {4, 5, 6, 1, 9};
//找最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {//此处i从1开始,是max不需要与arr[0]再比较一次了
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println("max = " + max);
}
}
class array22 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
//找最大值,及下标
int max = arr[0];
int index = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
index = i;
}
}
System.out.println("max = " + max);
System.out.println("index = " + index);
}
}
class array23 {
//找最值及其所有最值的下标
public static void main(String[] args) {
int[] arr = {4,5,6,1,9,9,3};
//找最大值
int max = arr[0];
String index = "0";
for(int i=1; i<arr.length; i++){
if(arr[i] > max){
max = arr[i];
index = i + "";
}else if(arr[i] == max){
index += "," + i;
}
}
System.out.println("最大值是" + max);
System.out.println("最大值的下标是[" + index+"]");
}
}
class array24 {
//分析以下需求,并用代码实现:
//(1)在编程竞赛中,有10位评委为参赛的选手打分,分数分别为:5,4,6,8,9,0,1,2,7,3
//(2)求选手的最后得分(去掉一个最高分和一个最低分后其余8位评委打分的平均值分析以下需求,并用代码实现:
public static void main(String[] args) {
int[] scores = {5,4,6,8,9,0,1,2,7,3};
int max = scores[0];
int min = scores[0];
int sum = 0;
for (int i = 0; i < scores.length; i++) {
if(max < scores[i]){
max = scores[i];
}
if(min > scores[i]){
min = scores[i];
}
sum += scores[i];
}
double avg = (double) (sum-max-min) / (scores.length-2);
System.out.println("选手去掉最高分和最低分之后的平均分为:" + avg);
}
}
数组元素的赋值与数组复制
举例2:使用简单数组
package com.six;
public class array25 {
public static void main(String[] args) {
/*
(1)在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,
使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。 array2 = array1;
*/
int[] array1 = {2, 3, 5, 7, 11, 13, 17, 19};
int[] array2;
int[] array3;
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i] + "\t");
}
array2 = array1;
for (int i = 0; i < array2.length; i++) {
if (i % 2 == 0) {
array2[i] = i;
}
}
System.out.println();
array3 = new int[array1.length];//存储位置改变
for (int i = 0; i < array3.length; i++) {
array3[i] = array1[i];
}
//遍历更改之后的array1的值
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + "\t");
}
for (int i = 0; i < array3.length; i++) {
System.out.print(array3[i] + "\t");
}
System.out.println(array1);
System.out.println(array2);
System.out.println(array3);
}
}
举例6:回形数
从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
举例6:回形数
从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
--------------------------
package com.six;
public class array27 {
public static void main(String[] args) {
/*
01 02 03 04 05 06 07
24 25 26 27 28 29 08
23 40 41 42 43 30 09
22 39 48 49 44 31 10
21 38 47 46 45 32 11
20 37 36 35 34 33 12
19 18 17 16 15 14 13
*/
int n = 7;
int[][] arr = new int[n][n];
int count = 0;
int maxX = n - 1;
int maxY = n - 1;
int minX = 0;
int minY = 0;
while (minX <= maxX) {
for (int x = minX; x <= maxX; x++) {
arr[minY][x] = ++count;
}
minY++;
for (int y = minY; y <= maxY; y++) {
arr[y][maxX] = ++count;
}
maxX--;
for (int x = maxX; x >= minX; x--) {
arr[maxY][x] = ++count;
}
maxY--;
for (int y = maxY; y >= minY; y--) {
arr[y][minX] = ++count;
}
minX++;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
String space = (arr[i][j] + "").length() == 1 ? "0" : "";
System.out.print(space + arr[i][j] + " ");
}
System.out.println();
}
}
}
数组元素的反转
- 实现思想:数组对称位置的元素互换。
package com.six;
public class array28 {
public static void main(String[] args) {
// 数组元素的反转
//实现思想:数组对称位置的元素互换
int[] arr = {1, 2, 3, 4, 5};
System.out.println("反转之前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
//反转
/*
思路:首尾对应位置的元素交换
(1)确定交换几次
次数 = 数组.length / 2
(2)谁和谁交换
for(int i=0; i<次数; i++){
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
*/
for (int i = 0; i < arr.length/2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
System.out.println("反转之后");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
class array29 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println("反转之前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
//反转
//左右对称位置交换
for(int left=0,right=arr.length-1; left<right; left++,right--){
//首 与 尾交换
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
System.out.println("反转之后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
数组的扩容与缩容
数组的扩容与缩容
- 数组的扩容
题目:现有数组 int[] arr = new int[]{1,2,3,4,5}; ,现将数组长度扩容1倍,并将10,20,30三个数据添加到arr数组中,如何
操作?
- 数组的缩容
题目:现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素
package com.six;
//public class array30 {
// public static void main(String[] args) {
// //题目:现有数组 int[] arr = new int[]{1,2,3,4,5}; ,现将数组长度扩容1倍,
// // 并将10,20,30三个数据添加到arr数组中,如何
// //操作?
// int[] arr = new int[]{1, 2, 3, 4, 5};
// int[] newArr = new int[arr.length + 3];
// for (int i = 0; i < arr.length; i++) {
// newArr[i] = arr[i];
// }
//
// newArr[arr.length] = 10;
// newArr[arr.length + 1] = 20;
// newArr[arr.length + 2] = 30;
//
// arr = newArr;
//
// for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i]);
// }
// }
//}
class array31 {
public static void main(String[] args) {
//现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
//删除数组中索引为4的元素
int delIndex = 4;
//方案1:
//创建新数组
int[] newArr = new int[arr.length - 1];
for (int i = 0; i < delIndex; i++) {
newArr[i] = arr[i];
}
for (int i = delIndex; i < arr.length; i++) {
newArr[i - 1] = arr[i];
}
arr = newArr;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
class array32 {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
//删除数组中索引为4的元素
int delIndex = 4;
for (int i = delIndex; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
arr[arr.length - 1] = 0;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
数组的元素查找
顺序查找yu二分查找
- 顺序查找:挨个查看
- 要求:对数组元素的顺序没要求
package com.six;
public class array33 {
public static void main(String[] args) {
//顺序查找:挨个查看
//要求:对数组元素的顺序没要求
int[] arr = {4,5,6,1,9};
int value = 1;
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == value) {
index = i;
break;
}
}
if(index==-1){
System.out.println(value + "不存在");
}else{
System.out.println(value + "的下标是" + index);
}
}
}
class array34 {
public static void main(String[] args) {
//二分法查找:要求此数组必须是有序的。
int[] arr3 = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
boolean isFlag = true;
int value = 256;
//int value = 25;
int head = 0;//首索引位置
int end = arr3.length - 1;//尾索引位置
while (head <= end) {
int middle = (head + end) / 2;
if (arr3[middle] == value) {
System.out.println("找到指定的元素,索引为:" + middle);
isFlag = false;
break;
} else if (arr3[middle] > value) {
end = middle - 1;
} else {//arr3[middle] < value
head = middle + 1;
}
}
if (isFlag) {
System.out.println("未找打指定的元素");
}
}
}
数组元素排序
算法概述
- 定义
- 排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn}。将这些记录重新
排序为{Ri1,Ri2,…,Rin},使得相应的关键字值满足条Ki1<=Ki2<=…<=Kin,这样的一种操作称为排序。 - 通常来说,排序的目的是快速查找。
- 排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn}。将这些记录重新
- 衡量排序算法的优劣:
- 时间复杂度 :分析关键字的比较次数和记录的移动次数
- 常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<
Ο(n!)<O(nn) - 空间复杂度 :分析排序算法中需要多少辅助内存
一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函
- 稳定性 :若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳
定的。
冒泡排序(Bubble Sort)
排序思想:
- 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止
动态演示:https://visualgo.net/zh/sorting?slide=6-9
快速排序
快速排序(Quick Sort)由 图灵奖 获得者 Tony Hoare 发明,被列为 20世纪十大算法之一 ,是迄今为止所有内排序算
法中速度最快的一种,快速排序的时间复杂度为O(nlog(n))。
快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试
面试中能经常看到快排的影子。
排序思想:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可
以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 - 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
- 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算
法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
动态演示: https://visualgo.net/zh/sorting
内部排序性能比较与选择
- 性能比较
- 从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
- 从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。
对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。 - 从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆
排序是不稳定排序 - 从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。
- 选择
- 若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排
序为宜。 - 若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
- 若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序
- 若n较小(如n≤50),可采用直接插入或直接选择排序。
Arrays工具类的使用
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。 比如:
- 数组元素拼接
- static String toString(int[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用
字符 ", "(逗号加空格)分隔。形式为:[元素1,元素2,元素3。。。] - static String toString(Object[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元
素用字符 ", "(逗号加空格)分隔。元素将自动调用自己从Object继承的toString方法将对象转为字符串进行
拼接,如果没有重写,则返回类型@hash值,如果重写则按重写返回的字符串进行拼接。
- static String toString(int[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用
- 数组排序
- static void sort(int[] a) :将a数组按照从小到大进行排序
- static void sort(int[] a, int fromIndex, int toIndex) :将a数组的[fromIndex, toIndex)部分按照升序排列
- static void sort(Object[] a) :根据元素的自然顺序对指定对象数组按升序进行排序。
- static void sort(T[] a, Comparator<? super T> c) :根据指定比较器产生的顺序对指定对象数组进行排序。
数组元素的二分查找
static int binarySearch(int[] a, int key) 、static int binarySearch(Object[] a, Object key) :要求数组有序,在数
组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数。
- 数组的复制
- static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,
并返回新数组 - static T[] copyOf(T[] original,int newLength):根据original原数组复制一个长度为newLength的新数组,并返
- static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,
- 回新数组
- static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新
数组
static T[] copyOfRange(T[] original,int from,int to):复制original原数组的[from,to)构成新数组,并返回新数
组
比较两个数组是否相等 - static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
- static boolean equals(Object[] a,Object[] a2):比较两个数组的长度、元素是否完全相同
填充数组 - static void fill(int[] a, int val) :用val值填充整个a数组
- static void fill(Object[] a,Object val):用val对象填充整个a数组
- static void fill(int[] a, int fromIndex, int toIndex, int val):将a数组[fromIndex,toIndex)部分填充为val值
- static void fill(Object[] a, int fromIndex, int toIndex, Object val) :将a数组[fromIndex,toIndex)部分填充为val对
象
举例
- static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新
观察一下代码,运行后会出现什么结果。
import java.util.Arrays;
public class SortTest {
public static void main(String[] args) {
int[] arr = {3, 2, 5, 1, 6};
System.out.println("排序前" + Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序后" + Arrays.toString(arr));
}
}
数组中的常见异常
数组角标越界异常
当访问数组元素时,下标指定超出[0, 数组名.length-1]的范围时,就会报数组下标越界异常
public class TestArrayIndexOutOfBoundsException {
public static void main(String[] args) {
int[] arr = {1,2,3};
// System.out.println("最后一个元素:" + arr[3]);//错误,下标越界
// System.out.println("最后一个元素:" + arr[arr.length]);//错误,下标越界
System.out.println("最后一个元素:" + arr[arr.length-1]);//对
}
}
空指针异常
public class TestNullPointerException {
public static void main(String[] args) {
//定义数组
int[][] arr = new int[3][];
System.out.println(arr[0][0]);//NullPointerException
}
}
- 小结
//举例一:
// int[] arr1 = new int[10];
// arr1 = null;
// System.out.println(arr1[9]);
//举例二:
// int[][] arr2 = new int[5][];
// //arr2[3] = new int[10];
// System.out.println(arr2[3][3]);
//举例三:
String[] arr3 = new String[10];
System.out.println(arr3[2].toStri

被折叠的 条评论
为什么被折叠?



