• 警惕数组的浅拷贝


            有这样一个例子,第一个箱子有赤橙黄绿青蓝紫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();
    
        }
    }

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

    QQ图片20160428160939

    我们看到最后一个气球变成了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();
    
        }
    }

    第一个箱子气球颜色为:

    QQ图片20160428161801

    这下就对了。

    世上无难事,只怕有心人
  • 相关阅读:
    1、MyBatis 快速入门
    1、Spring Framework入门
    1、基本数据类型
    2020软件工程个人作业06
    谭山明月有秋水--事后诸葛亮
    谭山明月有秋水——项冲刺第七天
    谭山明月有秋水——冲刺第六天
    谭山明月有秋水——冲刺第一天
    谭山明月有秋水——冲刺第二天
    谭山明月有秋水——冲刺第三天
  • 原文地址:https://www.cnblogs.com/shewu/p/5443098.html
Copyright © 2020-2023  润新知