加强局门户网站建设,网站编辑教程,口碑营销服务,辽阳好的网站建设公司问题描述#xff1a;
在程序开发过程中#xff0c;经常使用到Map来进行数据的处理。但在开发过程中#xff0c;当使用静态Map时#xff0c;初始化数据会存在一些危险的情况。
可以参考如下示例代码#xff1a; public static MapString,String staticMap new H…问题描述
在程序开发过程中经常使用到Map来进行数据的处理。但在开发过程中当使用静态Map时初始化数据会存在一些危险的情况。
可以参考如下示例代码 public static MapString,String staticMap new HashMapString, 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 MapString, String staticMap;static {staticMap new HashMapString, String();staticMap.put(1, one);staticMap.put(2, two);staticMap.put(3, three);staticMap.put(4, four);staticMap.put(5, five);}第二种使用静态方法进行初始化 public static final MapString, String staticMap createMap();;private static MapString, String createMap() {MapString, 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 MapString,String staticMap Map.ofEntries(entry(1, one),entry(2, two),entry(3, three),entry(4, four),entry(5, five));官网资料Map.ofEntries
注这里仅讨论了静态初始化的方法其他方法不一一赘述了。 项目实际意义
在项目开发过程中我们在处理缓存常量时经常会使用静态Map来进行数据处理。 因此在使用过程中一定不要使用双括号的初始化方法这样会存在性能和内存泄露的风险。 如果这篇博客对大家有所帮助我希望能得到各位的免费点赞和收藏作为对我的鼓励和支持。 同时也请大家在评论区留下您宝贵的意见和建议我将非常欢迎。 感谢大家的支持、评论和收藏