老师,一个小问题请教一下

来源:17-1 课程总结

慕虎8548721

2018-07-31


这边有个课外的问题想请教你一下,直接拿代码来说吧

这一个类是对集合的操作类,里面声明了两个集合,然后在A类中调用add方法给集合中存储数据,然后在B类中调用get去拿集合中的数据,这样的话是存在错误的,因为A存储了数据,但是对应的value只是一个指向,所以我觉得应该将集合里面的集合也放在类变量中,但是这样依然出现了错误,请老师帮解答一下,

我这边的需求是A是总的人员表进行保存操作,B是进行特种作业的人员进行保存操作,在特种作业人员保存的时候,要是这个人没有在总的人员列表中就不能保存,这边没办法用缓存,所以还请老师给予帮助,以您的经验给出一个解决办法,不胜感激

package com.cn.imooc.student;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;


public class Operate {
    private static Map<String, ArrayList<Student>> map = Collections.synchronizedMap(new HashMap<String, ArrayList<Student>>());
    private static ArrayList<Student> list = new ArrayList<Student>();
    private Operate(){};
    private static Operate operate = new Operate();
    
    public static Operate getInstance(){
        return operate;
    }
    public void add(){
        
        Student student = new Student();
        student.setId("1");
        student.setName("张三");
        Student student2 = new Student();
        student2.setId("2");
        student2.setName("李四");
        list.add(student);
        list.add(student2);
        map.put("123", list);
        map.put("1232", list);
    }
    public void get (){
        System.out.println(map.keySet().size());
        if (map.keySet().size()==0) {
            System.out.println("没有了");
        }else{
            for (Student student : map.get(123)) {
                System.out.println(student.toString());
            }
        }
    }
}

写回答

1回答

Jimin

2018-08-01

你好,你这代码我倒是看明白了,但是没太懂和你介绍里A和B以及不能缓存的关系,以及能否保存的关系。你qq上给我留言吧,细说一下场景,不过我qq上不一定第一时间能看到,最近工作偏忙一些(今天也是后半夜到家,来处理你的问题)。

当前这个代码看起来确实很容易出问题,声明的全局变量list有线程不安全问题(需要使用线程安全的集合才可以)、map设计的又过于复杂(guava里的Multimap会简单很多,课程里有介绍,但也要注意线程安全问题)。具体我们qq上细聊吧,感觉那样更容易帮你解决现在的问题。

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程