/src/main/java/com/alibaba/fastjson/util/IdentityHashMap.java
Java | 96 lines | 58 code | 18 blank | 20 comment | 11 complexity | 8352c9abbf7d0bb451b51649a2d8ae8d MD5 | raw file
- /*
- * Copyright 1999-2101 Alibaba Group.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package com.alibaba.fastjson.util;
- /**
- * for concurrent IdentityHashMap
- *
- * @author wenshao<szujobs@hotmail.com>
- */
- @SuppressWarnings("unchecked")
- public class IdentityHashMap<K, V> {
- public static final int DEFAULT_TABLE_SIZE = 1024;
- private final Entry<K, V>[] buckets;
- private final int indexMask;
- public IdentityHashMap(){
- this(DEFAULT_TABLE_SIZE);
- }
- public IdentityHashMap(int tableSize){
- this.indexMask = tableSize - 1;
- this.buckets = new Entry[tableSize];
- }
- public final V get(K key) {
- final int hash = System.identityHashCode(key);
- final int bucket = hash & indexMask;
- for (Entry<K, V> entry = buckets[bucket]; entry != null; entry = entry.next) {
- if (key == entry.key) {
- return (V) entry.value;
- }
- }
- return null;
- }
- public boolean put(K key, V value) {
- final int hash = System.identityHashCode(key);
- final int bucket = hash & indexMask;
- for (Entry<K, V> entry = buckets[bucket]; entry != null; entry = entry.next) {
- if (key == entry.key) {
- entry.value = value;
- return true;
- }
- }
- Entry<K, V> entry = new Entry<K, V>(key, value, hash, buckets[bucket]);
- buckets[bucket] = entry; // 并发是处理时会可能导致缓存丢失,但不影响正确性
- return false;
- }
- public int size() {
- int size = 0;
- for (int i = 0; i < buckets.length; ++i) {
- for (Entry<K, V> entry = buckets[i]; entry != null; entry = entry.next) {
- size++;
- }
- }
- return size;
- }
- protected static final class Entry<K, V> {
- public final int hashCode;
- public final K key;
- public V value;
- public final Entry<K, V> next;
- public Entry(K key, V value, int hash, Entry<K, V> next){
- this.key = key;
- this.value = value;
- this.next = next;
- this.hashCode = hash;
- }
- }
- }