一、引言

  Java中的引用类型由四种情况,强引用、软引用、弱引用、虚引用。关于这些的介绍可以参见鄙人另外一篇博文。                                                                                                                                              http://www.cnblogs.com/plxx/p/4217178.html 

二、概述

  WeakHashMap,在家族中和HashMap是同辈的。

public class WeakHashMap<K,V>  extends AbstractMap<K,V>  implements Map<K,V>

   针对WeakHashMap --- An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use.当key不再使用的时候,就会被自动清除。不再使用是个什么状态???当GC root 枚举不到的时候,就是认为此时可以被GC(finalizable -->finalized -->reclaimed 参阅)。

  同HashMap一样,WeakHashMap允许<key,value>都为null,初始大小为16,load factor为0.75,不是线程安全的。

Once such a key is discarded it can never be recreated, so it is impossible to do a lookup of that key 
in a WeakHashMap at some later time and be surprised that its entry has been removed.

  一旦Key被清除,就不可以再被创建,查询,稍后entry就会被移除。

Each key object in a  WeakHashMap  is stored indirectly as the referent of a weak reference. 
value objects do not strongly refer to their own keys, either directly or indirectly,
since that will prevent the keys from being discarded

  其中的key存放的是weak reference.而value中存放的是strong reference,value不知直接或者间接地和key发生关联,否则会阻止key的清除。

三、查看源码

  private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) { //将队列加锁控制
@SuppressWarnings("unchecked")
Entry<K,V> e = (Entry<K,V>) x;
int i = indexFor(e.hash, table.length); Entry<K,V> prev = table[i]; //找到实体所在的桶号
Entry<K,V> p = prev;
            //找到这个实体
while (p != null) {
Entry<K,V> next = p.next;
if (p == e) {
if (prev == e)
table[i] = next;
else
prev.next = next;
// Must not null out e.next;
// stale entries may be in use by a HashIterator
e.value = null; // Help GC
size--;
break;
}
               //移除该实体--不可恢复
prev = p;
p = next;
}
}
}
}

  expunge - Stale -  Entries 擦除 陈旧 实体

  在resize(),size(),getTables()的相关操作中都会调用该方法。将不使用的对象统统擦除。

Java -- WeakHashMap的更多相关文章

  1. Java WeakHashMap 源码解析

    前面把基于特定数据结构的Map介绍完了,它们分别利用了相应数据结构的特点来实现特殊的目的,像HashMap利用哈希表的快速插入.查找实现O(1)的增删改查,TreeMap则利用了红黑树来保证key的有 ...

  2. 浅谈WeakHashMap

    Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用时需要注意些什么?弱引用和强引用对Java GC有什么不同影响?本文将给出清晰而简洁的 ...

  3. java 面试大全

    一.CoreJava 部分: 基础及语法部分: 1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地 ...

  4. Java 性能优化手册 — 提高 Java 代码性能的各种技巧

    转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...

  5. Java中String的设计

    String应用简介 前言 String字符串在Java应用中使用非常频繁,只有理解了它在虚拟机中的实现机制,才能写出健壮的应用,本文使用的JDK版本为1.8.0_111. 常量池 Java代码被编译 ...

  6. 提高 Java 代码性能的各种技巧

    Java 6,7,8 中的 String.intern – 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 ...

  7. 你,确定了解Java的String字符串?

    本文将描述JDK6中String.intern()是如何实现的,以及在JDK7和JDK8中对字符串池化技术做了哪些改变. String池化介绍 String池化就是把一些值相同,但是标识符不同的字符串 ...

  8. 什么是WeakHashMap--转

    原文地址:http://laravel.iteye.com/blog/2303244 Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用 ...

  9. Programiz 中文系列教程·翻译完成

    原文:Programiz 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 学习资源 目录 Programiz C ...

随机推荐

  1. spoj 375 QTREE - Query on a tree 树链剖分

    题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...

  2. A Byte of Python 笔记(11)异常:try..except、try..finally

    第13章 异常 当你的程序中出现某些 异常的 状况的时候,异常就发生了. 错误 假如我们把 print 误拼为 Print,注意大写,这样 Python 会 引发 一个语法错误. 有一个SyntaxE ...

  3. PHP-变量(www.w3school.com.cn/php)

    写在前面: 变量可以形象的解释为信息的容器(存信息的东西).比如说$x=8,相当于把8给放到x里面,以后操作$x的时候就相当于操作8 >5+$x结果为13 ------------------- ...

  4. 模拟美萍加密狗--Rockey2虚拟狗(五)

    虚拟狗开源后很多网友询问有关使用方法的问题,其实看我前四篇文章就应该了解怎样使用了,但还是写篇教程吧 [一].安装DSF (驱动模拟环境): 运行DSFx86Runtime.msi 如需改变安装目录请 ...

  5. Strata 2014 上的 AzureCAT 粉笔会谈

     本周,AzureCAT 团队非常高兴在 Strata 会议上首次集体亮相.对于那些对 AzureCAT 团队不太熟悉的人来说,我们是 Microsoft 云与企业部门一个核心的国际性团队,由大约 ...

  6. WiFi密码破解CDlinux

    好了,先说下提前要准备的东东吧:1.U盘一枚,最小1G空间.需进行格式化操作,提前保存内部文件.2.CDlinux镜像.帖子最后会提供一枚8月最新修改版,共135M. 1.CDlinux U盘启动  ...

  7. go语法之一

    Go语法: Go语言要求public的变量必须以 大写字母开头,private变量则以小写字母开头,这种做法不仅免除了public.private关键字,更重要的是统一了命名风格. Go语言对{  } ...

  8. Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  9. PHP学习笔记13-操作Cookie

    PHP会话管理图: 创建index.php: <?php /** * Created by PhpStorm. * User: Administrator * Date: 2015/7/1 * ...

  10. sqm(sqlmapGUI) pcat修改版

    sqlmap是一款开源的注入工具,支持几乎所有的数据库,支持get/post/cookie注入,支持错误回显注入/盲注,还有其他多种注入方法. 支持代理,指纹识别技术判断数据库 .而sqm(sqlma ...