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<a.length;i++)
            System.out.println(a[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;

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

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

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

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

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

所以当对数组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<a.length;i++) {
            b[i]=a[i];
        }
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
    }

}

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));
    }

}

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));
    }

}

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));
    }

}

                           

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值