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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 第六章 JavaSE专题之数组&内存空间详述 -> 正文阅读

[数据结构与算法]第六章 JavaSE专题之数组&内存空间详述

1、数组基础

1.1、数组概述
  • 数组:存放多个同一类型的数据,是引用数据类型
  • 范例
public class hello{
    public static void main(String[] args){
        double[] n1 = {1,2.3,3,4,5};
        // 打印数组地址
        System.out.println(n1);
        // 打印数组元素
        for(int i=0;i<n1.length;i++){
            System.out.println(n1[i]);
        }
    }
}
  • 运行结果

在这里插入图片描述

1.2、数组特点

(1)引用数据类型;
(2)数组中的多个数据,类型必须统一;
(3)数组长度在程序运行期间不可改变。

2、数组初始化

  • 数组长度:数组一定是有长度的,可自动推断
2.1、动态初始化
  • 动态初始化:指定数组长度
数据类型[] 数组名 = new 数据类型[大小]
  • 范例
public class hello{
    public static void main(String[] args){
        double[] n1 = new double[3];
        n1[0] = 1;
        n1[1] = 12;
        n1[2] = 13;

        // 打印数组地址
        System.out.println(n1);
        // 打印数组元素
        for(int i=0;i<n1.length;i++){
            System.out.println(n1[i]);
        }
    }
}
  • 运行结果

在这里插入图片描述

2.2、静态初始化
  • 静态初始化
数据类型[] 数组名 = {元素值1,元素值2,......,元素值3}
  • 范例
public class hello{
    public static void main(String[] args){
        double[] n1 = {1,2,3};
        // 打印数组地址
        System.out.println(n1);
        // 打印数组元素
        for(int i=0;i<n1.length;i++){
            System.out.println(n1[i]);
        }
    }
}
  • 运行结果

在这里插入图片描述

2.3、注意事项

(1)静态初始化没有指定长度,但可以自动推断出长度;
(2)静态和动态初始化可拆分为两个步骤;

int[] array4;
array4 = new int[10];

double[] array6;
array6 = new double[]{1,2,1.1};

(3)省略静态初始化不可拆分两个步骤。

2.4、数组动态初始化的默认值
  • 数组初始值:动态初始化数组中的元素自动拥有一个默认值

(1)整数类型,默认为0;
(2)浮点类型,默认为0.0;
(3)字符类型,默认为’\u0000‘;
(4)布尔类型,默认为false;
(5)引用类型,默认为null。

  • 数组一旦创建,程序运行期间,长度不可改变;

在这里插入图片描述

3、数组的赋值机制

3.1、基本类型&数组赋值机制
  • 基本数据类型赋值:这个值就是具体的数据,而且互相不影响;

  • 数组类型赋值:引用传递,赋的值是数组地址。

  • 范例

public class hello{
    public static void main(String[] args){
        // 1、基本数据类型赋值
        int n1 = 1;
        int n2 = 2;
        n2 = 3;
        System.out.println(n1);
        System.out.println(n2);

        // 2、数组赋值
        int[] arr1 = {1,2,3};
        int[] arr2 = arr1;
        arr2[0] = 99;
        System.out.println("----打印arr1的值----");
        for( int i=0;i<arr1.length;i++){
            System.out.println(arr1[i]);
        }
        System.out.println("----打印arr2的值----");
        for( int i=0;i<arr2.length;i++){
            System.out.println(arr2[i]);
        }
    }
}
  • 运行结果

在这里插入图片描述

(2)基本类型&数组赋值存储空间解析

  • 基本类型赋值存储空间解析:值拷贝不会影响。

在这里插入图片描述

  • 数组类型赋值存储空间解析:两个数据指向同一个地址,即指向同一块内存区域,当这个内存区域中的数据变化,则两个数组输出都会变化

在这里插入图片描述

3.2、数组内存概述

(1)单个一维数组内存图

在这里插入图片描述

(2)两个一维数组内存图

在这里插入图片描述

(3)两个引用指向同一个一维数组的内存,不会开辟新的堆内存

在这里插入图片描述

(4)一个二维数组内存布局
在这里插入图片描述

3.3、常见问题
  • 数组索引越界异常:数组索引超过[0,n-1];
  • 空指针异常:数组没有new初始化则会发生空指针异常;

4、数组应用

4.1、数组拷贝
  • 代码编写
public class hello{
    public static void main(String[] args){
        // 数组拷贝
        int[] arr1 = {1,2,3};
        // 创建一个新数组arr2,开辟新的空间
        int[] arr2 = new int[arr1.length];
        // 遍历arr1.把每个元素拷贝到arr2对应的元素位置
        for(int i=0;i<arr1.length;i++){
            arr2[i] = arr1[i];
        }

        for (int i=0;i<arr1.length;i++){
            System.out.println("one"+arr1[i]);
        }

        for (int i=0;i<arr2.length;i++){
            System.out.println("two"+arr1[i]);
        }
    }
}
  • 运行结果

在这里插入图片描述

  • 内存解析
    在这里插入图片描述
4.2、数组扩容
  • 业务场景:数据{1,2,3}增加元素4,直接放到数组最后
  • 编写代码
public class hello{
    public static void main(String[] args) {
        // 数组扩容
        int[] arr1 = {1, 2, 3};
        System.out.println(arr1);
        // 1、创建一个新数组arr2,开辟新的空间
        int[] arr2 = new int[arr1.length + 1];
        System.out.println(arr2);
        // 2、遍历arr1.把每个元素拷贝到arr2对应的元素位置
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        // 3、将添加元素赋给新的索引
        arr2[arr2.length - 1] = 4;
        // 4、将数组arr2指向arr1
        arr1 = arr2;
        // 打印输出arr1和arr2的内存地址
        System.out.println(arr1);
        System.out.println(arr2);
    }
}
  • 运行结果

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:49:54  更:2022-01-25 10:50:48 
 
开发: 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 19:36:42-

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