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;
}
}
分享到:
相关推荐
在IT行业中,JSON(JavaScript Object Notation)是一种轻量级的...虽然`Hashtable`在现代.NET应用中已经较少使用,但了解如何在JSON和`Hashtable`之间进行转换仍然很有价值,特别是在处理旧项目或与遗留系统集成时。
在WinForm应用中,Hashtable常用于存储用户界面控件与数据之间的关联,或者在事件处理中暂存数据。例如,可以创建一个Hashtable来存储窗体控件与数据库字段的对应关系,方便数据绑定和操作。 5. **注意点** - **...
`HashTable`不对指定的初始容量进行特殊处理,因此可能不是2的幂。 - 当负载因子超过0.75时,`HashTable`也会进行扩容,但其扩容策略是将容量扩大到原容量的两倍加一(`2 * oldCapacity + 1`)。这种方法在某些情况下...
由于哈希码是快速计算的,因此插入、查找和删除操作的时间复杂度通常为O(1),这使得Hashtable成为处理大量数据的理想选择。 在C#中创建一个Hashtable非常简单,只需要调用其构造函数即可。例如: ```csharp ...
在ASP.NET中,Hashtable是一种常用的...在ASP.NET开发中,熟练掌握Hashtable的使用和遍历对于处理动态数据和传递信息至关重要。在WebSite3项目中,可能涉及的就是如何在实际应用中使用这些技巧,实现高效的数据管理。
这种方式相比于`Hashtable`更为灵活,因为可以在需要同步的时候才进行同步处理,而不是像`Hashtable`那样所有方法都被强制同步。 #### 3. 对Null的支持 - **Hashtable**:不支持键或值为null。如果尝试将null作为...
不同之处在于,`HashMap`在散列冲突处理上采用了更高效的链地址法,并且在散列表容量不足时会自动调整容量。 #### 五、初始化容量与负载因子 - **HashTable**: 默认初始容量为11,而默认负载因子为0.75。 - **...
默认情况下,`HashMap`的操作没有进行同步处理。因此,在多线程环境中使用`HashMap`时,如果不采取额外的同步措施,可能会导致数据不一致或其他并发问题。 #### 2. 同步机制 - **Hashtable**: 使用内部同步机制来...
在Java编程语言中,哈希表(HashTable)是一种常见的数据结构,它提供了高效的数据存储和检索功能。哈希表基于哈希函数将键(Key)映射到数组的索引位置,通过键值对(Key-Value Pair)来存储数据。这种数据结构允许...
在本篇文章中,我们将深入探讨哈希表的实现,特别是基于C语言的简单实现,参考文件"hashtable.c"和"hashtable.h"。 1. 哈希函数:哈希表的核心是哈希函数,它将输入(键或关键字)转换为数组索引。一个好的哈希函数...
在IT领域,序列化和反序列化是两个关键的概念,特别是在处理对象持久化、网络传输或数据存储时。本文将详细探讨标题所提及的“hashtable序列化与反序列化”,并提供一个基本的示例。 首先,让我们理解什么是序列化...
在编程领域,哈希表(Hashtable)和字典(Dictionary)是两种常用的数据结构,它们在存储和检索键值对时提供了高效的性能。本文将深入探讨这两种数据结构的原理、性能差异以及实际应用中的考虑因素。 哈希表,通常...
本篇文章将详细介绍如何利用C#中的Hashtable对象对Datalist进行分页处理。 首先,我们需要理解Datalist是ASP.NET提供的一种数据绑定控件,它可以用来显示列表或网格格式的数据。与GridView相比,Datalist提供了更多...
Hashtable hashtable = JsonConvert.DeserializeObject<Hashtable>(json); ``` 上述代码将JSON字符串解析成一个Hashtable对象,键值对可以直接通过键来访问。 接下来,我们讨论JSON到DataTable的转换。同样需要...
- 如果 HashTable 的碰撞处理不当,效率会大大降低。 - 不适用于大数据排序场景。 #### 五、应用场景 HashTable Sort 最适合应用于以下几种情况: - 数据集较小。 - 内存足够大。 - 排序操作不是非常频繁。 ...
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
5. **类型转换和异常处理** 当从`HashTable`中获取数据时,需要进行适当的类型转换。如果类型不匹配,会抛出`InvalidCastException`。使用`as`关键字可以安全地进行转换,如果转换失败,将返回`null`而不是抛出异常...
为了有效地处理这些数据,我们可以创建一个通用的JSONParser类,将JSON字符串转换成Hashtable对象,方便后续操作。 首先,我们需要一个JSON库,这里使用的是org.json.me库,它是一个轻量级的JSON解析库,适用于J2ME...
在 ASP.NET 开发中,`Hashtable` 是一个常用的集合类,它存储键值对,允许以任意对象作为键和值。`List<T>` 则是另一种集合类,它表示一个可变大小的对象列表,通常用于存储同一类型的元素。在本教程中,我们将深入...
在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...