`
he_wen
  • 浏览: 238645 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java集合 之 如何动态控制HashMap

    博客分类:
  • Java
阅读更多

本文章主要是控制HashMap权限如:设置一把锁(这里实现是通过一个布尔值locked)目的是想控制HashMap是否可以添加数据?是否可以清除数据?是否可以复制所有数据给另外一个HashMap? 如果布尔值为true,那么以上的操作都会报出异常。。。。

 

该类的名字叫做ParameterMap,它继承了HashMap类

 

请看下面的代码:

代码就不需要解释,因为里面已经解释的很详细,读者自己可以运行该程序。。。。

package ex09.pyrmont.startup;


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


/**
 *第一次创建ParmaterMap实例是没有锁。
 *该类继承了HashMap,包含了一个locked成员变量
 * @author Jerry
 */

public final class LockedMap extends HashMap {

    // ----------------------------------------------------------- 构造函数
    /**
     * 构造一个新的map,容量是默认值,加载因子也是默认值
     */
    public LockedMap() {

        super();

    }

    /**
     * 构造一个新的map,容量值是一个具体的初始容量,加载因子是默认值
     * 
     * @param initialCapacity 这个map的初始容量
     */
    public LockedMap(int initialCapacity) {

        super(initialCapacity);

    }


    /**
     * 构造一个新的map,容量值是一个具体的初始容量,加载因子是loadeFactor
     * 
     * @param initialCapacity 这个map的初始容量
     * @param loadFactor 这个map的加载因子
     */
    public LockedMap(int initialCapacity, float loadFactor) {

        super(initialCapacity, loadFactor);

    }


    /**
     * 复制一个map,给新的map
     * 
     * @param map Map的类容复制到新的Map中
     */
    public LockedMap(Map map) {

        super(map);

    }


    // ------------------------------------------------------------- 类的成员变量


    /**
     * 这个Map当前锁的状态
     */
    private boolean locked = false;

    //------------------------------------------------------------get和set方法
    
    /**
     * Return 这个map锁的状态.
     */
    public boolean isLocked() {

        return (this.locked);

    }


    /**
     * 设置这个map锁的状态
     *
     * @param locked 一个新锁的状态
     */
    public void setLocked(boolean locked) {

        this.locked = locked;

    }



    // --------------------------------------------------------- Public Methods



    /**
     * 移除这个map的所有键值对.
     *
     * @exception IllegalStateException 如果这个Map被锁住
     */
    public void clear() {

        if (locked)
            throw new IllegalStateException
                ("LockedMap.locked");
        super.clear();

    }


    /**
     * 在这个Map中具体的值与具体的键相关联。如果Map里面种包含了这个key,那么旧值就会被
     * 替换
     * 
     * @param key Key是与具体的值相关联
     * @param value 值必须与具体的key相关联
     *
     * @return 具体key与之关联的value
     *
     * @exception IllegalStateException 如果这个Map被锁住
     */
    public Object put(Object key, Object value) {

        if (locked)
            throw new IllegalStateException
                ("LockedMap.locked");
        return (super.put(key, value));

    }


    /**
     * 把指定的map中的所有键值对复制到这个map中
     * 
     * @param map 所有的键值对存放在这个map中
     *
     * @exception IllegalStateException 如果这个Map被锁住
     */
    public void putAll(Map map) {

        if (locked)
            throw new IllegalStateException
                ("LockedMap.locked");
        super.putAll(map);

    }


    /**
     * 如果存在就会移除key相关联的value值.
     *
     * @param key 
     *
     * @exception IllegalStateException 如果这个Map被锁住
     */
    public Object remove(Object key) {
        if (locked)
            throw new IllegalStateException
                ("LockedMap.locked");
        return (super.remove(key));

    }


}
 
分享到:
评论
22 楼 angel243fly 2010-12-12  
这个扩展hashmap估计用处不大吧
21 楼 he_wen 2010-12-10  
对,tomcat源代码是这样做的,怪我没有讲清
20 楼 hardPass 2010-12-10  
我终于搞明白了这个map的用途了。
就是说,把参数解析好,放入map后,就不允许修改这个map了。
是不是这个意思?
19 楼 sunce 2010-12-09  
的确,单纯控制访问,应用代理模式就OK了,
18 楼 rplees 2010-12-09  
在我印象中,锁这个东东应该会跟synchronized挂钩。
17 楼 dwangel 2010-12-09  
如果想得到一个不能修改 的Map,还是建议用
Collections.unmodifiableMap(originMap);

如果传递出去的map中途还需要修改,那只能说整体设计有点问题了。
16 楼 hardPass 2010-12-09  
he_wen 写道
这个类没有考虑线程安全问题,因为HashMap本来就是线程不安全。我主要做的就是限制HashMap值的操作。在Tomcat源码中就是这样做的,因为Servlet获取请求信息如:request.getParameterMap()时候,刚刚开始Tomcat是不会马上把字符串解析出来,而是存放字符串,只有用户调用了函数的时候它才会解析,在存放到HashMap中。。。呵呵。。。可能起的名字有误会,希望大家见谅!!!刚刚开始写博客有很多地方请指教


请问这个跟加lock有什么关系呢?
我老笨呢,想了半天没想明白。
15 楼 whaosoft 2010-12-09  
LZ大学专业是计算机吗?
14 楼 snake1987 2010-12-09  
有点像struts例的freeze

不过说真的,这题目真的……
13 楼 http4j 2010-12-09  
aabcc 写道
http4j 写道
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?

lz提到了锁,但是既没有 同步块也没有lock-free算法

很容易让人误解啊,后面LZ的解释我算是明白一点点了

这个其实是 LZ看 How Tomcat works 得到的例子吧? 这个明显是 Tomcat的Custom解决方法,只适合TOMCAT的某场景

个人觉得不太适合作为一个 编程方法来让大家学习


这个楼主有责任,只不过说人家二的人明显没仔细看帖子,就上来攻击了。
楼主所说的所明显是控制访问用的,而不是多线程概念里的同步锁。

12 楼 he_wen 2010-12-09  
谢谢大家的回复,我当初是看了 How Tomcat works后,看到这个类比较好,才展示给大家看看,如果有不对的地方请大家多多指教。。。
11 楼 hhhhkkkk 2010-12-09  
个人看法,不要继承,可以Decorator或Proxy一个map类,这样灵活多了,还可以根据策略或其它方式封装不同的map实例,以实现有序,同步等功能。
10 楼 Wallian_hua 2010-12-09  
其实我不是说楼主,确实有点。。。。
9 楼 aabcc 2010-12-09  
http4j 写道
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?

lz提到了锁,但是既没有 同步块也没有lock-free算法

很容易让人误解啊,后面LZ的解释我算是明白一点点了

这个其实是 LZ看 How Tomcat works 得到的例子吧? 这个明显是 Tomcat的Custom解决方法,只适合TOMCAT的某场景

个人觉得不太适合作为一个 编程方法来让大家学习
8 楼 http4j 2010-12-09  
我不觉得这个类很二, 楼主扩展的是HashMap,又不是ConcurrentHashMap,要那么多同步锁或者AtomicBoolean,未必适合楼主的场景。不理解说二的人都怎么想的?
7 楼 he_wen 2010-12-09  
这个类没有考虑线程安全问题,因为HashMap本来就是线程不安全。我主要做的就是限制HashMap值的操作。在Tomcat源码中就是这样做的,因为Servlet获取请求信息如:request.getParameterMap()时候,刚刚开始Tomcat是不会马上把字符串解析出来,而是存放字符串,只有用户调用了函数的时候它才会解析,在存放到HashMap中。。。呵呵。。。可能起的名字有误会,希望大家见谅!!!刚刚开始写博客有很多地方请指教
6 楼 sundoctor 2010-12-09  
这个真的没什么用,这个真的可以没有
5 楼 Foxswily 2010-12-09  
“该类的名字叫做ParameterMap”  VS. LockedMap

4 楼 finallygo 2010-12-09  
这个类还是线程不安全
3 楼 agapple 2010-12-09  
真没看出来是啥用途

1. lock 非原子变量
2. 没看到lock有任何set的地方。只看到判断lock了

相关推荐

    深入Java集合学习系列:HashMap的实现原理

    在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...

    Java HashMap类详解

    本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...

    Java集合思维导图.xmind.zip

    以下是关于Java集合类,特别是HashMap、CurrentHashMap、ArrayList和LinkedList的详细知识点: 1. **HashMap**: HashMap是Java中最基本的键值对存储结构,基于哈希表实现。它提供了快速的插入、删除和查找操作,...

    java 使用web service读取HashMap里的数值

    2. **HashMap**:Java集合框架的一部分,是一种键值对存储结构,提供了非常高效的查询和修改操作。 #### 实现步骤 ##### 第一步:创建WebService接口 为了更好地展示整个过程,我们首先需要创建一个简单的...

    java 集合练习题

    在这个“java集合练习题”中,我们主要关注如何使用Java集合框架来处理数据,特别是对于学生信息的存储、排序和输出。以下是对这个练习题的详细解析: 1. **集合框架简介**: Java集合框架是Java API的一部分,它...

    java集合思维导图

    Java集合框架是Java编程语言中的一个核心部分,它为数据存储和管理提供了高效且灵活的解决方案。本思维导图及总结旨在深入理解并掌握Java集合的相关概念和使用方法。 首先,我们来了解一下Java集合框架的基本构成。...

    Java集合之HashMap用法详解

    Java集合之HashMap用法详解 Java集合之HashMap用法详解主要介绍了Java集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧。 HashMap概述 HashMap是Java集合框架中最常用的Map...

    深入Java集合学习系列

    Java集合框架是Java编程语言中的核心组件之一,它为存储、管理和操作对象提供了一套高效且灵活的工具。本系列深入讲解了Java集合框架中的重要组成部分,包括HashMap、ArrayList、LinkedHashMap、HashSet以及...

    java 集合

    本文将深入探讨Java集合框架的基础知识,包括接口、类、以及它们在实际开发中的应用。 首先,Java集合框架由一系列接口和实现这些接口的类组成。主要的接口有`List`、`Set`和`Queue`,它们各自代表了不同特性的数据...

    实验05 Java集合.doc

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,使得开发者能够更方便地管理和操作对象。在本次实验中,我们主要关注了三个主要的集合接口:Set、List和Map,以及它们的一些常见...

    Java基础-模拟HashMap集合(基于数组和链表) 数组和链表.pdf

    Java基础-模拟HashMap集合(基于数组和链表) 在本文中,我们将详细介绍如何模拟Java的HashMap集合,使用数组和链表来实现Hash表的存储。我们将从基本概念开始,逐步深入到HashMap的实现细节中。 什么是HashMap? ...

    Java集合排序及java集合类详解.pdf

    Collection是Java集合框架中最重要的接口之一,它是所有单列集合的根接口。 ##### 1.2 Collection - **常用方法**: - `add(E e)`:向集合添加一个元素。 - `remove(Object o)`:从集合中移除指定元素。 - `...

    Java集合排序及java集合类详解

    Java集合框架是Java编程语言中的一个核心组成部分,它为数据存储和操作提供了丰富的接口和类。在本篇中,我们将深入探讨Java集合的排序机制以及集合类的详细使用。 首先,我们来了解一下Java集合的基本分类。Java...

    java集合类HashMap总结共7页.pdf.zip

    这篇7页的PDF文档“java集合类HashMap总结”可能是对HashMap类的深入解析,包括其原理、常用方法以及在实际开发中的应用。 HashMap的核心特性在于它的哈希函数,这个函数将键(key)转换为一个哈希码(hash code)...

    Java中HashMap的工作机制

    值得注意的是,由于HashMap的Entry数组是动态扩容的,数组的长度会根据实际存储的键值对数量进行增长,以保持较低的哈希冲突率。但是,在数组扩容时,所有的键值对都需要重新计算哈希值并分配到新的位置,这个过程...

    Java集合 练习代码

    ArrayList是Java集合框架中的一个接口实现类,基于动态数组实现,提供了按索引访问元素的高效性能。你可以通过增删改查(Add、Remove、Set、Get)等基本操作来管理ArrayList中的元素。在day20的代码中,可能会包含...

    Java集合框架总结

    ### Java集合框架总结 #### 一、Java集合框架概述 Java集合框架是Java标准库的一部分,它提供了一系列的接口和类来存储和操作各种类型的对象集合。这些接口和类遵循一致的设计模式,使得开发人员可以方便地管理和...

    hashmap 集合

    HashMap是Java集合框架的一部分,位于`java.util`包下,实现了Map接口,用于存储键值对(key-value pairs)。在深入理解HashMap之前,我们先简单回顾一下Java集合的基本概念。 Java集合框架包括Set、List和Map三个...

Global site tag (gtag.js) - Google Analytics