IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 三、Java 数组 -> 正文阅读

[数据结构与算法]三、Java 数组

三、Java 数组

数组是编程语言中常见的一种数据结构,用于存储多个数据,每个数组元素存放一个元素,通常可通过数组元素的索引来访问数组元素,访问包括维数组元素赋值和取出数组元素的值。

3.1理解数组——数组也是一种类型

  • Java 的数组要求所有数组元素具有相同的数据类型,即一个数组中只能存储一种数据类型的数据
  • 一旦数组的初始化完成,数组在内存中所占的空间将被固定下来。
  • Java 数组既可以存储基本类型的数据,也可以存储引用类型的数据
  • 数组也是一种数据类型,它本身就是一种引用类型,例 int 是一个基本类型,但 int[] 就是一种引用类型。

3.2定义数组

Java 语言支持两种语法格式来定义数组:
type [] arrayName;		//通常使用第一个
type arrayName[];		//二者的区别在于可读性上,前者具有更好的可读性。
数组是一种引用类型的变量,在使用数组**定义一个变量时,仅仅表示定义了一个引用变量**(在这里可以理解为指针),这个引用变量还**未指向任何有效的内存**,**因此定义数组时不能指定数组长度。**由于没有指向任何有效的内存空间(**相当于这个数组还没有分配内存)**,因此这个数组还不能使用,**只有对数组初始化后才能使用。**

3.3数组的初始化

继续上文,数组初始化后才能使用,而初始化就是**为数组的元素分配内存,并为每个数组元素赋初始值。**

初始化有两种方式:

3.3.1静态初始化

初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。

//数组的定义、赋值和输出    
public static void main(String[] args) {
        //定义一个int数组类型的变量,变量名为intArr
        int [] intArr;
        intArr = new int[]{1,2,3,4};
        //下面是简化写法,数组定义和初始化同时完成
        int [] a = {1,2,3,4};
        //直接输出数组,输出的结果是该数组的起始地址
        System.out.println(intArr);
        //可以使用Arrays类中的toString方法将数组中的元素转换成String类型进行输出
        System.out.println(Arrays.toString(intArr));
        //也可以通过循环和数组依次输出数组的对应下标的元素,从而达到输出数组的目的
        System.out.println(a[0]);
    }
/*res:
[I@74a14482
[1, 2, 3, 4]
1

3.3.2动态初始化

初始化时程序员只指定数组长度,由系统给数组元素分配初始值。

  • 系统有如下规则来进行元素分配初始值:
  • 数组元素类型是基本类型中的整数类型(byte、short、int 和 long),则数组元素的值是 0;
  • 数组元素类型是基本类型中的浮点类型(float、double),则数组元素的值是 0.0;
  • 数组元素类型是基本类型中的字符类型 (char),则数组元素的值是‘\u0000’;
  • 数组元素类型是基本类型中的布尔类型(boolean),则数组元素的值是 false ;
  • 数组元素类型是引用类型(类、接口和数组),则数组元素的值是 null 。
//动态初始化   
public static void main(String[] args) {
    //分别定义四种不同类型的数组,看一下系统赋给不同类型的数组的初始值都是哪些
        int [] a = new int[5];
        float [] b = new float[5];
        char [] c = new char[5];
        boolean [] d = new boolean[5];
        System.out.println(a[0]);
        System.out.println(b[0]);
        System.out.println(c[0]);
        System.out.println(d[0]);
    }

res:

在 Idea 中输出char类型数组的初始值,显示为乱码,在这里猜测的原因可能是 Idea不支持 Unicode 编码的原因( ‘\u0000’ 是属于 Unicode 编码)。

3.4使用数组

数组使用最常用的是**访问数组元素**,在 Java 语言中数组索引是从 0 开始的,即,第一个数组元素索引值为 0,最后一个元素索引值为数组长度减 1。**如果访问数组元素索引值小于0,或者大于等于数组长度**,**编译程序不会出现任何错误,但运行时会出现异常。**代码如下:
    public static void main(String[] args) {
        int [] a = new int[]{1,2,3,4};
        //输出这个数组的第二个元素
        System.out.println(a[1]);
        //以下两个输出都会触发程序异常
        //System.out.println(a[5]);
        System.out.println(a[-1]);
    }
/*res:
2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5

3.5 foreach 循环

除了使用 for 循环和 Arrays 类通过转换为 String 类型输出数组,在这里还有一种更简单的循环,foreach 循环;使用 foreach 循环遍历数组和集合元素时,无须获得其长度,无须根据索引来访问元素。代码如下:
    public static void main(String[] args) {
        String [] a = new String[]{"BGR的","foreach","测试"};
        //foreach 在遍历的时候,将数组元素交给 i 这个临时变量,通过输出临时变量达到输出数组的目的
        for (String i :a)
        {
            System.out.println(i);
        }
    }
/*res:
BGR的
foreach
测试

3.6深入数组——(内存中的数组)

数组在前面已经介绍过了是一种引用数据类型,数组引用变量只是一个引用,**数组元素和数组变量在内存中是分开存放的。**下面将介绍数组在内存中的运行机制。
  1. 数组引用变量只是一个引用,这个引用变量可指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。

  2. 实际的数组对象被存储在堆(heap)内存中;如果引用该数组对象的数组引用变量是一个局部变量那么它被存储在栈(stack)内存中。
    在这里插入图片描述

  3. 而我们则通过 p[index] 的形式实现访问存储在堆内存中的数组元素。

  4. 如果堆内存中的数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占内存将被 Java 的垃圾回收机制回收。

接下来给大家看一个数组长度可以改变的假象:

java
 public static void main(String[] args) {
        // 分别使用动、静态初始化并定义数组
        int [] a ={5,7,20};
        int [] b = new int[4];
        //输出a、b数组长度为了和后面对比
        System.out.println("a数组的长度为:"+a.length);
        System.out.println("b数组的长度为:"+b.length);
        //分别遍历a、b数组
        for (int i: a) {
            System.out.print(i+" ");
        }
        System.out.println();
        for (int i: b) {
            System.out.print(i+" ");
        }
        System.out.println();
        //将a赋给b
        b = a;
        //此时发现b数组的长度变成a数组的长度了
        System.out.println("b数组的长度为:"+b.length);
     	//最后看一下b数组各个元素的值
        for (int i: b) {
            System.out.print(i+" ");
        }
    }
/*res:
a数组的长度为:3
b数组的长度为:4
5 7 20 
0 0 0 0 
b数组的长度为:3
5 7 20

读者需要牢记这个规则:定义并初始化一个数组后,会在内存中分配两个空间,一个用于存放数组的引用变量,另一个存放数组本身

在这里插入图片描述

如图可以看出,当执行 b = a 后,堆内存中第一个数组具有两个引用a 变量和 b 变量都引用了第一个数组。**此时第二个数组失去引用变成垃圾,**等待垃圾回收机制进行回收。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:25:52  更:2022-03-17 22:29:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:38:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码