您当前的位置:首页 > 互联网教程

如何在java中使用ConcurrentHashMap

发布时间:2025-05-19 21:09:26    发布人:远客网络

如何在java中使用ConcurrentHashMap

一、如何在java中使用ConcurrentHashMap

1、ConcurrentHashMap锁的方式是稍微细粒度的。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。

2、试想,原来只能一个线程进入,现在却能同时16个写线程进入(写线程才需要锁定,而读线程几乎不受限制,之后会提到),并发性的提升是显而易见的。

3、更令人惊讶的是ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些)。只有在求size等操作时才需要锁定整个表。

4、而在迭代时,ConcurrentHashMap使用了不同于传统集合的快速失败迭代器的另一种迭代方式,我们称为弱一致迭代器。在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出 ConcurrentModificationException,取而代之的是在改变时new新的数据从而不影响原有的数据,iterator完成后再将头指针替换为新的数据,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变,更重要的,这保证了多个线程并发执行的连续性和扩展性,是性能提升的关键。

5、下面分析ConcurrentHashMap的源码。主要是分析其中的Segment。因为操作基本上都是在Segment上的。先看Segment内部数据的定义。

二、java中如何定时清除hashmap

在Java中,要定时清除HashMap,只需要每隔一定频率的时间调用下其clear方法即可。

1、编写一个定时Timer类,并指定执行的时间频率。

2、编写一个定时任务Task类,里面所要执行的动作就是清除HashMap的内容。

3、在Timer类中调用Task类的发清除动作,启动定时器,即可完成定时清除的任务。

HashMap是Jdk1.2摧出来的一个基于哈希表的 Map接口的实现。此实现提供所有可选的映射操作,除了非同步和允许使用 null之外,HashMap类与 Hashtable大致相同。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。

由于HashMap的非同步性,其性能效率相对高于HashTable,故是开发中是经常用到的一个键值对集合。

三、java中hashmap的应用,本人小白,这题要咋搞

publicstaticvoidmain(String[]args){

classStudent{//定义内部类Student

Student(Stringnum,Stringname,intage){//有参构造方法

publicvoidsetName(Stringname){

publicStringtoString(){//复写toString方法

return"学号:"+this.num+",姓名:"+this.name+",年龄:"+this.age;

Map<String,Student>staff=newHashMap<String,Student>();

Studentstudent1=newStudent("15H001","唐僧",40);//用有参构造方法创建一个学生

Studentstudent2=newStudent();//用无参构造方法创建一个学生

Studentstudent3=newStudent("15H003","猪八戒",1000);//用有参构造方法创建一个学生

staff.put(student1.getNum(),student1);//1号学生放入hashMap

staff.put(student2.getNum(),student2);//2号学生放入hashMap

staff.put(student3.getNum(),student3);//3号学生放入hashMap

System.out.println("3.根据key(学号)查找学号为15H003和15H004的学生,如果存在则输出其学号、姓名、年龄信息,否则输出相应的提示信息");

String[]nums={"15H003","15H004"};

for(inti=0;i<nums.length;i++){

System.out.println("查找学号:"+nums[i]);

Studentstudent=staff.get(nums[i]);

if(student!=null){//如果找到了

System.out.println("学号:"+student.getNum()+",姓名:"+student.getName()+",年龄:"+student.getAge());

System.out.println("学号:"+nums[i]+"的学生没有擦寻到相关信息");

System.out.println("4.输出所有学生的信息");

for(Map.Entry<String,Student>entry:staff.entrySet()){

Studentvalue=entry.getValue();

System.out.println("学号:"+key+",姓名:"+value.getName()+",年龄:"+value.getAge());

System.out.println("5.移除唐僧");

staff.remove("15H001");//根据唐僧的学号移除唐僧

System.out.println("6.把HashMap变成数组,并输出每个数组元素的信息(学号、姓名、年龄)");

Object[]values=staff.values().toArray();

for(inti=0;i<values.length;i++){

Studentstudent=(Student)values[i];

System.out.println(student.toString());