Java 有固定大小(长度)的key-value的集合用吗?Map好像没有。

javaprogramlover 2014-04-09 11:22:01
突然想到一个问题, 请高手指点!比如说我想在server端返回一个json格式的数据,我已经知道了长度了,就可以不用Hashmap了,因为hashmap是可变长度,可变程度的hashmap性能就会大。
...全文
1070 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
-江沐风- 2014-04-17
  • 打赏
  • 举报
回复
既然知道长度了,那就不用考虑map了,
小灯光环 2014-04-17
  • 打赏
  • 举报
回复
引用 4 楼 javaprogramlover 的回复:
我现在明确地知道数据就一个,{result: success/failed}, 这种就不需要用Map了,map默认就会构建16个!我不需要那么多!
引用 4 楼 javaprogramlover 的回复:
我现在明确地知道数据就一个,{result: success/failed}, 这种就不需要用Map了,map默认就会构建16个!我不需要那么多!
那你为什么还要定义Map呢。。你这么注重效率就不该用Map。。直接解析字符串多好。。何必new一个Map对象。。
javaprogramlover 2014-04-17
  • 打赏
  • 举报
回复
我现在明确地知道数据就一个,{result: success/failed}, 这种就不需要用Map了,map默认就会构建16个!我不需要那么多!
小灯光环 2014-04-09
  • 打赏
  • 举报
回复
这一点你完全没必要考虑,Hashmap的源码设计本身就是根据数据量的大小自动扩容的。参考一下源码:

public V put(K key, V value) {  
       if (key == null) 
           return putForNullKey(value);  
       int hash = hash(key.hashCode()); 
       int i = indexFor(hash, table.length); 
       for (Entry<K,V> e = table[i]; e != null; e = e.next) {
           Object k;  
           if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
               V oldValue = e.value;  
               e.value = value;  
               e.recordAccess(this);  
               return oldValue;  
           }  
       }  
  
       modCount++;
       addEntry(hash, key, value, i);
       return null;  
   }  

void addEntry(int hash, K key, V value, int bucketIndex) {  
Entry<K,V> e = table[bucketIndex];  
       table[bucketIndex] = new Entry<K,V>(hash, key, value, e);  
       if (size++ >= threshold)  
           resize(2 * table.length);  
   }  

void resize(int newCapacity) {  
        Entry[] oldTable = table;  
        int oldCapacity = oldTable.length;  
        if (oldCapacity == MAXIMUM_CAPACITY) {  
            threshold = Integer.MAX_VALUE;  
            return;  
        }  
  
        Entry[] newTable = new Entry[newCapacity];  
        transfer(newTable);  
        table = newTable;  
        threshold = (int)(newCapacity * loadFactor);  
    }  

void transfer(Entry[] newTable) {  
       Entry[] src = table;  
       int newCapacity = newTable.length;  
       for (int j = 0; j < src.length; j++) {  
           Entry<K,V> e = src[j];  
           if (e != null) {  
               src[j] = null;  
               do {  
                   Entry<K,V> next = e.next;  
                   int i = indexFor(e.hash, newCapacity);  
                   e.next = newTable[i];  
                   newTable[i] = e;  
                   e = next;  
               } while (e != null);  
           }  
       }  
   }  
shlroc 2014-04-09
  • 打赏
  • 举报
回复
个人认为没必要
huage 2014-04-09
  • 打赏
  • 举报
回复
自己重新封装下就ok了撒

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧