问题描述:
在程序开发过程中,经常使用到Map来进行数据的处理。但在开发过程中,当使用静态Map时,初始化数据会存在一些危险的情况。
可以参考如下示例代码:
public static Map<String,String> staticMap = new HashMap<String, String>(){{put("1","one");put("2","two");put("3","three");put("4","four");put("5","five");}};
此时,使用静态代码扫描工具,会出现以下提示:
Use another way to initialize this instance.
原因分析:
双括号初始化中,第一个括号的含义是生成一个匿名类,第二个括号的含义是初始化块。
Java双括号初始化的方式会导致匿名内部类生成,大量的匿名内部类一瞬间生成会对JVM垃圾回收造成影响,可能导致OOM的发生。
同时,非静态匿名内部类的生成,导致此类会隐式强引用外部类,如果两个类的实例的生命周期不一致,也会导致外部类无法被回收,从而造成了内存泄露。
简而言之,不能使用双括号进行初始化的原因是存在性能问题,可能会导致内存溢出。
参考资料:Java 隐藏特性:双括号初始化
解决方案:
解决方法比较多,其中第一种和第二种类似。
第一种:使用静态块进行初始化
public static final Map<String, String> staticMap;static {staticMap = new HashMap<String, String>();staticMap.put("1", "one");staticMap.put("2", "two");staticMap.put("3", "three");staticMap.put("4", "four");staticMap.put("5", "five");}
第二种:使用静态方法进行初始化
public static final Map<String, String> staticMap = createMap();;private static Map<String, String> createMap() {Map<String, String> result = new HashMap<>();result.put("1", "one");result.put("2", "two");return Collections.unmodifiableMap(result);}
第三种:使用Map.ofEntries初始化(仅支持Java 9+)
其中,Map.of()仅能初始化10以内的数据。
private static final Map<String,String> staticMap = Map.ofEntries(entry("1", "one"),entry("2", "two"),entry("3", "three"),entry("4", "four"),entry("5", "five"));
官网资料:Map.ofEntries
注:这里仅讨论了静态初始化的方法,其他方法不一一赘述了。
项目实际意义:
在项目开发过程中,我们在处理缓存,常量时,经常会使用静态Map来进行数据处理。
因此,在使用过程中一定不要使用双括号的初始化方法
,这样会存在性能和内存泄露的风险。
如果这篇博客对大家有所帮助,我希望能得到各位的免费
点赞
和收藏
,作为对我的鼓励和支持。
同时,也请大家在评论区
留下您宝贵的意见和建议,我将非常欢迎。
感谢大家的支持
、评论
和收藏
!!!