面试题如下:
image.png简易思路
利用 哈希表 迅速寻址的 优点 实现当前需求;(如有疑问欢迎交流)
1889969 - 1340000 = 549969;
比549969大的最小的2的次幂数为:1048576
image.png
大致代码如下
// 实体类封装
class PhoneSegment{
private Integer id;
private Integer code;
private String province;
private String city;
private String serverType;
// get set 略
}
定义数据结构
// 结合需求 及 HashMap底层hash算法实现原理,初始化一个如下的HashMap
private static Map<Integer, PhoneSegment> phoneSegmentHashMap = new HashMap<Integer, PhoneSegment>(1048576, 1);
初始化数据到map
// 程序启动时,加载如下方法
// 初始化 12万 号段 数据 到hash结构
public void initData2Map() {
// 获取 数据库 号段值数据 集合
List<PhoneSegment> list = getAllPhoneSegmentFromDB();
// 遍历集合,将数据 put到 phoneSegmentHashMap 中
phoneSegmentHashMap = list.stream().collect(Collectors.toMap(p -> p.getCode()-1340000, p -> p));
}
// 从数据库获取 电话号段信息集合
public List<PhoneSegment> getAllPhoneSegmentFromDB() {
// DB读取数据,代码略
return new ArrayList<>();
}
根据手机号码获取对应号段信息(高效保证)
// 根据用户的电话号码 从map中 获取 号段信息
public PhoneSegment getPhoneSegmentByPhone(String phone) {
String phoneSegmentCode = phone.substring(0, 7);
PhoneSegment phoneSegment = phoneSegmentHashMap.get(Integer.valueOf(phoneSegmentCode)-1340000);
return phoneSegment;
}
网友评论