【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 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
39 4
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
45 2
|
3月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
104 2
|
3月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
60 9
|
3月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
30 3
|
3月前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
34 6
|
3月前
|
存储 Java 程序员
【一步一步了解Java系列】:何为数组,何为引用类型
【一步一步了解Java系列】:何为数组,何为引用类型
37 1
|
3月前
|
存储 XML Java
如何在 Java 中将常见文档转换为 PNG 图像数组
如何在 Java 中将常见文档转换为 PNG 图像数组
22 1
|
3月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
41 0
|
3月前
|
存储 机器学习/深度学习 Java
【Java】数组详解
【Java】数组详解
32 0