深入了解Java中的数组
- 一、数组的概述
- 1.数组(Array)
- 2.常见概念
- 3.数组的分类
- 二、数组的使用
- 1.声明方式
- 2.初始化
- (1)一维数组
- 动态初始化:
- 静态初始化:
- (2)二维数组
- 动态初始化:
- 静态初始化:
- 3.使用
- (1)一维数组的使用
- (2)二维数组的使用
- 三、数组涉及到的常见算法
- 1. 数组元素的赋值(杨辉三角)
- 2. 求数值型数组中元素的最大值、最小值、平均数、总和等
- 3. 数组的复制、反转、查找(线性查找、二分法查找
- 四、Arrays工具类的使用
- 五、数组使用中的常见异常
一、数组的概述
1.数组(Array)
是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
2.常见概念
- 数组名
- 下标(或索引):可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快
- 元素
- 数组的长度(长度一旦确定,就不能修改)
3.数组的分类
- 按照维度:一维数组、二维数组、三维数组
- 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
二、数组的使用
1.声明方式
int brrr[] 或int[] brrr
int arr[][]或int[][] arr
例如:
int a[];
int[] a1;
double b[];
String[] c;//引用类型变量数组
- 注意:
- Java语言中声明数组时不能指定其长度(数组中元素的数),例如:inta[5]; //非法
2.初始化
(1)一维数组
动态初始化:
数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr= new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
String names[];
names = new String[3];
names[0] = “钱学森”;
names[1] = “邓稼先”;
names[2] = “袁隆平”;
静态初始化:
在定义数组的同时就为数组元素分配空间并赋值
int arr[] = new int[]{ 3, 9, 8};
或
int[] arr = {3,9,8};
String names[] = {“李四光”,“茅以升”,“华罗庚”};
(2)二维数组
动态初始化:
- 格式一
int[][] arr= new int[3][2];
定义了名称为arr的二维数组二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0], arr[1], arr[2]
给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78
- 格式二
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]; //非法
静态初始化:
int[][] arr= new int[][]{{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组,二维数组中有三个一维数组
每一个一维数组中具体元素也都已初始化
第一个一维数组arr[0] = {3,8,2};
第二个一维数组arr[1] = {2,7};
第三个一维数组arr[2] = {9,0,1,6};
第三个一维数组的长度表示方式:arr[2].length
3.使用
(1)一维数组的使用
- 冒泡排序
public class Dat_7_1 {
public static void Bubble(){
int[] arr=new int[]{43,32,76,-98,0,64,33,-21,32,99};
//遍历
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println("冒泡排序结果为:");
//冒泡排序
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
//遍历
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
public static void main(String[] args) {
Bubble();
}
}
运行结果:
43 32 76 -98 0 64 33 -21 32 99 冒泡排序结果为:
-98 -21 0 32 32 33 43 64 76 99
Process finished with exit code 0
(2)二维数组的使用
- 二维数组中数字的总和
public static void Sum(){
int num=0;
int[][] brr=new int[][]{{1,2,3},{7,8,9},{4,5,6}};
for(int i=0;i<brr.length;i++){
for(int j=0;j<brr[i].length;j++){
num +=brr[i][j];
System.out.print(brr[i][j]+"\t");
}
System.out.println();
}
System.out.println("总和为:"+num);
}
运行结果:
1 2 3
7 8 9
4 5 6
总和为:45
三、数组涉及到的常见算法
1. 数组元素的赋值(杨辉三角)
杨辉三角形
public static void Triangle(){
//1.声明并初始化二维数组
int[][] tri=new int[10][];
//2.给数组元素赋值
for (int i=0;i<tri.length;i++){
tri[i]=new int[i+1];
//2.1给首末元素赋值
tri[i][0]=tri[i][i]=1;
//2.2给每行非首末元素赋值
if(i>1){
for(int j=1;j<tri[i].length-1;j++){
tri[i][j]=tri[i-1][j-1]+tri[i-1][j];
}
}
}
//3.遍历数组
for (int i=0;i<tri.length;i++){
for (int j=0;j<tri[i].length;j++){
System.out.print(tri[i][j]+"\t");
}
System.out.println();
}
}
运行结果:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
Process finished with exit code 0
2. 求数值型数组中元素的最大值、最小值、平均数、总和等
public static void Value(){
int[] arr=new int[10];
for (int i=0;i<arr.length;i++){
arr[i]=(int)(Math.random()*(99-10+1)+10);
}
//遍历
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
//求数组元素的最大值
int maxValue=0;
for(int i=0;i<arr.length;i++){
if (maxValue<arr[i]){
maxValue=arr[i];
}
}
System.out.println("最大值为:"+maxValue);
//求数组元素的最小值
int minValue=0;
for(int i=0;i<arr.length;i++){
if (minValue>arr[i]){
minValue=arr[i];
}
}
System.out.println("最小值为:"+minValue);
//求数组元素的总和
int sum=0;
for(int i=0;i<arr.length;i++){
sum +=arr[i];
}
System.out.println("总和为:"+sum);
//求数组元素的平均值
int avgValue=sum/arr.length;
System.out.println("平均数为:"+avgValue);
}
3. 数组的复制、反转、查找(线性查找、二分法查找
/**
*算法考察:数组的复制、反转、查找(线性查找、二分法查找)
*/
public static void Algorithm(){
String[] arr=new String[]{"aa","bb","cc","dd"};
//数组的复制(区别于数组的赋值:arr1=arr)
String[] arr1=new String[arr.length];
for(int i=0;i<arr1.length;i++){
arr1[i]=arr[i];
}
//遍历
for(int i=0;i<arr1.length;i++){
System.out.print(arr1[i]+"\t");
}
System.out.println();
//数组的反转
for(int i=0;i<arr.length/2;i++){
String temp=arr[i];
arr[i]=arr[arr.length-i-1];
arr[arr.length-i-1]=temp;
}
//遍历
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
/**
* 查找
*/
public static void Find(){
String[] arr=new String[]{"aa","bb","cc","dd"};
//遍历
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
//1.线性查找
String brr="aa";
for(int i=0;i<arr.length;i++){
if(brr.equals(arr[i])){
System.out.println("找到指定元素,位置为:"+i);
break;
}
System.out.println("很遗憾没有找到");
}
//2.二分法查找(所要查找的必须有序)
int[] arr2=new int[]{-98,-34,2,34,54,66,79,105,210,333};
//遍历
for(int i=0;i<arr2.length;i++){
System.out.print(arr2[i]+"\t");
}
System.out.println();
int brr1=-34;
int head=0;//初始的首索引
int end=arr2.length-1;//初始的末索引
boolean isFlag1=true;
while (head<=end){
int middle=(head+end)/2;
if(brr1==arr2[middle]){
System.out.println("找到指定元素,位置为:"+middle);
isFlag1=false;
break;
}else if(arr2[middle]>brr1){
end=middle-1;
}else {
head=middle+1;
}
}
if(isFlag1){
System.out.println("很遗憾,没有找到");
}
}
四、Arrays工具类的使用
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
public class ArraysTest {
public static void main(String[] args) {
//1.boolean equals(int[] a,int[] b):判断两个数组是否相等。
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,3,2,4};
boolean isEquals = Arrays.equals(arr1, arr2);
System.out.println(isEquals);
//2.String toString(int[] a):输出数组信息。
System.out.println(Arrays.toString(arr1));
//3.void fill(int[] a,int val):将指定值填充到数组之中。
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1));
//4.void sort(int[] a):对数组进行排序。
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
//5.int binarySearch(int[] a,int key)
int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
int index = Arrays.binarySearch(arr3, 210);
if(index >= 0){
System.out.println(index);
}else{
System.out.println("未找到");
}
}
}
五、数组使用中的常见异常
/*
* 数组中的常见异常:
* 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
*
* 2. 空指针异常:NullPointerException
*
*/
public class ArrayExceptionTest {
public static void main(String[] args) {
//1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
int[] arr = new int[]{1,2,3,4,5};
// for(int i = 0;i <= arr.length;i++){
// System.out.println(arr[i]);
// }
// System.out.println(arr[-2]);
// System.out.println("hello");
//2.2. 空指针异常:NullPointerException
//情况一:
// int[] arr1 = new int[]{1,2,3};
// arr1 = null;
// System.out.println(arr1[0]);
//情况二:
// int[][] arr2 = new int[4][];
// System.out.println(arr2[0][0]);
//情况三:
String[] arr3 = new String[]{"AA","BB","CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());
}
}