java数组以及深浅拷贝的理解

数组的基本概念

数组:数组是一种数据结构,用来存储通哪一类型值的集合。通过整形下标可以访问数组中的每一个值。

(1)java中两种数据:primitive(原始类型)和 Object(引用类型)。

(2)数组属于Object,需要new来创建数组,在使用之前一定要开辟空间(实例化)

(3)java数组的特征:1、数组必须经过初始化才能使用

                             2、一旦创建了数组就不能再改变它的大小

                             3、(若没有指定初始值)创建一个数字数组时,所有元素都初始化为0;boolean数组的元素会初始化为     false;对象数组的元素则初始化为一个特殊值null(表示这些元素还未存放任何对象)。

                            4、可以通过arrays.length获得数组中的元素个数。如下

for (int i=0;i

数组的初始化方式:

1、静态初始化: int[] arr1=new int[] {1,2,3,4,5,6}; 或 int[] arr1={1,2,3,4,5,6};

2、动态初始化(声明并开辟数组):int[] arr2=new int[6];   //创建一个可以容纳6个元素的数组

int[] arr3=null;

arr3=new int[6];    // 另一种开辟模式:分步进行数组实例化

数组拷贝

一、深浅拷贝:通俗一点来讲就是B复制了A,改变A看B是否变化,如果B跟着变了,则为浅拷贝,反之深拷贝

在深入理解深浅拷贝之前,得先理解基本数据类型和引用数据类型的存储方式

1> 基本数据类型的存储方式,名值存放在栈内存中,例如int a=1;

java数组以及深浅拷贝的理解_第1张图片

   当b=a进行复制时,栈内存会开辟一个新内存

java数组以及深浅拷贝的理解_第2张图片

当修改a=2时,并不会对b产生影响。但这也算不上深拷贝,因为深拷是针对复杂的Object类型数据。

2> 引用数据类型的存储方式,名存在栈内存中,值存在堆内存中,但栈内存会提供一个引用的地址指向堆内存的值

例如 int[] a= {1,2,3,4,5}

java数组以及深浅拷贝的理解_第3张图片

当b=a进行复制时,其实复制的是a的引用地址。

java数组以及深浅拷贝的理解_第4张图片

所以当对数组a进行修改时,由于a和b指向的是同一地址,所以b也会受影响,也就是浅拷贝。

小结深拷贝:拷贝对象时,不仅把对象的引用进行拷贝,还把该对象引用的值也进行了拷贝,这样深拷贝后的拷贝对象和源对象相互独立,其中任何一个对象的改动都不会对另一个对象产生影响。

        浅拷贝:拷贝对象时,仅仅把对象的引用进行拷贝,但拷贝后的拷贝对象和源对象使用同一份实体,其中一个对象的改动会对另一个对象产生影响。

二、java的四种拷贝方式

(该四种方式对于基本类型来说都是深拷贝,对引用类型来说都是浅拷贝)

1、for循环拷贝

就是用一个for循环对元素进行逐个拷贝,速度较慢

import java.util.Arrays;

/**
 * @Author WFG
 * @Date 2019/4/9 8:31
 */
public class Demo1 {
    public static void main(String[]args){
        int[] a={1,2,3,4,5};
        a[0] = 9;
        int[] b=new int[a.length];
        for(int i=0;i

java数组以及深浅拷贝的理解_第5张图片

2、clone()

import java.util.Arrays;
/**
 * @Author WFG
 * @Date 2019/4/9 8:31
 */
public class Demo1 {
    public static void main(String[]args){
        int[] a={1,2,3,4,5};
        a[0] = 9;
        int[] b=new int[a.length];
        b=a.clone();
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
    }

}

java数组以及深浅拷贝的理解_第6张图片

3、System.arraycopy()

该方法是一个本地方法,源代码如下:

public static native void arraycopy(Object src, int srcPos, Object dest, int desPos, int length)

其参数含义为:(原数组,原数组的开始位置,目标数组,目标数组的开始位置,复制长度) 

import java.util.Arrays;
/**
 * @Author WFG
 * @Date 2019/4/9 8:31
 */
public class Demo1 {
    public static void main(String[]args){
        int[] a={1,2,3,4,5};
        a[0] = 9;
        int[] b=new int[a.length];
        System.arraycopy(a,0,b,0,a.length);
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
    }

}

java数组以及深浅拷贝的理解_第7张图片

4、Arrays.copyOf()

这个方法调用的是System.arraycopy

import java.util.Arrays;
/**
 * @Author WFG
 * @Date 2019/4/9 8:31
 */
public class Demo1 {
    public static void main(String[]args){
        int[] a={1,2,3,4,5};
        a[0] = 9;
        int[] b=new int[a.length];
        b=Arrays.copyOf(a,a.length);
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
    }

}

java数组以及深浅拷贝的理解_第8张图片

                           

你可能感兴趣的:(JAVA学习)