静态访问HashMap / Array?

时间:2009-10-22 17:43:29

标签: java performance jsp static

以下是Web应用程序中使用的静态方法的示例。如您所见,每次调用此方法时,String [] allergensArr都会被实例化。它是线程安全的,因为它是静态方法,但它是一个昂贵的调用。

可以使用过敏原Ar []的其他一些方法,以便每次调用该方法时都不会实例化。

我正在考虑以下选项。

  • 有一个静态构造函数初始化一个静态的最终String []
  • 使用单身人士(虽然这会阻挡很多人)

这将是一个常量数组,在实例化服务器的生命周期内不会改变。

public class UserHealthConcernsManager {
    public static String[] getAllergensFlag () {

        String[] allergensArr = new String[12];

        allergensArr[0] = "x";
        allergensArr[1] = "y";
        allergensArr[2] = "w";
                 _SNIP_
                return allergensArr;
     }
}

5 个答案:

答案 0 :(得分:3)

您是否考虑使用List而不是引用数组?

代码可以简化为:

public static final List<String> allergensFlag =
    Collections.unmodifiableList(Arrays.asList(
        "x",
        "y",
        "w",
        ...
    ));

如果真的,真的需要旧式阵列,那么克隆的成本就是很小

private static final String[] allergensFlag = {
    "x",
    "y",
    "w",
    ...
};

public static String[] getAllergensFlag () {
    return allergensFlag.clone();
}

答案 1 :(得分:2)

  1. 静态并不意味着线程安全。如果“user”(HashMapSupport)在多个线程之间共享......
  2. 看起来并不贵。
  3. 如果您确实需要,可以在Session对象中存储此类信息。
  4. 如果需要保证不能修改字符串数组,则需要将字符串数组包装在其他对象中,以保证存储的对象是不可变的(例如,只有getter方法)。
  5. 编辑:Yargh。正如其他人所说,你已经大大改变了这个问题。如果要保证数组是不可变的,请参阅第4点。

答案 2 :(得分:1)

静态构造函数似乎是一个明显的解决方案。

static String[] allergensArr = {"x", "y", "w", ...9 more...}

您确实需要确保在应用程序的生命周期内没有人重新分配静态字段或修改数组。

更新:如果您真的关心确保没有客户篡改它,您可以这样做:

final static List<String> x = Collections.unmodifiableList(Arrays.asList("x", "y", "z", ...));

答案 3 :(得分:0)

有时,定义的问题范围可能太窄而无法进行良好的优化。

如果您的问题是您需要将这些项目从传入的哈希映射移动到数组,那么它的效率就不会太高(尽管您可能希望从这样的数组开始:new String [] {“ADDED_SUGARS_FREE_FLAG”,“EGG_FREE_FLAG”,...}并迭代它,因此您没有所有这些重复的行。

因此,要获得更好的优化,您可能需要缩小一两级。为什么要将它们存储在数组中,难道你不能只是部分或全部复制用户hashmap吗?用户散列映射是否可以变为不可变,因此您可以只创建它的指针副本,甚至不用提取值?

或者更好的是,您可以使用更智能的集合来包装HashMapSupport,以解决使用它的所有类的问题。

如果不了解更多有关您的代码的内容,我无法回答其中的任何问题,但这就是我要看的内容。

编辑后: 你已经改变了一点问题。你现在拥有的相当于:

return new String[]{"w", "x", "y", ...}

您确定没有简化部分问题吗?

答案 4 :(得分:0)

只需在web-app启动时初始化数组并放入servlet上下文。请参阅ServletContextListenerServletContext