【JAVA SE】—— 数组(详细!!!)2

简介: 【JAVA SE】—— 数组(详细!!!)2

⛹️‍三、数组作为方法的返回值

代码示例:

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        transform(arr);
        printArray(arr);
      }
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]); }
    }
    public static void transform(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] * 2; }
    }
    

这个代码固然可行, 但是破坏了原有数组. 有时候我们不希望破坏原数组, 就需要在方法内部创建一个新的数组, 并由方法返回出来。

修改后的代码:

  public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        int[] output = transform(arr);
        printArray(output);
    }
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    public static int[] transform(int[] arr) {
        int[] ret = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ret[i] = arr[i] * 2;
        }
        return ret;
    }

【JAVA SE】—— 数组(详细!!!)_数组_16


※思考题※

题目一:输出是什么

import java.util.Arrays;
public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        func1(array);
        System.out.println(Arrays.toString(array));// 图 18

    }
    public static void func1(int[] array){
        array = new int[]{11,2,13,4,51};
    }

}

【JAVA SE】—— 数组(详细!!!)_数组_17

题目二:输出是什么

import java.util.Arrays;
public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        func2(array);
        System.out.println(Arrays.toString(array));
    }
    
    public static void func2(int[] array){
        array[0] = 99;
    }
}

【JAVA SE】—— 数组(详细!!!)_JAVA_18

题解:

public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] array2 = array;
     这代表  array2 这个引用 指向 引用array指向 的对象
     array 和 array2 指向的是同一个对象
    }
}

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_19


⛵四、数组练习

1.模拟实现toString

题目要求:

实现一个方法 toString, 把一个整型数组转换成字符串.

例如 :数组 {1, 2, 3} , 返回的字符串为 “[1, 2, 3]”, 注意 逗号 的位置和数量.

public static String my_toString(int[] arr) {

        String s="[";

        for(int i=0;i<arr.length;i++)
        {
            s=s+arr[i];
            if(i<arr.length-1)
                s+=",";
        }
        s+="]";
        return s;
    }
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6};

        String ss=my_toString(arr);

        System.out.println(ss);

    }

【JAVA SE】—— 数组(详细!!!)_数组_20

2.数组拷贝

数组的拷贝方式

1.for循环拷贝

  //数组拷贝
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = new int[arr.length];
        for (int i = 0; i <arr.length ; i++) {
            copy[i] = arr[i];
        }
        System.out.println(Arrays.toString(copy));
    }

在这种拷贝方式中,我们首先通过 new 一个新的和 arr 一样长度数组 copy,再通过 for 循环将 arr 数组中的内容 一 一赋给copy数组,达到 最终的数组拷贝的效果.


2.Arrays数组的工具类

(1)copyOf()

我们先通过JKD的工具文档,来看一下拷贝工具的用法

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_21

功能:复制指定的数组,用零截取或填充(如有必要),以便复制具有指定的长度.

具体看一下Java当中copyOf方法的具体实现

【JAVA SE】—— 数组(详细!!!)_JAVASE_22

首先 Arrays.copyOf() 的返回类型是 int [ ] ,第一个参数是 原数组(要拷贝的数组),第二个参数是新数组的长度(可以自己定),如果新的数组的长度比原数组长的话,大于原数组长度的元素都补为0 。 具体如下所示…

【JAVA SE】—— 数组(详细!!!)_JAVA_23


(2)copyOfRange()

我们先通过JDK文档来查看这个工具类的功能

【JAVA SE】—— 数组(详细!!!)_数组_24

功能:将指定数组的指定范围复制到新的数组中.

具体看一下Java当中copyof方法的具体实现

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_25

copyOfRange 方法的返回类型是 int [ ] ,第一个参数是 原数组 ,第二、三参数是要拷贝原数组数据的下标 ,一定要切记 是左闭右开的区间 , [ from , to ).

代码示例

【JAVA SE】—— 数组(详细!!!)_数组_26

3.System.arraycopy

【JAVA SE】—— 数组(详细!!!)_JVM_27

我们打开 System.arraycopy 方法的具体实现,发现没有和上面几种拷贝方法的实现过程,System.arraycopy 有前面的 native 可知,这是一个本地方法。


本地方法

1.运行在本地方法栈

2.底层是由C/C++代码实现

System.arraycopy 没有返回值,第一个参数原数组(要拷贝的数组),第二个参数是原始数组要拷贝的下标,第三个参数是目的地数组 ,第四个参数是 目的地数组的下标,第五个数组是要拷贝的长度.

代码示例:

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_28

注意点:

System.arraycopy 最后一个参数 ——要拷贝的数组长度,这个数据不能超过原数组的长度,否则编辑器会发生错误报告:数组越界。


4.数组名.clone ----> 产生当前数组的一个副本

clone可以理解为是一份资料的备份

代码示例:

【JAVA SE】—— 数组(详细!!!)_JAVA_29


⌚五、理解深拷贝与浅拷贝

浅拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。

【JAVA SE】—— 数组(详细!!!)_JVM_30

深拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。

【JAVA SE】—— 数组(详细!!!)_JAVA_31


深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

假设B复制了A,修改A的时候,看B是否发生变化:

如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)

如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

通俗来说就是:

  1. 浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
  2. 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
  3. 使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

【JAVA SE】—— 数组(详细!!!)_深浅拷贝_32


目录
相关文章
|
3天前
|
存储 Java 索引
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
10 3
|
3天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
3天前
|
Java 索引
Java中数组详解
Java中数组详解
45 19
|
3天前
|
Java
解析java中的数组
解析java中的数组
15 3
|
3天前
|
存储 安全 Java
Java一分钟之-数组的创建与遍历
【5月更文挑战第8天】本文介绍了Java中数组的基本概念、创建与遍历方法,强调了类型匹配和数组越界问题。示例展示了如何创建整数数组并初始化元素,同时提供了避免数组越界的策略。对于遍历,文章提到了for循环和增强型for循环,并给出了防止错误的建议,如正确声明类型、初始化数组、安全索引操作及使用合适的数据结构。遵循这些指导可帮助开发者有效管理Java数组并减少错误。
19 0
|
3天前
|
存储 Java 索引
Java数组
Java数组
24 0
|
3天前
|
存储 算法 Java
【Java探索之旅】掌握数组操作,轻松应对编程挑战
【Java探索之旅】掌握数组操作,轻松应对编程挑战
12 0
|
3天前
|
存储 Java C语言
【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
14 0
|
3天前
|
存储 机器学习/深度学习 Java
【Java探索之旅】数组使用 初探JVM内存布局
【Java探索之旅】数组使用 初探JVM内存布局
28 0
|
3天前
|
存储 Java 编译器
【Java探索之旅】数组概念与初始化指南:动静结合
【Java探索之旅】数组概念与初始化指南:动静结合
23 0