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

HashTable处理

 
阅读更多
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;
	}
	
}
 
分享到:
评论

相关推荐

    C# json 转hashtable

    在IT行业中,JSON(JavaScript Object Notation)是一种轻量级的...虽然`Hashtable`在现代.NET应用中已经较少使用,但了解如何在JSON和`Hashtable`之间进行转换仍然很有价值,特别是在处理旧项目或与遗留系统集成时。

    WinFormHashTable最简单用法,.net hashtable ,hashtable ,hashtable用法

    在WinForm应用中,Hashtable常用于存储用户界面控件与数据之间的关联,或者在事件处理中暂存数据。例如,可以创建一个Hashtable来存储窗体控件与数据库字段的对应关系,方便数据绑定和操作。 5. **注意点** - **...

    HashMap和HashTable的区别和不同

    `HashTable`不对指定的初始容量进行特殊处理,因此可能不是2的幂。 - 当负载因子超过0.75时,`HashTable`也会进行扩容,但其扩容策略是将容量扩大到原容量的两倍加一(`2 * oldCapacity + 1`)。这种方法在某些情况下...

    C#-Hashtable应用

    由于哈希码是快速计算的,因此插入、查找和删除操作的时间复杂度通常为O(1),这使得Hashtable成为处理大量数据的理想选择。 在C#中创建一个Hashtable非常简单,只需要调用其构造函数即可。例如: ```csharp ...

    asp.net遍历hashtable

    在ASP.NET中,Hashtable是一种常用的...在ASP.NET开发中,熟练掌握Hashtable的使用和遍历对于处理动态数据和传递信息至关重要。在WebSite3项目中,可能涉及的就是如何在实际应用中使用这些技巧,实现高效的数据管理。

    hashmap与hashtable区别

    这种方式相比于`Hashtable`更为灵活,因为可以在需要同步的时候才进行同步处理,而不是像`Hashtable`那样所有方法都被强制同步。 #### 3. 对Null的支持 - **Hashtable**:不支持键或值为null。如果尝试将null作为...

    HashMap与HashTable区别

    不同之处在于,`HashMap`在散列冲突处理上采用了更高效的链地址法,并且在散列表容量不足时会自动调整容量。 #### 五、初始化容量与负载因子 - **HashTable**: 默认初始容量为11,而默认负载因子为0.75。 - **...

    hashtable和hashmap的区别

    默认情况下,`HashMap`的操作没有进行同步处理。因此,在多线程环境中使用`HashMap`时,如果不采取额外的同步措施,可能会导致数据不一致或其他并发问题。 #### 2. 同步机制 - **Hashtable**: 使用内部同步机制来...

    HashTable的java实现

    在Java编程语言中,哈希表(HashTable)是一种常见的数据结构,它提供了高效的数据存储和检索功能。哈希表基于哈希函数将键(Key)映射到数组的索引位置,通过键值对(Key-Value Pair)来存储数据。这种数据结构允许...

    哈希表hashtable实现

    在本篇文章中,我们将深入探讨哈希表的实现,特别是基于C语言的简单实现,参考文件"hashtable.c"和"hashtable.h"。 1. 哈希函数:哈希表的核心是哈希函数,它将输入(键或关键字)转换为数组索引。一个好的哈希函数...

    hashtable序列化与反序列化

    在IT领域,序列化和反序列化是两个关键的概念,特别是在处理对象持久化、网络传输或数据存储时。本文将详细探讨标题所提及的“hashtable序列化与反序列化”,并提供一个基本的示例。 首先,让我们理解什么是序列化...

    hashtable和dictionary的探讨

    在编程领域,哈希表(Hashtable)和字典(Dictionary)是两种常用的数据结构,它们在存储和检索键值对时提供了高效的性能。本文将深入探讨这两种数据结构的原理、性能差异以及实际应用中的考虑因素。 哈希表,通常...

    c# asp.net hashtable对Datalist分页

    本篇文章将详细介绍如何利用C#中的Hashtable对象对Datalist进行分页处理。 首先,我们需要理解Datalist是ASP.NET提供的一种数据绑定控件,它可以用来显示列表或网格格式的数据。与GridView相比,Datalist提供了更多...

    Json字符串转换Hashtable,DataTable,DataSet方法和反转换方法

    Hashtable hashtable = JsonConvert.DeserializeObject&lt;Hashtable&gt;(json); ``` 上述代码将JSON字符串解析成一个Hashtable对象,键值对可以直接通过键来访问。 接下来,我们讨论JSON到DataTable的转换。同样需要...

    HashTable Sort

    - 如果 HashTable 的碰撞处理不当,效率会大大降低。 - 不适用于大数据排序场景。 #### 五、应用场景 HashTable Sort 最适合应用于以下几种情况: - 数据集较小。 - 内存足够大。 - 排序操作不是非常频繁。 ...

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    5. **类型转换和异常处理** 当从`HashTable`中获取数据时,需要进行适当的类型转换。如果类型不匹配,会抛出`InvalidCastException`。使用`as`关键字可以安全地进行转换,如果转换失败,将返回`null`而不是抛出异常...

    在J2ME环境下把JSON解析为Hashtable

    为了有效地处理这些数据,我们可以创建一个通用的JSONParser类,将JSON字符串转换成Hashtable对象,方便后续操作。 首先,我们需要一个JSON库,这里使用的是org.json.me库,它是一个轻量级的JSON解析库,适用于J2ME...

    List Hashtable 的相关操作 asp.net 内含详细代码示例

    在 ASP.NET 开发中,`Hashtable` 是一个常用的集合类,它存储键值对,允许以任意对象作为键和值。`List&lt;T&gt;` 则是另一种集合类,它表示一个可变大小的对象列表,通常用于存储同一类型的元素。在本教程中,我们将深入...

    HashMap与HashTable的区别(含源码分析)

    在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...

Global site tag (gtag.js) - Google Analytics