Java 使用最终静态列表中的默认值填充列表

Java 使用最终静态列表中的默认值填充列表,java,list,map,Java,List,Map,标题可能不是最好的,我为此道歉 我有几个最终的静态列表,用于定义数据库值的默认值。默认值列表永远不应该更改,因为在填充它们时,我使用它来获得一个不可变的列表。然后使用这些列表以默认值填充另一个类中的列表。这些列表中的值预计会更改 默认值类别的伪代码: public final class FooDefaults { public final static List<Integer> LIST_ONE; public final static List<Strin

标题可能不是最好的,我为此道歉

我有几个最终的静态列表,用于定义数据库值的默认值。默认值列表永远不应该更改,因为在填充它们时,我使用它来获得一个不可变的列表。然后使用这些列表以默认值填充另一个类中的列表。这些列表中的值预计会更改

默认值类别的伪代码:

public final class FooDefaults {
    public final static List<Integer> LIST_ONE;
    public final static List<String> LIST_TWO;
    //This map allows easier access to "column" values.
    public final static List<Map<String,String>> LIST_THREE;

    static {
        LIST_ONE = Collections.nCopies(7, 5);
        LIST_TWO = Collections.nCopies(10, "boo");
        Map<String, String> temp = new java.util.LinkedHashMap<>();
        for(int i=0;i<15;i++) {
            temp.put(("Param"+i),"foo");
        }
        LIST_THREE = Collections.nCopies(10, temp);
    }
}
公共最终类默认值{
公共最终静态列表\u一;
公共最终静态列表\u 2;
//此映射允许更轻松地访问“列”值。
公开最终静态列表三;
静止的{
LIST_ONE=Collections.nCopies(7,5);
LIST_TWO=Collections.nCopies(10,“boo”);
Map temp=new java.util.LinkedHashMap();

对于(inti=0;i,最后,我在一个循环中使用了我文章末尾提到的代码,执行了1500次深度复制并对其计时。我对实例化代码也做了同样的操作

正如我所料,从头开始重新创建列表要比深度复制快得多

深度复制为16毫秒,实例化为0毫秒。我使用System.currentTimeMillis()对其进行计时


只要我只在一个静态函数中创建它,我就没有理由担心错误。

关于列表及其内容的深度副本,请参阅体面的博客文章。@user1329572深度副本是防止更改FooDefaults列表中包含的map值的唯一方法吗?我认为这将慢于1000次s的值。为什么在运行时会有数千个对象?Ack,typo,意思是超过1000个。事实上,在我目前正在制作的程序中,只有一个应该有那么多,但我计划尝试在另一个线程上制作它们。我需要能够在运行时的某些时刻将它们与另一个类中包含的数据进行比较。Ke将它们存储在内存中可能没有必要。最初,这些对象存储在ID到名称对的列表中。以某种方式使实际对象处理完整数据似乎更好,因为我可以根据需要在运行时对其进行动态比较。启动时不应实际需要这些数据。因此,我计划等待所有数据恢复然后尝试启动一个新线程来处理数据的计算。
public class Foo {
    //Keep the reference from changing.
    //Prevents an accidental new.
    private final List<Integer> listOne;
    private final List<String> listTwo;
    private final List<Map<String,String>> listThree;

    public Foo() {
        listOne = new java.util.ArrayList<>(FooDefaults.listOne);
        listTwo = new java.util.ArrayList<>(FooDefaults.listTwo);
        listThree = new java.util.ArrayList<>(FooDefaults.listThree);
    }
}
public static final List<Map<String, String>> getListThreeCopy() {
    Map<String,String> temp = new java.util.LinkedHashMap<>();
    for(Map.Entry<String, String> entry: LIST_THREE.get(0).entrySet()) {
        temp.put(entry.getKey(),entry.getValue());
    }

    List<Map<String,String>> rtnList = new java.util.ArrayList<>();
    for(int i=0;i<LIST_THREE.size();i++) {
        rtnList.add(temp);
    }
    return rtnList;
}