静态map

我们在对程序操作的时候,我们的程序会和数据库不停的交汇,如果交汇的太过于平凡数据库的压力太大导致程序运行不流畅,
静态map就可以缓解这方面的问题,静态map就是在项目启动的时候去数据库把对应的数据取出来放到内存中,有些数据仅用于
取出而不会被改动,这些数据都可以放到静态map中,我们在取这些数据的时候就不用去数据库取了,减小了数据的压力。


有一个部门表dept
package com.baidu.entity;


public class Dept {


private Integer did;
private String dname;
public Integer getDid() {
return did;
}
public void setDid(Integer did) {
this.did = did;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String toString() {
return "Dept [did=" + did + ", dname=" + dname + "]";
}
public Dept(Integer did, String dname) {
super();
this.did = did;
this.dname = dname;
}
public Dept() {
super();
}


}


静态map放到一个类中
StaticMap.java

package com.baidu.staticmap;


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


import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.baidu.entity.Dept;
import com.baidu.mapper.UserMapper;

//这个类交给spring管理
@Component
public class StaticMap {

@Resource
private UserMapper mapper;


public static Map<String,String> map = new HashMap<String,String>();
//项目在启动的时候就是运行这个类,在那时候就会把值存到map中
@PostConstruct
public void init(){
if(map.isEmpty()){
List<Dept> selectDeptList = mapper.selectDeptList();
for (Dept dept : selectDeptList) {
map.put("d"+dept.getDid(), dept.getDname());
}
} 
}
//这是取值的方法
public static String getName(String key) {
return map.get(key);
}
}
//我们的这个类是要交给spring管理的,我们要在spring.xml的扫描项里面加上这个类的全称:com.baidu.staticmap<context:component-scan base-//package="com.baidu.service, com.baidu.dao,com.baidu.staticmap"></context:component-scan>
//通过键将map里面的值取出
private String bname;
public String getDname() {
dname = StaticMap.getName("d"+did);return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
这就是我对静态map的理解和代码的实现,希望能给大家带来帮助!





<think>我们被要求创建一个静态Map(在Java中),并且要高效(efficiently)。通常,静态Map意味着在类加载时就初始化好的不可变的Map。在Java中,有几种方法可以实现: 1. 使用静态初始化块 2. 使用双括号初始化(但这种方式有缺点,比如会创建匿名内部类,且可能导致内存泄漏,不推荐) 3. 使用Java 9及以上引入的Map.of()和Map.ofEntries()工厂方法(适用于创建不可变的、小型的Map) 4. 使用Stream(如果我们需要从一些数据构建Map,或者需要更复杂的初始化逻辑) 考虑到效率,我们通常希望避免在运行时进行复杂的计算,并且希望Map是不可变的(因为静态Map通常不应该被修改)。 这里我们提供几种常见的方法: ### 方法1:使用静态初始化块(适用于任意版本,可创建任意大小的Map) ```java import java.util.Collections; import java.util.HashMap; import java.util.Map; public class MyClass { public static final Map<String, String> MY_MAP; static { Map<String, String> tempMap = new HashMap<>(); tempMap.put("key1", "value1"); tempMap.put("key2", "value2"); // 添加更多键值对 MY_MAP = Collections.unmodifiableMap(tempMap); } } ``` ### 方法2:使用Java 9的Map.of()(适用于最多10个键值对) ```java import java.util.Map; public class MyClass { public static final Map<String, String> MY_MAP = Map.of( "key1", "value1", "key2", "value2" // 最多10个键值对 ); } ``` ### 方法3:使用Java 9的Map.ofEntries()(适用于超过10个键值对,或者需要更清晰的键值对表示) ```java import java.util.Map; import static java.util.Map.entry; public class MyClass { public static final Map<String, String> MY_MAP = Map.ofEntries( entry("key1", "value1"), entry("key2", "value2"), // 可以继续添加 entry("key100", "value100") ); } ``` ### 方法4:使用Guava库(如果项目允许使用第三方库) ```java import com.google.common.collect.ImmutableMap; public class MyClass { public static final Map<String, String> MY_MAP = ImmutableMap.of( "key1", "value1", "key2", "value2" // 也可以使用builder模式添加更多 ); } ``` ### 注意: - 方法2、3和方法4(Guava)创建的Map都是不可变的,尝试修改会抛出异常。 - 方法1中我们使用了`Collections.unmodifiableMap`来包装,所以也是不可变的。 - 对于大型Map(比如从文件或数据库加载),我们可能需要在静态块中加载,但这里我们讨论的是在代码中直接定义的静态Map。 ### 效率考虑: - 在类加载时初始化,所以只会在类第一次加载时执行一次。 - 使用不可变Map可以保证线程安全。 - 对于小型Map,使用工厂方法(如Map.of)更简洁高效;对于大型Map,使用初始化块可能更合适,因为工厂方法有参数个数限制(最多10对)或者使用Map.ofEntries没有限制但需要多个entry调用。 ### 相关问题: 1. 如何在Java中创建一个不可变的Map? 2. 使用Java 9的Map.of()有什么限制? 3. 为什么双括号初始化方式不被推荐? 4. 如何在Java中高效地初始化一个大型的静态Map?</think>### Java中高效创建静态Map的方法 在Java中创建静态Map时,核心目标是**保证线程安全、不可变性和初始化效率**。以下是几种高效实现方式: #### 1. 使用Java 9+的工厂方法(最简洁) ```java // 适用于10个以内键值对 public static final Map<String, Integer> MAP1 = Map.of( "A", 1, "B", 2, "C", 3 ); // 超过10个键值对使用Map.ofEntries() public static final Map<String, Integer> MAP2 = Map.ofEntries( Map.entry("D", 4), Map.entry("E", 5), Map.entry("F", 6) ); ``` ✅ 优点: - 单行初始化,代码简洁 - 自动创建**不可变Map**(线程安全) - 底层优化实现高效[^1] #### 2. 静态初始化块(兼容旧版本) ```java public static final Map<String, Integer> MAP; static { Map<String, Integer> tempMap = new HashMap<>(); tempMap.put("X", 10); tempMap.put("Y", 20); MAP = Collections.unmodifiableMap(tempMap); // 转为不可变 } ``` ✅ 优点: - 兼容Java 8及以下版本 - 支持复杂初始化逻辑 - 通过`unmodifiableMap`保证线程安全 #### 3. Guava库实现(功能最强大) ```java // 添加Maven依赖: com.google.guava:guava public static final ImmutableMap<String, Integer> MAP = ImmutableMap.<String, Integer>builder() .put("Alpha", 100) .put("Beta", 200) .put("Gamma", 300) .build(); ``` ✅ 优点: - 真正的**不可变集合**(非视图包装) - 内存占用优化 - 提供丰富的构建方法[^2] --- ### 性能对比 | 方法 | 线程安全 | 内存效率 | 代码简洁度 | Java版本要求 | |--------------------|----------|----------|------------|-------------| | `Map.of()` | ★★★ | ★★★★ | ★★★★★ | 9+ | | 静态初始化块 | ★★★★ | ★★★ | ★★ | 1.2+ | | Guava `ImmutableMap`| ★★★★★ | ★★★★★ | ★★★★ | 1.5+ | > **关键原则**: > 1. 始终声明为`final`防止引用被修改 > 2. 优先选择不可变实现(避免`Collections.unmodifiableMap`的包装开销) > 3. 超过20个键值对时,考虑从外部资源加载数据 --- ### 最佳实践示例 ```java // 现代Java(9+)推荐方案 public class Constants { public static final Map<String, Color> COLOR_MAP = Map.ofEntries( Map.entry("RED", new Color(255, 0, 0)), Map.entry("GREEN", new Color(0, 255, 0)), Map.entry("BLUE", new Color(0, 0, 255)) ); // 防止实例化 private Constants() {} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值