Java数组
一、数组声明创建
1、声明数组:
数组元素类型 数组名[]/[][]
数组元素类型 []/[][]数组名
为数组分配元素:
数组名=new 数组元素类型[数组元素个数]
2、声明和创建一起:
int 数组名[][]=new int[3][4]
表示 3个长度为4的一维数组
数组类型[] 数组名=new 数组元素类型[数组元素个数]
3、获取数组长度:
arrays.length
4、三种初始化
静态初始化
int[] a={1,2,3};
Man[] mans={new Man(1,1),new Man(2,2)} (引用类型)
动态初始化
int a=new int[2];
a[0]=1;
a[1]=2;
数组的默认初始化
数组数引用类型,它的元素相当于类的实例变量,因此数组元素也按照实例变量同样的方式被隐式初始化
二、数组的基本特点
其长度是确定的,一旦创建,长度不可以改变
其元素必须是相同类型
数组中的元素可是任何数据类型,包括基本类型和引用类型
数组变量属于引用类型,数组也可以看成对象,数组中的每个元素1可以看成对象的成员变量
数组本身就是对象,Java中对象是在堆中的,因此无论数组保存原始类型还是其他对象类型,数组对象本身是在堆中的
java内存分析
方法在栈,实例在堆。可以把栈当成书的目录,堆当作内容,位置就是页数。
java.lang.ArrayIndexOutOfBoundsException:10
表示数组下标越界异常
三、数组的使用
1、for-each循环
2、数组作方法入参
打印数组
3、数组作返回值
反转数组
这里的打印数组调用了reverse(),用到了反转数组和打印数组两种方法
四、二维数组
int a[][]=new int[2][5]
可以看成是2行5列的数组或者2个长度为5的一维数组
system.out.print(a[1])
这个输出的只是一维数组的地址值,如果要输出具体值的话,可以调用打印数组的方法
打印数组方法等同于Arrays.toString()
System.out.println(Arrays.toString(a)) 【用Arrays类里面的方法】
system.out.print(a[1][0])
这个就可以输出具体值
五、Arrays类
数组的工具类java.util.Arrays
Arrays类中的方法都是static修饰的静态方法,在使用的时候直接用类名调用,不需要用对象来调用
常用功能:
给数组赋值:通过fill方法
Arrays.fill(a,fromIndex:2,toIndex:4,val:0);填充的只有下标为2和3的,左闭右开
给数组排序:通过sort方法,按升序
比较数组:通过equals方法比较数组中的元素是否相等
查找数组元素:通过binarySearch方法能对以及排序好的数组进行二分查找法操作
六、冒泡排序(八大排序之一)
时间复杂度: n的平方
- 比较数组中相邻的两个元素,如果第一个数比第二个数大,我们就交换他的顺序
- 每一次比较都会产生一个最大或者最小
- 下一轮排序可以少一次排序
- 依次循环,直至结束
如果数组已经有排序好的,可以进行优化,设立flag标识位,减少没必要的比较如下图
七、稀疏数组
当一个数组中大部分元素为0,或者同一值的数组时可以用稀疏数组保存
稀疏数组的处理方式:
记录数组一共有几行几列,有多少个不同值
把具有不同值的元素和行列及值记录在一个小数组里
如下:左边是原始数组,右边是稀疏数组
练习
该题是先创建一个二维数组,获取并输出二维数组,再计算二维数组的有效值个数;然后再创建稀疏数组,并将二维数组转化为稀疏数组输出;最后再创建一个新的二维数组,获取稀疏数组的值后还原数组
该题要注意一下,输出打印稀疏数组时有两种方法。可以用遍历数组的方法,两个for循环;也可以用一个循环
package com.an;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
//创建二维数组
int[][] a = new int[4][4];
a[2][1] = 1;
a[1][0] = 2;
//遍历二维数组
for (int[] ints : a) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
//转化为稀疏数组
//获取有效值个数
int sum = 0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if (a[i][j] != 0) {
sum++;
}
}
}
System.out.println("稀疏数组有效值个数为:" + sum);
//创建稀疏数组
int[][] b = new int[sum + 1][3];
b[0][0] = 4;
b[0][1] = 4;
b[0][2] = sum;
int count = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (a[i][j] != 0) {
count++;
b[count][0] = i;
b[count][1] = j;
b[count][2] = a[i][j];
}
}
}
//输出稀疏数组
System.out.println("输出稀疏数组为:");
//方法一
/for (int[] bints : b) {
for (int bbints : bints) {
System.out.print(bbints + "\t");
}
System.out.println();
}/
//方法二
for(int i=0;i<b.length;i++){
System.out.println(b [i][0]+"\t"+b [i][1]+"\t"+b [i][2]+"\t");
}
System.out.println();
//读取稀疏数组的值
int[][] c=new int[b [0][0]][b [0][1]];
//还原数组的值
for(int i=1;i< b.length;i++){
c [b [i][0]][b [i][1]]=b [i][2];
}
System.out.println("输出还原数组的值:");
for (int[] r : c) {
for (int i : r) {
System.out.print(i+"\t");
}
System.out.println();
}
}
}