首页 > 编程知识 正文

获取map的key值,keyvalue数据格式

时间:2023-05-04 22:55:44 阅读:117951 作者:4096

本文主要是关于concurrentmap.putifabsent(key,value )用法的内容,具体如下:

在商务中经常遇到这种场合。 全局维护并发贴图,每个贴图关键点对应一个对象。 此对象只需要创建一次。 如果Map中不存在与该key对应的value,则创建该value,如果不存在,则直接返回。

让我们先看看代码:

公共语言(字符串语言,字符串计数,

字符串变量) {

//.

String key=some_string;

本地本地=map.get (key;

if(locale==null ) {

locale=new locale (语言、国家、变量);

map.put(key,locale );

}

返回本地;

}

这个代码要做的是:

调用map.get(key )方法以确定map中是否存在与该key对应的value ) locale对象。

如果返回null,则表示map没有要查找的密钥值映射。 新建Locale对象,并将从new中出来的此对象与key一起放入地图中。

返回最近创建的Locale对象

我们希望确保每次调用getInstance方法时,同一key都会返回同一Local对象引用。 这个代码能实现这个需求吗?

答案在单线程环境中可以满足要求,但在多线程环境中存在线程安全问题。 也就是说,不能保证在并发过程中相同的key返回相同的Local对象引用。

这是因为在上面的代码中存在一个习惯的操作[1],称为推送- if-absent,该操作中存在race condition。

if(locale==null ) {

locale=new locale (语言、国家、变量);

map.put(key,locale );

}

在一个线程完成locale==null的确定和真正将值上传到map之间,其他线程可能已经在对map执行上传操作,因此在进一步执行上传操作时,与同一密钥对应的locale对象将被复盖因此,对贴图的上推权限操作不安全(热安全)。

为了解决这个问题,java 5.0引入了ConcurrentMap接口。 在该接口上,推送操作以原子方法推送(kkey,V value )的形式存在。 正如javadoc所写:

putIfAbsent方法主要在将键-值对添加到ConcurrentHashMap中时确定键-值对是否已经存在。

如果不存在(新条目),则会将键-值对添加到map中并返回null。

如果已经存在,则返回已存在的值,而不复盖现有值。

改造上述方法:

公共语言(字符串语言,字符串计数,

字符串变量) {

//.

String key=some_string;

本地本地=map.get (key;

if(locale==null ) {

locale=new locale (语言、国家、变量);

map.putifabsent(key,locale;

}

返回本地;

}

该代码使用了映射的concurrent格式(ConcurrentMap,ConcurrentHashMap ),并简单地使用了map.putifabsent(key,locale )。 这并不保证同一个key返回同一个Locale对象引用。

这里的错误是putIfAbsent方法有返回值,忽略了返回值很重要。

因此,在使用putIfAbsent方法时,请不要忘记确定返回值。

公共语言(字符串语言,字符串计数,

字符串变量) {

//.

String key=some_string;

本地本地=map.get (key;

if(locale==null ) {

locale=new locale (语言、国家、变量);

localetmp=map.putifabsent(key,locale;

if(tmp!=空) {

本地=tmp;

}

}

返回本地;

}

【实施例1】

import java.util.Map;

import Java.util.concurrent.concurrent hashmap;

公共类测试{

publicstaticvoidmain (字符串[ ] args ) {

测试currentHashMap.putIfAbsent ()

map clientmap=newconcurrenthashmap (;

System.out.println (第一个为空的clientMap );

system.out.println (clientmap : ) clientmap );

System.out.println (;

//向空的clientMap添加新记录

System.out.println (向空clientMap添加新记录);

System.out.println ('添加前的clientMap: ' clientMap );

long netId=1234567L;

String str1='开放发带';

string result=clientmap.putifabsent (netid,str1);

System.out.println ('添加后的clientMap: ' clientMap );

System.out.println (查看返回值的result: ) result );

System.out.println (;

//重叠添加

System.out.println ('重复添加上次记录');

System.out.println ('添加前的clientMap: ' clientMap );

string result2=clientmap.putifabsent (netid,str1);

System.out.println ('添加后的clientMap: ' clientMap );

System.out.println (返回值result: ' result2);

System.out.println (;

}

}

总结

以上是有关concurrentmap.putifabsent(key,value )使用案例的总体内容,希望对大家有所帮助。 感兴趣的人继续参考本网站的其他相关主题。 如果有不足之处,欢迎评论。 感谢朋友们对本站的支持!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。