java数组及其特性

24 阅读3分钟

数组的定义

  • 创建语法<类型>[] <数组名> = new <类型>[长度];
//创建int类型可以存放10个整型的空数组
int[] numbers = new int[10];

//已经知道要存多少数据了 
int[] number = new int[]{1, 2, 3, 4, 5};
  • 数组的存(改)与取
//存 
number[0] = 6; 
//取 
int i = number[1];
  • 取数组长度
//number为数组
number.length
  • 数组的长度可以是一个程序员定义的变量,也可以是用户输入的常数,但当运行到数组定义的语句时变量值必须已知,如:运行到int[] numbers = new int[value];value必须已经确定值,int[] numbers = new int[scanner.nextInt()];scanner.nextInt()必须接收用户输入的有效值,且运行完该行语句后,数组的长度就此确认,后续变量发生改变,不会影响到之前创建的数组的长度。
int value = 5;
int[] numbers = new int[value];
int[] numbers = new int[scanner.nextInt()];//用户输入要为整型
  • 同理对于int[] number = new int[]{1, 2, 3, 4, 5};,也可以使用变量给数组进行赋值,但运行到该行语句时,变量值必须是已知的如下方代码:
int value = 5
int[] number = new int[]{1, 2, 3, 4, value};
System.out.println(number[4]);//5
int[] number = new int[]{1, 2, 3, 4, scanner.nextInt()};//用户输入5
System.out.println(number[4]);//5
  • 数组是引用型数据,数组名是数据存放所在地址不可通过赋值数组名的方式创建新数组,又因为数组名是数据所存放的地址,所有即使两数组存放的数据内容完全相同,也不可用数组名进行比较两数组是否相同,因为数组名实际上数组数据存放是地址,既然是两个数组,那么数据存放在的地址自然是不同的
  • 复制数组可以可以使用如下算法:
int[] number = new int[]{1,2,3,4,5};  
int[] number1 = new int[number.length];  
for(int i = 0; i< number1.length; i++){  
    number1[i] = number[i];  
}

每次写算法也比较麻烦java也为我们提供了内置函数

 public static void main(String[] args){
    int[] sourceArray = {1,2,4,5};

     //内置类Arrays的内置函数copyOfRange ———— 指定范围并复制数组
    int[] destinationArray = Array.copyOfRange(sourceArry,1,4);
    //copyOfRange(数组的引用,起始索引,终止索引)
 }
  • 判断两数组是否相同可以使用如下算法:
int[] number0 = new int[]{1,2,3,4,5};  
int[] number1 = new int[]{1,2,3,4,5};  
boolean isEquals = true;  
if (number0.length == number1.length){  
    for (int i = 0; i < number0.length;i++){  
        if (number0[i] != number1[i]){  
            isEquals = false;  
            break;  
        }  
    }  
}  
if(isEquals){  
    System.out.println("相同");  
}else{  
    System.out.println("不相同");  
}

每次写算法也比较麻烦java也为我们提供了内置函数

int[] number0 = new int[]{1,2,3,4,5};  
int[] number1 = new int[]{1,2,3,4,5};  
boolean isEquals = Arrays.equals(number1,number0);  
if(isEquals){  
    System.out.println("相同");  
}else{  
    System.out.println("不相同");  
}

数组内存分布

引用数据类型.png

  • 从图片就可以看出来,数组是引用数据类型,当我们使用直接赋值其他数组的名字(引用)的时候就会出现如下图所示的现象,两个引用指向了同一块内存,这种做法是极其危险的,因为你很难预料到,你修改其中一个数组会不会影响的另一个数组: 引用数据类型2.png

多维数组

  • 创建<类型>[][] <数组名> = new <类型>[行][列];
int[] numbers = new int[2][5];
int[][] number3 = new int[][]{
		{1, 2, 3, 4, 5}, 
		{6, 7, 8, 9, 10}, 
		{11, 12, 13, 14, 16}, 
		{11, 12, 13, 14, 15},
};
  • 取(改)存
//存 
number[0][2] = 6; //取 
int i = number[1][3];

//循环遍历二位数组 
for (int i = 0; i < number3.length; i++) { 
	for (int j = 0; j < number3[i].length; j++) { 
		System.out.println(number3[i][j]); 
	} 
}