Java----数组的定义和使用

1.数组的定义

在Java中,数组是一种相同数据类型的集合。数组在内存中是一段连续的空间

2.数组的创建和初始化

2.1数组的创建

在Java中,数组创建的形式与C语言又所不同。

Java中数组创建的形式

T[] 数组名 = new T[N];

1.T表示数组存放的数据类型。

2.T[]表示数组的类型。

3.N表示数组的长度。

2.2数组的初始化

数组的初始化分为动态初始化静态初始化两种。

2.2.1 动态初始化

动态初始化就是在创建数组的时候,直接指定数组元素的个数。

如以下代码

int[]arr=new int[10];//10就是数组元素个数

2.2.2 静态初始化

静态初始化就是在创建数组的时候不指定数组中元素的个数,但指定数组的内容。

语法格式:

T[] 数组名称=new int[]{data1,data2,data3.....};

举例说明

public static void main(String[] args) {
        int[] arr=new int[]{1,2,3,4,5};
        String[] man=new String[]{"red","man","lebron"};
        double[] arr2=new double[]{1.2,1.2,2.5};
    }

注意事项:

1.在Java中,数组在创建的同时不能同时指定数组的长度和数组的内容。否则就会报错。

public class CSDN {
    public static void main(String[] args) {
        int[] arr=new int[5]{1,2,3,4,5};
        String[] man=new String[4]{"red","man","lebron"};
        double[] arr2=new double[5]{1.2,1.2,2.5};
    }
}

如上面同时所示,同时指定数组的长度和数组的内容就会报错。

2.虽然静态初始化没有指定数组的长度,编译器在编译时会根据 { } 里面的元素来确定数组的长度。

3.静态初始化时,{ } 里面的元素的数据类型必须和数组创建时声明的数据类型相同。

4.静态初始化可以简写,后面的new T[]可以省略掉。

public static void main(String[] args) {
        int[] arr={1,2,3,4,5};
        String[] man={"red","man","lebron"};
        double[] arr2={1.2,1.2,2.5};
    }

2.2.3 总结共同点

动态初始化和静态初始化都可以分两步写。

        //动态初始化分两步
        int[] arr;
        arr=new int[10];
java 复制代码
        //静态初始化分两步写
        int[] arr2;
        arr2=new int[]{1,2,3,4,5,6};

注意:分两步进行初始化时,new T[ ] 这部分不能省略。

2.2.4 补充

1.数组的创建其实可以像C语言那样创立,但是不推荐。

2.如果数组在创建时没有初始化数组的内容,数组中元素都有默认的其对应的零值。如下表

2.3 数组的访问和遍历

2.3.1数组的访问

数组在内存中是一段连续的空间,空间的编号都是从0开始,一次递增。这些编号也就是数组的下标,我们可以通过数组的下标来访问数组中的元素。

比如:

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);

如上面的代码所示,0,1,2,3,4就是数组的下标,我们就通过这些下标来访问数组中对应的元素。

2.3.2 数组的遍历

数组的遍历就是将数组的元素都浏览一遍。

在Java中,我们有两种遍历数组的方法。

重点:在Java中,我们可以通过 数组名.length 来获取数组的长度。

1.for循环遍历数组

public static void main(String[] args) {
        int[] arr=new int[]{1,2,3,4,5};
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }

2.foreach循环

 public static void main(String[] args) {
        int[] arr=new int[]{1,2,3,4,5};
        for(int x:arr){
            System.out.print(x+" ");
        }
    }

foreach循环的做法是遍历数组,一次将数组中的元素放入x中。

3.数组是引用数据类型

3.1JVM的内存分布

在介绍引用数据类型之前,我们先来简单介绍以下JVM的内存分布。

如下图

这里我们就先简单了解一下虚拟机栈和本地方法栈。

本地方法栈:本质是由C/C++构造的一些方法,我们可以直接使用。

虚拟机栈:就是我们平常学习计算机语言说的栈。

3.2引用数据类型

在JAVA中,我们的数据类型分为基本数据类型和基本数据类型。

基本数据类型创建的变量被称为基本变量,其内存中存的是变量的值。

由引用数据类型创建的数据类型一般被称为对象的引用,其空间存储的是对象的地址。

什么是引用呢?

看一下代码

java 复制代码
 public static void main(String[] args) {
        int[] arr=new int[]{1,2,3,4,5};
        System.out.println(arr);
        int a=10;
    }

我们在创建变量的时候,计算机系统都会在栈中为变量开辟内存。

如以上代码,我们创建了一个数组变量和一个int变量,那么栈就会为这两个变量分配内存。

由于int a是基本数据类型,所以创建变量是赋值的10就直接占据了为变量a开辟的内存中。

而数组是引用数据类型, 其内存可以简单理解为寸的是数组的首元素地址。

所以,引用数据类型中存的地址,我们就可以说通过array这个引用来访问数组中的元素。

我么再来看一段代码

java 复制代码
 public static void main(String[] args) {
        int[] arr1=new int[]{1,2,3,4,5};
        arr1[0]=3;
        arr1[1]=4;
        int[] arr2=new int[]{10,20,30,40,50};
        arr2=arr1;
        arr1[0]=100;
        arr2[1]=200;
        for(int x:arr2){
            System.out.print(x+" ");
        }
    }

输出会是什么呢?

我们通过画图来分析代码

首先,我们创建了arr1数组。

我们就可以通过arr1这个引用来访问数组中的元素。接着我们对arr1进行了数组元素中的改变。

接着我们又创建了arr2。

我们就可以通过arr2这个引用来访问arr2中的数据。

接着就是一个重点了,我们写了一个 arr2=arr1 的代码是什么意思呢?

简单来说就是将arr1中存储的地址传给arr2,arr2中存的数据就变为了0x9了。

那样arr2就不指向arr2了,而是指向了arr1。

这时侯,我们我们同过arr1或arr2这两个引用访问的都是arr1了。

而原先arr2指向的对象由于没有了引用,其在堆占的内存就自动被计算机系统回收了。

所以最后两步都是对arr1数组数据的改变。

运行代码

4. 二维数组

4.1二维数组的创建和初始化

二维数组的创建和初始化我们直接以代码的形式介绍

java 复制代码
public static void main(String[] args) {
        int[][] arr1=new int[][]{{1,2,3},{4,5,6}};
        int[][] arr2=new int[2][3];
        int[][] arr3={{1,2,3},{1,2,3}};
    }

主要有以上三种形式。

4.2 二维数组的遍历

首先,我们要清楚二维数组是一个特殊的一维数组。

Java中这个定义很清楚。

我们以arr1为例。

如下图所示

arr1是一个2行3列的数组,这个二维数组可以看作是有两个一维数组组成的。

其中arr1[0] 是访问arr1这个二维数组中第一个一维数组中的引用。

arr1[1]是访问arr1这个二维数组中的第二个一维数组的引用。

第一种遍历方法

java 复制代码
  public static void main(String[] args) {
        int[][] arr1=new int[][]{{1,2,3},{4,5,6}};
        int[][] arr2=new int[2][3];
        int[][] arr3={{1,2,3},{1,2,3}};
        for(int i=0;i<arr1.length;i++){
            //打印行
            for(int j=0;j<arr1[i].length;j++){
                //打印列
                System.out.print(arr1[i][j]+" ");
            }
            System.out.println();
        }
    }

第二种遍历方法

java 复制代码
 public static void main(String[] args) {
        int[][] arr1=new int[][]{{1,2,3},{4,5,6}};
        int[][] arr2=new int[2][3];
        int[][] arr3={{1,2,3},{1,2,3}};
        for(int[] subarr1:arr1){
            for(int x:subarr1){
                System.out.print(x+" ");
            }
            System.out.println();
        }
}

4.3 不规则二维数组

首先,我们要知道二维数组在创建的时候,行不可以省略,列可以省略。

java 复制代码
 public static void main(String[] args) {
        int arr[][]=new int[2][];
        arr[0]=new int[]{1,2,3};
        arr[1]=new int[]{4,5,6,70};
        for(int i=0;i< arr.length;i++){
            for(int j=0;j<arr[i].length;j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }

运行代码

相关推荐
Ajiang282473530439 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空44 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024066 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it6 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神7 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海7 小时前
scala String
大数据·开发语言·scala