文档章节

好玩的测试题

 锦语冰
发布于 2016/11/29 10:42
字数 494
阅读 1
收藏 0
JDK

 

public class Interesting {

    public static void main(String[] args) throws CloneNotSupportedException {

        User original = new User();

        original.setUserId(1);
        original.setUserName("original");
        List<Integer> scoreList = new ArrayList<>();
        scoreList.add(11);
        scoreList.add(111);
        scoreList.add(1111);
        original.setScoreList(scoreList);

        User clone2 = (User) original.clone();
        clone2.setUserId(2);
        clone2.setUserName("clone1");
        clone2.setScoreList(Arrays.asList(22, 222, 2222));

        User clone3 = (User) original.clone();
        clone3.setUserId(3);
        clone3.setUserName("clone3");
        clone3.getScoreList().add(333);

        User clone4 = (User) clone2.clone();
        clone4.setUserId(4);
        clone4.setUserName("clone4");
        clone4.getScoreList().add(444);//UnsupportedOperationException
    }

    static class User implements Cloneable{
        private int userId;
        private String userName;
        private List<Integer> scoreList;

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public List<Integer> getScoreList() {
            return scoreList;
        }

        public void setScoreList(List<Integer> scoreList) {
            this.scoreList = scoreList;
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();//浅克隆
        }
    }

}

Java中,克隆分为深克隆与浅克隆。实现Cloneable接口,复写Object.clone方法,并直接返回super.clone()是最简单的,这是浅克隆——基本类型克隆值,引用类型克隆引用

以上a1,a2...表示address1,address2...,即内存地址

clone4.getScoreList().add之所以会抛异常,是因为clone2里的list是Arrays.asList得到的,他调用abstractList的add(E e)

    public List<Integer> getScoreList() {//1 返回Arrays.ArrayList
         return scoreList;
    }

    public static Integer valueOf(int i) {//2 自动装箱
        if (i >= IntegerCache.low && i <= IntegerCache.high)//-128<= i <= 127,从缓存池中取
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

    public Integer(int value) {
        this.value = value;
    }

    public boolean add(E e) {//AbstractList.add(E e)
        add(size(), e);
        return true;
    }

    public void add(int index, E element) {//抛异常
        throw new UnsupportedOperationException();
    }

 修正版

        /**
         * arraylist本身复写了clone方法,string没有
         */
        @Override
        protected Object clone() throws CloneNotSupportedException {
            User user = (User) super.clone();
            if (scoreList instanceof ArrayList) {//ArrayList.class.isAssignableFrom(scoreList.getClass())
                user.scoreList = (List<Integer>) ((ArrayList) scoreList).clone();
            }
            return user;
        }

//序列化版
public class Interesting {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        User original = new User();

        original.setUserId(1);
        original.setUserName("original");
        List<Integer> scoreList = new ArrayList<>();
        scoreList.add(11);
        scoreList.add(111);
        scoreList.add(1111);
        original.setScoreList(scoreList);

        //将对象写到流里
        ByteArrayOutputStream bo=new ByteArrayOutputStream();
        ObjectOutputStream oo=new ObjectOutputStream(bo);
        oo.writeObject(original);
        //从流里读出来
        ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi=new ObjectInputStream(bi);
        User user2 = (User) oi.readObject();
    }

    static class User implements Serializable{

        private static final long serialVersionUID = 9172109847523230489L;

        private int userId;
        private String userName;
        private List<Integer> scoreList;

        public int getUserId() {
            return userId;
        }

        public void setUserId(int userId) {
            this.userId = userId;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public List<Integer> getScoreList() {
            return scoreList;
        }

        public void setScoreList(List<Integer> scoreList) {
            this.scoreList = scoreList;
        }
    }

}

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 42
码字总数 37034
作品 0
南京
程序员
私信 提问
我开发了一个Python答题小程序,近70份奖品等你来拿

微信小程序非常火爆,我想做小程序已经很久了,几个月前终于下定决心做一款小程序。本身是码农出身,希望做一款跟编程相关的小程序,于是就有了这一款"码题达人"小程序。 小程序:码题达人 ...

菜鸟学python
07/08
0
0
【计算思路】到底谁亏了多少钱?

公司搞了个什么灰机数据库挖掘部门,来了个产品经理果然新官上任三把火, 这段时间一直忙项目,没有上OSC来玩,刚刚看到一个好玩的IQ测试题,放上来 吹吹水。 有一个年轻人来到鞋店里买了一双...

一行
2012/10/29
707
19
请教解题思路及代码

1,有n道题目,每道题有不同的分值和难度,分别为Ai好玩Bi(分值和难度都为正数)要求从某一题开始,连续选至少K道题满足分值和与难度和的比最大。 2.,病毒是由两种非常简单的基因组成的,分...

电量充满
2011/05/23
193
2
剑指offer 25. 复杂链表的复制

原题 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中...

dby_freedom
11/05
0
0
维护一个烂系统是怎么样的一种体验?

把知乎上的一些回答搬运过来,大家讨论,我不是题主,只是觉得很好玩。 http://www.zhihu.com/question/30036978

hawkyoung
2015/05/14
1K
16

没有更多内容

加载失败,请刷新页面

加载更多

程序中设置MySQL的默认值

import com.alibaba.fastjson.JSON;import java.beans.PropertyDescriptor;import java.lang.annotation.*;import java.lang.reflect.Field;import java.lang.reflect.Method;impo......

laolin23
27分钟前
2
0
WordPress没有上级目录的写权限

sudo chmod -R 777 wordpress/wp-content

临江仙卜算子
34分钟前
4
0
大数据学习之大数据技术笔记—spring入门

篇一 spring介绍 spring.io 官网 快速开始 Aop 面向切面编程,可以任何位置,并且可以细致到方法上 连接框架与框架 Spring 就是 IOC AOP 思想 有效的组织中间层对象一般都是切入 service 层 ...

董黎明
35分钟前
5
0
ASP.NET Core MVC 静态文件配置

在启动文件中添加以下配置 public class Startup{ public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddDirectoryBrowser(); ......

whltian
今天
2
0
linux之自定义命令

本人使用的是ubuntu系统,不喜欢建各种桌面快捷链接,但是每次启动个软件,去查找又麻烦,所以自定义了命令,来快捷的启动应用: 1、修改/etc/bash.bashrc,在文件末尾,加上如下List-1中的内...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部