`
qq1988627
  • 浏览: 107345 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

重构HashTable

    博客分类:
  • Java
阅读更多
package com.atom.util;

import j2ee.core.utils.TextUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.atom.memcache.CacheOperate;

public class AtsHashtable<K, V> extends Hashtable<K, V>{

	private String TABLE_FLAG = TextUtils.getUUID();
	private Hashtable<K,V> outsideMap;
	private static List<Class> SINGLE_OBJECT = new ArrayList<Class>();
	
	static{
		SINGLE_OBJECT.add(String.class);
	}
	
	{
		initOutsideMap();
	}
	
	private void initOutsideMap(){
		outsideMap = (Hashtable<K,V>)getFromOutSide(TABLE_FLAG);
		if(outsideMap==null){
			outsideMap = new Hashtable<K,V>();
		}
	}
	
	public void initOutsideData(String id){
		Hashtable<K,V> outsideData = (Hashtable<K,V>)getFromOutSide(id);
		if(outsideData!=null){
			TABLE_FLAG = id;
			outsideMap = outsideData;
		}
	}
	
	@Override
	public synchronized void clear() {
		removeFromOutSide(TABLE_FLAG);
		super.clear();
	}

	@Override
	public synchronized boolean contains(Object value) {
		return super.contains(value) || this.outsideMap.contains(value);
	}

	@Override
	public synchronized boolean containsKey(Object key) {
		return super.containsKey(key) || this.outsideMap.containsKey(key);
	}

	@Override
	public boolean containsValue(Object value) {
		return super.containsValue(value) || this.outsideMap.containsValue(value);
	}

	@Override
	public synchronized Enumeration elements() {
		return getUniteTable().elements();
	}

	@Override
	public Set entrySet() {
		return getUniteTable().entrySet();
	}

	@Override
	public synchronized V get(Object key) {
		V result = super.get(key);
		result = result==null?outsideMap.get(key):result;
		return result;
	}

	@Override
	public synchronized boolean isEmpty() {
		return super.isEmpty() && outsideMap.isEmpty();
	}

	@Override
	public synchronized Enumeration keys() {
		return getUniteTable().keys();
	}

	@Override
	public Set keySet() {
		return getUniteTable().keySet();
	}

	@Override
	public synchronized V put(K key, V value) {
		if(isOutsideObject(value.getClass())){
			Object o = super.get(TABLE_FLAG);
			//判断TABLE_FLAG这个key是否放入过自身
			if(o==null){
				super.put((K)TABLE_FLAG, (V)outsideMap);
			}
			//old memcached好像会直接拷贝对象数据,所以不能像往常session那样操作
//			putToOutSide();
//			return outsideMap.put(key, value);
			
			//new 将outsideMap填充新数据后再更新memcached
			V rtn = outsideMap.put(key,value);
			putToOutSide();
			return rtn;
		}else{
			return super.put(key, value);
		}
	}

	@Override
	public synchronized void putAll(Map t) {
		super.putAll(t);
	}

	@Override
	public synchronized V remove(Object key) {
		if(this.containsKey(key)){
			return super.remove(key);
		}else{
			//这么删好像会出问题,因为memcached上保存的是TABLE_FLAG这个key
			//不是要删除的对象的key
			//old
//			removeFromOutSide(key);
//			return outsideMap.remove(key);
			//new
			V o = outsideMap.remove(key);
			//如果没有对象放缓存里了,那么清除缓存
			if(outsideMap.size()==0){
				removeFromOutSide(TABLE_FLAG);
			}else{
				//否则把删除后的outsideMap放到缓存
				putToOutSide();
			}
			return o;
		}
	}

	@Override
	public Collection values() {
		return getUniteTable().values();
	}
	
	private void putToOutSide(){
		CacheOperate.addByUser(TABLE_FLAG, outsideMap);
	}
	
	private Object getFromOutSide(String key){
		return CacheOperate.getByUser(key);
	}
	
	private void removeFromOutSide(Object key){
		CacheOperate.deleteByUser(String.valueOf(key));
	}
	
	private Hashtable<K,V> getUniteTable(){
		Hashtable<K,V> _ht = new Hashtable<K, V>();
		//old 会出现死循环错误
		//_ht.putAll(this);
		//new 自己手动的模仿putAll放置
		Set<Map.Entry<K,V>> entrySet = super.entrySet();
		for (Map.Entry<? extends K, ? extends V> e : entrySet)
            _ht.put(e.getKey(), e.getValue());
		
		_ht.putAll(outsideMap);
		return _ht;
	}
	
	private boolean isOutsideObject(Object o){
		return !SINGLE_OBJECT.contains(o);
	}
	
	public String getTableFlag(){
		return this.TABLE_FLAG;
	}
	
}
分享到:
评论

相关推荐

    并行环境下Java哈希机制的对比及重构.pdf

    该插件可以从不安全的Hashtable自动重构到线程安全的ConcurrentHashMap,为现有的多线程程序提供了一个可行的优化方案。在这个过程中,程序的代码需要被重新组织,以适应ConcurrentHashMap的设计,从而在不牺牲线程...

    delphi开发经验谈

    开发者应准备一系列的容器类,如TStack、THashtable等,以适应不同的数据存储需求。避免直接使用指针和TList,而是优先使用封装后的类,如TStream和TRegistry的子类,以方便扩展。DGL和DEEX这两个库提供了泛型或模板...

    阿里电话面试一面总结

    - **遇到的问题**:在重构过程中发现原系统存在严重的性能瓶颈,主要表现在数据库查询效率低下。 - **解决措施**: - 分析了现有的SQL语句并进行了优化,减少了不必要的数据查询; - 引入了缓存机制来存储高频访问...

    Delphi开发经验谈

    开发者应准备常见的容器类,如TStack、THashtable、TQueue等,以适应不同需求。避免直接使用指针和TList,而是使用封装的类,如TStream和TRegistry,以便日后扩展。对于泛型支持,可以考虑DGL或DEEX库,尽管它们的...

    ASP.NET面试题目

    6. **推荐书籍**:《重构:改善既有代码的设计》帮助改进代码结构,《Clean Code》讲解编写整洁代码的重要性,《设计模式:可复用面向对象软件的基础》介绍常用设计模式。 编程题: 1. **计数二进制中1的个数**:...

    软通动力面试集(Java、日语)

    * Map 是一个键值对的集合接口,实现类有 HashMap、TreeMap、Hashtable 等。 遍历 Map 的方法 有两种方式可以遍历 Map: 1. 使用 entrySet() 方法,遍历 Map 中的键值对。 2. 使用 keySet() 方法,遍历 Map 中的...

    2024java面试题题目及答案.docx

    - **增强重构的信心**:有了全面的测试覆盖,开发者可以更加自信地进行代码重构,而不必担心引入新的bug。 综上所述,Java面试题涵盖了从基础知识到高级特性等多个方面,准备面试时应全面复习这些知识点,并结合...

    java基础面试题集

    IntelliJ IDEA则以其智能代码补全和高效的代码重构功能著称。选择IDE时,应根据项目需求和个人习惯来决定,以提高开发效率。 #### 三、设计模式与框架 设计模式如命令模式(Command Design Pattern),是解决常见...

    IT公司面试笔试题集

    2. **重构**:重构是改进代码结构而不改变其外在行为的过程,目标是提高可读性、可维护性。工具包括Eclipse、IntelliJ IDEA等。 3. **外语问题**:这部分考察面试者的英语表达能力和应对压力的能力。 **算法题目:...

    Delphi 开发经验

    数据结构是软件开发的基础,准备诸如TStack、THashtable、TQueue等容器类,可依据项目需求选取适宜的数据结构,避免直接使用指针与TList。TStream、TRegistry等常用类的封装,为后续开发预留了扩展接口。DGL(The ...

    C#基于异步事件回调多线程容器

    如果应用不复杂,可以采用DB做个简单的消息中心,建议采用HTTP接口来获取与写入消息,方便将来升级重构消息中心。 开发环境VS2012,Framework4.0,代码注释量很大,如果你高兴这代码你可以随意蹂躏,如果你有建设性...

    2017年Java面试题,Java开发

    - HashTable, HashMap, ConcurrentHashMap是Map的实现,HashTable是线程安全的,而HashMap不是,ConcurrentHashMap提供了更好的并发性能。 - equals()和hashCode()用于定义对象的内容相等性和哈希码计算,通常在...

    详解Winform里面的缓存使用

    在ASP.NET 4.0之后,Output Cache进行了重构,引入了OutputCacheProvider接口,允许开发者自定义缓存策略,但默认仍然使用`System.Web.Caching.Cache`。 除了上述标准的缓存机制,开发者还可以根据需求自定义缓存...

    哈希表实例

    2. **哈希表结构体**:`HashTable` 结构体是哈希表的主要容器,其中包含: - `ElemType *elem`:指向元素数组的指针。 - `int count`:当前元素数量。 - `int sizeindex`:当前使用的哈希表大小索引。 3. **初始...

    面视题面视需要

    将SQL Server数据库迁移到Oracle,通常需要进行数据转换和结构重构,可能还需要调整SQL语句以适应Oracle语法。 8. JSP和Servlet的区别 JSP主要用于展示视图,而Servlet处理业务逻辑。JSP可以包含Java代码,但主要...

    java中提升性能对代码作的建议

    11. **单线程使用HashMap和ArrayList**:在单线程环境中,HashMap和ArrayList的性能优于同步的HashTable和Vector。 12. **合理初始化HashMap**:预估最佳容量,避免HashMap多次扩容。使用`HashMap(int ...

    RewriteCollections:作为实践,某些“收集框架”元素被重写

    Entry和HashTable必须通用才能接受K和V List是唯一可用作帮助的Collection类型 数组列表 从头开始构建ArrayList 链表 从头开始构建链表 重构ArrayList和LinkedList以优化性能 给定ArrayList和LinkedList的设置-重写...

    如何利用Java开发高性能、高并发Web应用

    5. **数据结构选择**:根据需求选择合适的数据结构,如使用`ArrayList`代替`Vector`(因为`ArrayList`是非同步的,通常更快),或者在适当的情况下使用`HashMap`代替`Hashtable`,以减少同步开销。 6. **并发编程...

Global site tag (gtag.js) - Google Analytics