数组
数组概述
数组的介绍:数组是最为常见的一种数据结构。是相同类型的,用一个标识符封装到一起的基本类型数据序列或对象序列。可以用一个统一的的数组名和下标来唯一确定数组中的元素。实质上,数组是一个简单的线性序列。因此访问速度很快。
数组概述
(1)数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
(2)创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
(3)数组的长度一旦确定,就不能修改。
(4)我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
(5)数组的分类:
a: 按照维度:一维数组、二维数组、三维数组、…
b: 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
一维数组的创建和使用
一维数组的声明方式:
数组元素类型 数组名字[];
数组元素类型[] 数组名字;
实例:
int arr[] 声明int型数组,数组中的每个元素都是int类型
String str[] 声明 String 数组,数组中的每个元素都是String类型
Java语言中声明数组时不能指定其长度(数组中元素的数),
例如:
int a[5]; //这种方式是违规的
一维数组的使用:初始化
动态初始化 :数组声明且为数组元素分配空间与赋值的操作分开进行
举例:
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
静态初始化 :在定义数组的同时就为数组元素分配空间并赋值。
举例:
int arr[] = new int[]{ 1,2,3};
或int[] arr = {1,2,3};
一维数组的使用:数组元素的引用
(1)定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
(2)数组元素的引用方式:数组名[数组元素下标]
a: 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
b:数组元素下标从0开始;
长度为n的数组合法下标取值范围: 0 —>n-1;
如int a[]=new int[3];
可引用的数组元素为a[0]、a[1]、a[2]
每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)
注意数组一旦初始化,其长度是不可变的
一维数组的练习举例:
//求出一个同学十门成绩的最高分,最低分,平均分、分数总和;
import java.util.Scanner;
public class Work1 {
public static void main(String[] args) {
int [] arr = new int[10];
Scanner sc = new Scanner(System.in);
for(int i = 0; i< arr.length;i++){
System.out.println("请录入第"+(i+1)+"门课程的成绩:");
arr[i] = sc.nextInt();
}
//最高分
int max = arr[0];
for(int j = 1;j<arr.length;j++){
if (max < arr[j]){
max = arr[j];
}
}
System.out.println("最高分为:"+max);
//最低分
int min = arr[arr.length-1];
for(int k = 1;k<arr.length;k++){
if (min > arr[k]){
min = arr[k];
}
}
System.out.println("最低分为:"+min);
//分数总和
int sum = 0;
for(int m = 0; m<arr.length;m++){
sum += arr[m];
}
//平均分
double avg = (sum - max - min)/10.0;
System.out.println("平均分为:"+avg);
}
}
二位数组的创建与使用
二维数组的创建
二维数组可以看做是特殊的一维数组,
先声明,再用new 运算符进行内存分配
语法如下:
数组元素的类型 数组名字[][]
数组元素的类型[][] 数组名字
实例代码
int arr[][]
二维数组初始化
二维数组的初始化与一位数组的初始化类似,同样可以用大括号完成。
type arr[][]={value1,value2,value3....}
type:数组数据类型
arr:数组名称
value:数组中个元素的值
实例:
int arr[][]={{12,0},{45,10}};
初始化二维数组后,要明确数组的下标都是从0开始的。
int型二维数组是以int a[][]来定义的,所以可以直接给a[x][y]赋值;
例:a[1][1]=20
使用二维数组
实例:
输出一个3行4列且所有元素都为0的矩阵
public class Work{
public static void main(String[])args{
int a[][] = new int[3][4];
for(int i = 0;i<a.length;i++){
for(int j = 0;i<a[i].length;j++){
System.out.print(a[i][j]);
}
System.out.print()
}
}
}
格式1 (动态初始化): int[][] arr = new int[3][2];
定义了名称为arr的二维数组
二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0], arr[1], arr[2]
给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2 (动态初始化): 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]; //非法
格式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;
遍历数组
遍历数组是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。
遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度
实例:
定义二维数组,实现将二维数组中的元素呈梯形输出。
public class Bubble{
public static void main(String[] args){
int b[][] = new int[][] {{1},{2,3},{4,5,6}};
for(int k = 0;k<b.length;k++) {
for(int c = 0;c<b[k].length;c++) {
System.out.print(b[k][c]);
}
System.out.print(""+"\n");
}
}
}
在遍历数组时,使用foreach语句会更加简单,下面的实例就是通过foreach语句遍历二维数组。
public class Bubble{ //创建类
public static void main(String[] args){ //主方法
int arr[][] = {{4,3},{1,2}} ; //定义二维数组
System.out.println("数组中的元素是:"); //提示信息
int i = 0; //外层循环计数器变量
for(int x[] : arr) { //外层循环变量为一维数组
i++; //外层循环计数器递增
int j = 0; //内层循环计数器
for(int e : x) { //循环遍历每一个数组元素
j++; //内层计数器递增
if(i == arr.length && j == x.length) { //判断变量是二维数组中的最后一个元素
System.out.println(e); //输出二维数组的最后一个元素
}else {
//如果不是二维数组中的最后一个元素
System.out.println(e+"、"); //输出信息
}
}
}
}
}
复制数组
Arrays类的coopOf()方法与copyOfRange()方法可以实现对数组的复制。
coopOf()方法:复制数组至指定长度
copyOfRange()方法:将指定数组的指定长度复制到一个新数组中。
copyOf方法
语法格式:
copyOf(arr,int newlength)
arr:要进行复制的数组
newlength:int型常量,指复制后的新数组的长度,如果新数组的长度大于数组arr的长度,则用0来填充;
如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。
代码实例:
import java.util.Arrays;
public class Copy{
public static void main(String[] args){
int arr[]= new int[]{23,42.12};
int newarr[] = Arrays.copyOf(arr,5); //复制数组arr
for(int i = 0;i< newarr.length;i++){ //循环遍历复制后的新数组
System.out.println(newarr[i]);
}
}
}
copyOfRange()方法
语法格式
copyOfRange(arr,int formindex,int toIndex)
arr:要进行复制的数组对象
formIndex:指定开始复制数组的索引位置。
toIndex:要复制范围的最后索引位置
代码实例:
import java.util.Arrays;
public class Repeat {
public static void main(String[] args) {
int arr[] = new int[] {23,42,12,84,10};
int newarr[] = Arrays.copyOfRange(arr, 0, 3);
for (int i = 0; i < newarr.length; i++) { //循环遍历复制后的新数组
System.out.println(newarr[i]);
}
}
}