博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
警惕数组的浅拷贝
阅读量:4935 次
发布时间:2019-06-11

本文共 2757 字,大约阅读时间需要 9 分钟。

        有这样一个例子,第一个箱子有赤橙黄绿青蓝紫7色气球,现在希望第二个箱子的气球和第一个箱子一样,只是最后一个气球是蓝色的。对于这个问题,我们自然会想到拷贝的方法来解决问题。

      附代码:

import java.text.Collator;import java.util.Arrays;import java.util.Comparator;import java.util.Locale;public class Test4 {    @SuppressWarnings({ "rawtypes", "unchecked" })    public static void main(String[] args) {        int ballonNum = 7;        Balloon[] box1 = new Balloon[ballonNum];        for (int i = 0; i < ballonNum; i++) {            box1[i] = new Balloon(Color.values()[i], i);        }        Balloon[] box2 = Arrays.copyOf(box1, box1.length);        box2[6].setColor(Color.Blue);        for (Balloon b : box1) {            System.out.println(b);        }    }}enum Color {    Red, Orange, Yellow, Green, Indigo, Blue, Violet;}class Balloon {    private int id;    private Color color;    public Balloon(Color _color, int _id) {        color = _color;        id = _id;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public Color getColor() {        return color;    }    public void setColor(Color color) {        this.color = color;    }    public String toString() {        return new StringBuffer().append("编号:" + id + "颜色:" + color + ";")                .toString();    }}

现在我们看看通过拷贝后的第一个箱子的气球的颜色是什么样子的:

我们看到最后一个气球变成了blue。我们只希望第二个箱子改变最后一个气球的颜色,这和我们预想的不一样。到底哪地方出了问题?

        我们知道,通过copyOf方法产生的数组是一个浅拷贝,拷贝有个很重要的规则(数组的clone方法也是与此相同的,同样是浅拷贝):基本类型都是直接拷贝值,其他都是拷贝引用地址。问题找到了(调用了相同的引用地址),那么修改的方法可以如下:

import java.text.Collator;import java.util.Arrays;import java.util.Comparator;import java.util.Locale;public class Test4 {    @SuppressWarnings({ "rawtypes", "unchecked" })    public static void main(String[] args) {        int ballonNum = 7;        Balloon[] box1 = new Balloon[ballonNum];        for (int i = 0; i < ballonNum; i++) {            box1[i] = new Balloon(Color.values()[i], i);        }        Balloon[] box2 = Arrays.copyOf(box1, box1.length);        //box2[6].setColor(Color.Blue);        Balloon bb=new Balloon(Color.Blue,6);        box2[6]=bb;        for (Balloon b : box1) {            System.out.println(b);        }            }}enum Color {    Red, Orange, Yellow, Green, Indigo, Blue, Violet;}class Balloon {    private int id;    private Color color;    public Balloon(Color _color, int _id) {        color = _color;        id = _id;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public Color getColor() {        return color;    }    public void setColor(Color color) {        this.color = color;    }    public String toString() {        return new StringBuffer().append("编号:" + id + "颜色:" + color + ";")                .toString();    }}

第一个箱子气球颜色为:

 

这下就对了。

转载于:https://www.cnblogs.com/shewu/p/5443098.html

你可能感兴趣的文章
Reptile:requests代理IP
查看>>
HTML5应用缓存与Web Workers
查看>>
【并行计算-CUDA开发】英伟达硬件解码器分析
查看>>
Axure原型制作规范
查看>>
华阳彩票渠道管理平台
查看>>
大四中软实习笔记20130301
查看>>
8款功能强大的最新HTML5特效实例
查看>>
行为委托,简洁的 对象关联 编码风格
查看>>
lua 10进制转换成其它进制table表示
查看>>
数据类型
查看>>
ACM基础训练题解4301 城市地平线
查看>>
Python基础练习
查看>>
《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化...
查看>>
python 中的匿名函数lamda和functools模块
查看>>
full gc频繁的分析及解决案例
查看>>
_17NOIP考后随笔
查看>>
centos 7中编译安装httpd-2.4.25.tar.gz
查看>>
第一个一万行程序
查看>>
zeroclipboard复制插件兼容IE8
查看>>
Mina学习之IoHandler
查看>>