Java 如何实现对象队列映射

Java 如何实现对象队列映射,java,hashmap,queue,java.util.concurrent,Java,Hashmap,Queue,Java.util.concurrent,我不太清楚如何实现以下输出 { "finalOutput":{["test":{[],[],[],[],[],[],[],[],[],[]}, "test1":{[],[],[]....[]}, "test2":{[],[]....[]}]} } 对于这个输出,一个键应该有10个具有队列概念的对象。 例如,college:{[]、[]、[]、[]、[]、[]、[]、[]、[]、[]…}。每个键的值不应超过10个。因此,我正在考虑使用ConcurrentLink

我不太清楚如何实现以下输出

{ 
     "finalOutput":{["test":{[],[],[],[],[],[],[],[],[],[]},
     "test1":{[],[],[]....[]},
     "test2":{[],[]....[]}]}
}

对于这个输出,一个键应该有10个具有队列概念的对象。 例如,
college:{[]、[]、[]、[]、[]、[]、[]、[]、[]、[]…}
。每个键的值不应超过10个。因此,我正在考虑使用
ConcurrentLinkedQue
实现。我不知道如何实施

我正在考虑使用
多值映射
,但我需要检查每个键是否有10个或更少的对象。不应超过10,因此需要使用FIFO策略进行检查。(如果超过10,则需要先删除并插入值。)


有谁能建议我如何实施。如果有人有样品,请帮助我

您可以使用大小为10的值
BlockingQueue
设计地图。如果有些地方可能导致并发内不安全,请告诉我。我想没关系

Map<String,BlockingQueue<Object>> map = new ConcurrentHashMap<String,BlockingQueue<Object>>(){
        @Override
        public BlockingQueue<Object> put(String key,
                BlockingQueue<Object> value) {
        BlockingQueue<Object> current = this.get(key);
        synchronized (current) {
            if(current.size() == 10){
            current.remove();
            }
            current.add(value.peek());
        }
            return super.put(key, current);
        }

        @Override
        public BlockingQueue<Object> get(Object key) {
        if(this.contains(key))
            return super.get(key);
        else
            return new LinkedBlockingQueue<Object>(10);
        }
    };

    }
Map Map=new ConcurrentHashMap(){
@凌驾
public BlockingQueue put(字符串键,
阻塞队列值){
BlockingQueue current=this.get(key);
已同步(当前){
如果(当前.size()==10){
current.remove();
}
current.add(value.peek());
}
返回super.put(键,当前);
}
@凌驾
公共阻止队列获取(对象密钥){
如果(此.包含(键))
返回super.get(key);
其他的
返回新的LinkedBlockingQueue(10);
}
};
}

它是一个json对象吗?是的,是json对象,但也需要用FIFO实现,所以我不知道如何实现。根据json RFC:“对象是无序的”。如果每个“[]”(数组)都是FIFO队列中的元素,那么它将无法工作。很好,非常感谢您的建议,但我想ConcurrentLinkedQueue比阻止队列更好?Bz ConcurrentLinkedQue支持多线程和线程安全。为什么要覆盖put/get?2.如果性能很重要的话,这个实现将成为多线程环境中的争用点。避免同步,并使用该语言提供的更好的并发原语。在这种情况下,只需使用ConcurrentMap的“compute”方法即可-锁管理更正确,您将避免这种奇怪的代码。@MichaelArenzon重写put/get以满足要求。永远不要使用
同步
?你知道什么是法王吗?什么?我的激情。扩展具体的实现是非常糟糕的做法,覆盖具体的数据结构更糟糕。这种覆盖破坏了ConcurrentHashMap的整个理念。正如我之前所说的,这整段代码可以简单地用“ConcurrentMap”提供给您的原子操作来代替,并且只需使用“compute”方法就可以了。@MichaelArenzon ConcurrentMap有一个名为compute的方法?