[Java]Map的静态赋值

本文介绍了一种使用静态初始化块在Java中创建不可变Map的方法。通过这种方式,可以在编译时确定Map的内容,确保其不变性并提高代码的可维护性和安全性。

Java中Map的静态赋值:


import java.util.HashMap;
import java.util.Map;

public class RegionMap {

    public static final Map<String, String> regionProvMap = new HashMap<String, String>();

    static {
        regionProvMap.put("0", "全部区域");
        regionProvMap.put("1", "北京");
        regionProvMap.put("2", "上海");
        regionProvMap.put("3", "天津");
        regionProvMap.put("4", "广东");
        regionProvMap.put("5", "福建");

        regionProvMap.put("8", "海南");
        regionProvMap.put("9", "安徽");
        regionProvMap.put("10", "贵州");

        regionProvMap.put("11", "甘肃");
        regionProvMap.put("12", "广西");
        regionProvMap.put("13", "河北");
        regionProvMap.put("14", "河南");
        regionProvMap.put("15", "黑龙江");

        regionProvMap.put("16", "湖北");
        regionProvMap.put("17", "湖南");
        regionProvMap.put("18", "吉林");
        regionProvMap.put("19", "江苏");
        regionProvMap.put("20", "江西");

        regionProvMap.put("21", "辽宁");
        regionProvMap.put("22", "内蒙古");
        regionProvMap.put("23", "宁夏");
        regionProvMap.put("24", "青海");
        regionProvMap.put("25", "山东");

        regionProvMap.put("26", "山西");
        regionProvMap.put("27", "陕西");
        regionProvMap.put("28", "四川");
        regionProvMap.put("29", "西藏");
        regionProvMap.put("30", "新疆");

        regionProvMap.put("31", "云南");
        regionProvMap.put("32", "浙江");
        regionProvMap.put("33", "重庆");
        regionProvMap.put("34", "香港");
        regionProvMap.put("35", "台湾");

        regionProvMap.put("36", "澳门");
        regionProvMap.put("37", "其他国家");
        regionProvMap.put("7", "日本");
    }

    public static void main(String[] args) {
        System.out.println(regionProvMap);
    }
}


Java 中,有多种方式可以直接创建 `Map` 并同时赋值,以下是几种常见的方法: ### 使用双大括号初始化 ```java import java.util.HashMap; import java.util.Map; public class MapInitializationExample { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>() {{ put("one", 1); put("two", 2); put("three", 3); }}; System.out.println(map); } } ``` 这种方式利用了匿名内部类和非静态代码块,在构造方法执行前执行代码块中的赋值语句。不过,这种方式会创建一个匿名子类,可能会带来一些性能开销,并且可能存在内存泄漏风险。 ### 使用 `Map.of` 方法(Java 9 及以上) ```java import java.util.Map; public class MapInitializationExample { public static void main(String[] args) { Map<String, Integer> map = Map.of("one", 1, "two", 2, "three", 3); System.out.println(map); } } ``` `Map.of` 方法可以方便地创建不可变的 `Map` 对象,它支持最多 10 个键值对。 ### 使用 `Map.ofEntries` 方法(Java 9 及以上) ```java import java.util.Map; public class MapInitializationExample { public static void main(String[] args) { Map<String, Integer> map = Map.ofEntries( Map.entry("one", 1), Map.entry("two", 2), Map.entry("three", 3) ); System.out.println(map); } } ``` `Map.ofEntries` 方法可以创建包含任意数量键值对的不可变 `Map` 对象。 ### 使用 `Collectors.toMap` 方法(结合 Stream API) ```java import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; public class MapInitializationExample { public static void main(String[] args) { Map<String, Integer> map = Arrays.asList( new String[]{"one", "two", "three"}, new Integer[]{1, 2, 3} ).stream() .collect(Collectors.toMap( arr -> arr[0], arr -> arr[1] )); System.out.println(map); } } ``` 这种方式使用 Stream API 和 `Collectors.toMap` 方法,适合从其他数据源创建 `Map`。
### Java 中创建 Map 类型的静态常量并初始化 在 Java 中,可以通过多种方式创建 `Map` 类型的静态常量并进行初始化,确保其在类加载时完成赋值,并且通常使用 `private static final` 修饰符来声明不可变的静态常量。 #### 1. 使用静态代码块初始化 可以通过静态代码块在类加载时初始化 `Map`,并使用 `Collections.unmodifiableMap()` 方法使其不可变,增强线程安全性和数据一致性: ```java import java.util.Collections; import java.util.HashMap; import java.util.Map; public class ExampleClass { private static final Map<Integer, String> myMap; static { Map<Integer, String> aMap = new HashMap<>(); aMap.put(1, "one"); aMap.put(2, "two"); myMap = Collections.unmodifiableMap(aMap); } } ``` 该方式适用于需要在类加载时执行复杂初始化逻辑的场景[^1]。 #### 2. 使用双括号初始化 Java 支持通过双括号语法创建匿名内部类并进行初始化,适合在声明时直接赋值: ```java private static final Map<String, String> myMap1 = new HashMap<>() {{ put("key1", "value1"); put("key2", "value2"); }}; ``` 该方法简洁明了,但需要注意这种方式会创建匿名内部类,可能引发内存泄漏问题,尤其是在持有外部类引用的情况下[^2]。 #### 3. 使用 Guava 的 ImmutableMap 构建器 如果项目中引入了 Google Guava 库,可以使用 `ImmutableMap` 构建不可变的静态常量 `Map`: ```java import com.google.common.collect.ImmutableMap; private static final Map<String, String> map = ImmutableMap.<String, String>builder() .put("key1", "value1") .put("key2", "value2") .build(); ``` 该方法构建的 `Map` 是不可变的,适用于需要线程安全和不可变性的场景[^3]。 #### 4. 使用 Java 9 的 Map.of 方法(适用于小规模数据) Java 9 引入了简洁的 `Map.of()` 方法,用于创建不可变的 `Map` 实例,适用于键值对数量较少的情况: ```java private static final Map<String, String> map = Map.of( "key1", "value1", "key2", "value2" ); ``` 该方法语法简洁,且返回的 `Map` 是不可变的,适用于 Java 9 及以上版本[^4]。 --- ###
在多种编程语言中,声明并初始化一个静态的 `Map` 类型变量涉及类的静态成员管理。下面以 Java 和 C++ 为例,展示如何正确声明和初始化静态 `Map` 变量,并结合具体代码说明其使用方式。 ### Java 中的静态 Map 初始化 在 Java 中,静态变量属于类,而不是类的实例对象。声明静态 `Map` 的方式如下: ```java public class ExampleClass { // 声明静态 Map public static Map<String, Integer> myMap = new HashMap<>(); } ``` 为了在类加载时进行初始化,可以采用静态代码块来实现: ```java public class ExampleClass { public static Map<String, Integer> myMap; // 静态代码块初始化 static { myMap = new HashMap<>(); myMap.put("key1", 1); myMap.put("key2", 2); } } ``` 这种方式适合在类加载时一次性初始化 `Map` 数据,且代码结构清晰。 ### C++ 中的静态 Map 初始化 在 C++ 中,类的静态成员需要在类外进行定义和初始化。以下是一个完整的示例: #### 类定义(MapTest.h) ```cpp #pragma once #include <map> using namespace std; typedef map<int, int> IntMap; class MapTest { public: MapTest(); virtual ~MapTest(); static IntMap m_staticMap; // 静态 Map 声明 }; ``` #### 类外定义和初始化(MapTest.cpp) ```cpp #include "MapTest.h" // 静态 Map 初始化 pair<int, int> pairArray[] = { make_pair(1, 2), make_pair(2, 3), make_pair(4, 5) }; IntMap MapTest::m_staticMap(pairArray, pairArray + sizeof(pairArray) / sizeof(pairArray[0])); ``` #### 测试代码 ```cpp #include <iostream> #include "MapTest.h" using namespace std; int main() { for (IntMap::iterator iter = MapTest::m_staticMap.begin(); iter != MapTest::m_staticMap.end(); iter++) { cout << iter->first << " " << iter->second << endl; } return 0; } ``` 上述代码展示了如何在 C++ 中声明并初始化一个静态的 `map` 变量,并通过数组初始化的方式完成赋值。 ### 初始化方式的比较 - **Java静态代码块**:适合在类加载时一次性初始化静态变量,逻辑清晰,易于维护。 - **C++ 的类外定义初始化**:需要在类外单独定义静态成员,并在构造函数之外完成初始化,适用于编译时或程序启动时的数据准备。 静态 `Map` 的初始化方法在不同语言中各有特点,但核心思想是通过类的静态成员机制确保其在程序运行期间可访问且数据一致。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值