Java数组
数组
数组的定义
-
数组是相同类型数据的有序集合
-
数组描述的是相同的若干个数据,按照一定的先后次序排列组合而成
-
其中,每一个数组称作一个数组元素,每个数组元素可以通过一个下标来访问他们
-
数组的下标是从0开始的
数组的声明创建
-
首先必须声明数组变量,才能在程序中使用数组,下面是声明数组变量的语法
dataType[] arrayRefVar;// 首选的方法
dataType arrayRefVar[];// 不是首选的方法 -
Java语言中使用new操作,来创建数组,语法如下
dataType[] arrayRefVar = new dataTyoe[arraySize]; -
数组的元素是通过索引访问的,数组索引是从 0 开始的
-
用 .length 来获取数组的长度
-
如果不对数组里面赋值的话则是默认值int 的默认值就是0
DEMO
public class Demo01 {
// 变量的类型 变量的名字 = 变量的值
//数组类型
public static void main(String[] args) {
int[] nums;//1.声明了一个数组
nums = new int[10];//2.创建一个数组 这里面可以存放十个int类型的数字
int[] ints = new int[10];//也可以声明创建一起来做
//3.给数组元素中赋值
nums[0]=1;
nums[1]=2;
nums[2]=3;
nums[3]=4;
nums[4]=5;
nums[5]=6;
nums[6]=7;
nums[7]=8;
nums[8]=9;
nums[9]=10;
System.out.println(nums[9]);
//计算所有元素的和
int sum=0;
//获取数组长度 arrays。length
for (int i = 0; i < nums.length; i++) {
sum = sum + nums[i];
}
System.out.println("总和为:"+sum);
}
}
数组的三种初始化
-
静态初始化
-
动态初始化
-
数组的默认值初始化
-
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量的方式被隐式初始化
public class Demo02 {
public static void main(String[] args) {
//静态初始化:创建加赋值
int[] a = {1, 2, 3, 4, 5, 6};
System.out.println(a[0]);
//动态初始化:包含默认初始化
int[] b = new int[10];
b[0] = 10;
System.out.println(b[0]);
System.out.println(b[1]);
}
} -
数组的四个基本特点
-
其长度是确定的,数组一旦被创建,它的大小就是不可以改变的
-
其元素必须是相同类型,不允许出现混合类型
-
数组中的元素可以是任何数据类型,包括基本类型和引用类型
-
数组的变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量,数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型数组对象本身是在堆中
数组的边界
-
下标的合法区间:[0,length - 1],如果越界就会报错
public static void main(String[] args){
int[] a = new int[2];//创建了有两个空间的数组
System.out.println(a[2]);//下标越界
} -
ArraylndexOutOfBoundsException : 数组下标越界异常!
-
小结:
-
数组是相同数据类型(数据类型可以为任意类型)的有序集合
-
数组也是对象。数组元素相当于对象的成员变量
-
数组的长度确定,不可改变的,如果越界,则报:ArraylndexOutOfBoundsException
-
数组的使用
-
普通for循环使用
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
//打印全部的元素
for (int i=0;i<arrays.length;i++){
System.out.println(arrays[i]);
}
//计算所有元素的总和
int sum = 0;
for (int a=0;a<arrays.length;a++){
sum = sum + arrays[a];
}
System.out.println(sum);
//查找最大元素
int b = 0;
for (int i=0;i<arrays.length;i++){
if (b>arrays[i]){
b = b;
}else{
b = arrays[i];
}
}
System.out.println(b);
}
} -
for-Each 循环
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
//JDK1.5,没有下标
//for-each 循环使用 增强型的for循环
for (int array : arrays) {
//int array 数组中的每一个元素 arrays数组
System.out.println(array);
}
}
这个没有下标适合打印输出要使用下标的话这个就不合适了这个取不到下标
-
数组做方法参入
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
printarry(arrays);
}
//打印数组元素 数组做方法如参
public static void printarry(int[] arrys){
for (int i = 0; i < arrys.length; i++) {
System.out.print(arrys[i]+" ");
}
} -
数组作返回值
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
int[] ints = fanZhuan(arrays);
//打印输入数组ints
for{int i =0;i<ints.length,i++}{
System.out.print(ints[i]);
}
}
//反转数组 数组做返回值入惨
public static int[] fanZhuan(int[] array){
int[] b = new int[array.length];
for (int i = 0,j=array.length-1; i <array.length ; i++,j--) {
b[i] = array[j];
}
return b;
}
}
多维数组
-
多为数组额可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组堆
-
二维数组:
int a[][] = new int [4][2] -
解析:以上数组a可以看成一个四行两列的一个数组
public static void main(String[] args) {
//二维数组
int[][] array = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
/*
1, 2 array[0] 1 array[0][0]
2 array[0][1]
2, 3 array[1] 2 array[1][0]
3 array[1][1]
3, 4 array[2] 3 array[2][0]
4 array[2][1]
4, 5 array[3] 4 array[3][0]
5 array[3][1]
*/
printarry(array[0]);//用方法打印出数组
erWei(array);//打印二维数组
}
//打印数组元素 数组做方法如参
public static void printarry(int[] arrys){
for (int i = 0; i < arrys.length; i++) {
System.out.println(arrys[i]);
}
}
//打印二位数组
public static void erWei(int [][] ace){
for (int i = 0; i <ace.length ; i++) {
for (int j = 0; j <ace[j].length ; j++) {
System.out.print(ace[i][j]+" ");
}
System.out.println();
}
}
-
二维数组如此其他的多维数组继续往里面嵌套就可以不过一般二维数组就够使用了
Arrays 类
-
数组的工具类java.util.Arrays
-
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作
-
查看JDK帮助文档
-
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而不用使用对象来调用
-
常用的功能
-
给数组赋值:通过fill方法
Arrays.fill(a,0);//a为数组 0为要给里面赋的值 -
打印数组:通过toString方法
System.out.println(Arrays.toString(a));//a为数组 -
对数组进行排序:通过sort方法,按升序
Arrays.sort(a);//a为数组当然这些方法我们也可以自己写,不过它有我们直接用就好避免造车轮
-
public class Demo06 {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 8987, 45677, 1234, 23, 5};
System.out.println(a);//[I@4554619c
//打印数组元素
System.out.println(Arrays.toString(a));//Arrays.toString 打印数组 java自带工具类
dayin(a);//自己写的
//排序
Arrays.sort(a);//数组进行排序 Arrays.sort java自带工具类 升序排序
System.out.println(Arrays.toString(a));
Arrays.fill(a,0);//对数组进行赋值 java自带工具类 升序排序
System.out.println(Arrays.toString(a));
}
//打印数组的方法
public static void dayin(int [] a){
System.out.print("[");
for (int i = 0; i <a.length ; i++) {
if (i==a.length-1){
System.out.print(a[i]);
}else{
System.out.print(a[i]+","+" ");
}
}
System.out.println("]");
}
}
拓展稀疏数组
稀疏数组介绍
-
当一个数组中大部分元素为零时,或者作为同一值时,可以使用稀疏数组来保存该数组
-
稀疏数组的处理方式是
-
记录一组数一共有几行几列,有多少个不同值
-
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
-
-
如图下
原始数组
0 0 0 1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0稀疏数组
11 11 3 11行 11列 3个有效值
0 3 1 0行 3列 有效值为 1
1 0 2 1行 0列 有效值为2
3 4 2 3行 4列 有效值为2 -
这个就是稀疏数组第一行是表示原始数组的有几行,几列,几个有效值。下面的就是对应的坐标
我们来编写并还原一下上面的原始数组与稀疏数组
public class Demo08 {
public static void main(String[] args) {
//创建原始数组并赋值
int[][] array1 = new int[11][11];
array1[0][3] = 1;
array1[1][0] = 2;
array1[3][4] = 2;
System.out.println("原始数组");
//用自写方法输出数组
max(array1);
System.out.println("====================");
//稀疏数组
System.out.println("稀疏数组");
int sum1=0;
//得到稀疏数组的有效值
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
sum1++;
}
}
}
System.out.println("稀疏数组的有效值为:"+sum1);
//创建稀疏数组,它的行数为有效值+1,它的列数永远只有三列,并对第一行赋值
int[][] array2 = new int[sum1 + 1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum1;
//对稀疏数组其他行赋值
int sum2 = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1.length; j++) {
if (array1[i][j]!=0){
sum2++;
array2[sum2][0] = i;
array2[sum2][1] = j;
array2[sum2][2] =array1[i][j];
}
}
}
//输出数组
max(array2);
System.out.println("========================");
//还原稀疏数组
System.out.println("还原稀疏数组");
//定义原始数组有几行几列
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//有效值进行赋值
for (int i =
