数组的定义与使用

一、数组的基本概念

1.数组的概念

在Java中,数组也是一类元素的集合,但是与C语言不同的是数组存放变量不依赖指针,而是引用变量,数组就是一个引用类型的变量(后面细说)

2.数组的定义和初始化

数组创建的格式为:

数据类型+[]+数组名 = new+数据类型+[数组长度];

这两个数据类型必须一致。

例如:创建一个数组

java 复制代码
public class Test {
    public static void main(String[] args) {
        //静态初始化
        int[] arr1 = {1,2,3,4,5,6,7,8,9,10};
        int[] arr2 = new int[]{1,2,3,4,5,6,7,8,9,10};
        //动态初始化
        int[] arr3 = new int[10];
    }
}

上述就是数组创建及初始化的三种方式,其中动态初始化就是指只给定了数组长度,没有给定具体内容,不过也可以像C语言一样int arr[]={...}这样初始化,不推荐这样写,因为这合法不合理。

注:数组初始化之后就不能再次初始化了,换言之,数组只有一次初始化的机会。

默认初始化

如果一个数组创建出来之后没有进行任何初始化和赋值操作,那么Java会有一个默认值,不同类型的数组其默认值也不同。

二、数组的使用

1.数组中元素访问

数组在内存中是一段连续的空间,数组名中存放的是第一个对象的地址,相当于首元素地址。

例如:

java 复制代码
public class Test {
    public static void main(String[] args) {
        //静态初始化
        int[] arr1 = {1,2,3,4,5,6,7,8,9,10};
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);
        System.out.println(arr1[3]);
        System.out.println(arr1[6]);
    }
}

2.遍历数组

遍历数组的方法和C语言一样,都可以利用while、do while和for三种循环语句遍历。

例如:

java 复制代码
public class Test {
    public static void main(String[] args) {
        //静态初始化
        int[] arr1 = new int[10];
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = i;
        }
        for (int j = 0; j < arr1.length; j++) {
            System.out.print(arr1[j] + " ");
        }
        System.out.println();
    }
}

三、数组是引用类型

1.初始JVM的内存分布

内存是一段连续的存储空间,主要存放程序运行时的数据

Java虚拟机运行时数据区:

  • 程序计数器 **:**保存下一条执行的指令的地址;

  • 虚拟机 **栈:**每个方法在执行时都要先创建一个栈帧,栈帧中包含局部变量表、操作数栈、动态链接、返回地址等,当方法运行结束后,栈帧就被销毁了,栈帧中的数据也就被销毁了;

  • **堆:**new所创建的对象都在堆中,堆随着程序开始运行而创建,程序退出则销毁,堆中的数据只要还在使用,就不会被销毁;

  • **方法区:**存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.基本类型变量和引用类型变量的区别

基本类型变量存放的是具体的数据,而引用类型变量存放的是引用对象的地址,一般称作对象的引用。

比如有一个代码

java 复制代码
public class Test(){
      public static void main(String[]args){
             int a = 10;
             int b = 20;
             int[] arr = new int[3];
      }
}

它的各个变量在内存中分布情况:

null在Java中表示空引用,即这个引用变量不指向任何对象,null的作用类似于C语言的NULL指针,都是表示一个无效的内存空间,如果强行引用则会报错,不过null与0号地址没有关系。

四、数组的应用场景

1.保存数据

数组可以通过for循环或初始化时存放数据。

2.作为函数的参数

数组也可以在方法中作为形参和实参进行传递,在传参时,如果将数组作为实参,那么形参改变实参也会跟着改变。

引用变量本质上就是一个存放地址的变量,.Java将其设置为引用类型,这样在进行传参的时候,传给形参的就是第一个对象的地址,这样就避免了对整个数组的拷贝,有效的节省了空间。

3.作为函数的返回值

数组还可以作为数组的返回值。

例如:斐波那契数列的第n项

java 复制代码
public class Math {
    //获取前n像斐波那契数
    public static int[] math(int n) {
        if (n <= 0) {
            return null;
        }

        int[] array = new int[n];
        array[0] = array[1] = 1;
        for (int i = 2; i < n; ++i) {
            array[i] = array[i - 1] + array[i - 2];
        }

        return array;
    }

    public static void main(String[] args) {
        int[] array = math(10);
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

五、二维数组

二维数组本质上也是一维数组,存放的是内容是一维数组,二维数组的用法和一维数组没有太大差别,而且还存在三维数组和四维数组,只不过出现频率都很低。

相关推荐
IT学长编程17 分钟前
计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·python·django·毕业设计·课程设计·毕业论文
ゞ 正在缓冲99%…44 分钟前
leetcode1312.让字符串成为回文串的最少插入次数
数据结构·算法·leetcode·动态规划·记忆化搜索
Ashlee_code1 小时前
什么是TRS收益互换与场外个股期权:从金融逻辑到系统开发实践
大数据·人工智能·python·金融·系统架构·清算·柜台
今天没有盐1 小时前
Python编程实战:日期处理与数学算法综合练习
python·pycharm·编程语言
七夜zippoe1 小时前
Rust `std::iter` 深度解析:`Iterator` Trait、适配器与性能
开发语言·算法·rust
寂静山林1 小时前
UVa 1464 Traffic Real Time Query System
算法
laocooon5238578861 小时前
寻找使a×b=c成立的最小进制数(2-16进制)
数据结构·算法
YY_TJJ2 小时前
算法题——图论
算法·深度优先·图论
默默的流星雨2 小时前
TARJAN相关
c++·算法·深度优先·图论
宸津-代码粉碎机2 小时前
Java内部类内存泄露深度解析:原理、场景与根治方案(附GC引用链分析)
java·开发语言·jvm·人工智能·python