java10 WeakHashMap
WeakHashMap:
对象所占用的区域是不能直接操作的,都是通过引用来操作。 引用分类:
.强引用(StrongReference):gc(垃圾回收机制)运行时不回收。例如字符串常量池。字符串虽然你不用了,但是别人可能使用,字符串常量池是可以共享的,因此不能回收。
.软引用(SoftReference):gc运行的时候可能回收也可能不回收,jvm内存不够的时候才回收。软引用可用于制作缓存,常用的数据不需要经常获取,把它缓存下来,jvm内存不够的时候才把这个对象占用的区域进行回收。
.弱引用(WeakReference):gc运行的时候立即回收。
.虚引用(Phantomreference):类似于无引用,没有引用,这个引用不能单独使用,只要用于跟踪对象被回收的状态,比如回收之前把这个对象进行获取,不能单独使用,必须与引用队列(ReferenceQueue)联合使用。 WeakHashMap:
键为弱引用,回收键后自动删除key-value对象。
import java.lang.ref.WeakReference;
/**
* 引用分类:强、软、弱、虚
* 强与弱引用
*/
public class RefDemo {
public static void main(String[] args) {
//"bjsxt is very good"存放在字符串常量池中,是共享的, 不能回收。
String str = "bjsxt is very good";
//弱引用 管理 对象
WeakReference<String> wr =new WeakReference<String>(str);
System.out.println("gc运行前:"+wr.get());//gc运行前:bjsxt is very good
//断开引用
str =null;
//通知回收
System.gc();
//开始回收
System.runFinalization();
System.out.println("gc运行后:"+wr.get()); //gc运行后:bjsxt is very good,所以常量池的对象不能回收。如果改为String str = new String("bjsxt is very good");则第二次输出为null.
}
} import java.util.WeakHashMap;
/**
* WeakHashMap 键为弱类型,gc运行立即回收,回收键后自动删除key-value对象。
*/
public class WeakHashMapDemo {
public static void main(String[] args) {
WeakHashMap<String,String> map =new WeakHashMap<String,String>();
//测试数据
//常量池对象,不会回收
map.put("abc", "a");
map.put("d", "test");
//gc运行,已被回收
map.put(new String("bjsxt"), "c");
map.put(new String("dsf"), "d"); //通知回收
System.gc();
System.runFinalization(); System.out.println(map.size());//
System.out.println(map.get("abc"));//a
System.out.println(map.get("d"));//test
System.out.println(map.get("bjsxt"));//null,不回收则输出c
System.out.println(map.get("dsf"));//null,不回收则输出d
//WeakHashMap的作用,可以回收内存。
} } IdentityHashMap:键以地址来区分是不是同一个,与HashMap不同,HashMap比较的是key的hashcode和equals。 /**
* IdentityHashMap 键比较地址来去重
*/
public class IdentityHashMapDemo {
public static void main(String[] args) {
IdentityHashMap<String ,String> map =new IdentityHashMap<String,String>();
//常量池中的"a",共享。
map.put("a", "a1");
map.put("a", "a2");
System.out.println(map.size());//
map.put(new String("a"), "a3");
map.put(new String("a"), "a4");
System.out.println(map.size());//
}
} EnumMap:
键必须为枚举的值(枚举就是常量的集合)。
构造器:public EnumMap(指定枚举class对象)。
/**
* EnumMap要求键为枚举
*/
public class EnumMapDemo {
public static void main(String[] args) {
EnumMap<Season,String> map =new EnumMap<Season,String>(Season.class);//Season.class为枚举class对象
//存放值
map.put(Season.SPRING, "春困");
map.put(Season.SUMMER, "夏无力");
map.put(Season.AUTUMN, "秋乏");
map.put(Season.WINTER, "冬眠");
System.out.println(map.size());//
}
}
//季节
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
} 同步控制与只读设置:
同步控制:多线程里面对这个访问的对象要保证线程安全,主要是容器和集合的线程安全。
常用容器ArrayList、HashSet、HashMap都不是线程安全的(Hashtable是线程安全的,Vector是线程安全的)。Collections提供了synchronizedXxx()方法,将指定容器包装成同步synchronizedList()、synchronizedSet()、synchronizedMap().
/**
* 使用Collections管理同步 容器
* synchronizedList()
synchronizedSet()
synchronizedMap()
*/
public class Demo01 {
public static void main(String[] args) {
List<String> list =new ArrayList<String>();
list.add("a");
list.add("b");
//list可以同步
List<String> synList =Collections.synchronizedList(list);//这样list就是线程安全了。
System.out.println("线程安全的list制作完毕");
}
} /**
只读设置
1、emptyXxx() 空的不可变的集合
emptyList()
emptyMap()
emptySet() 2、singletonXxx() 一个元素且不可变的集合
singleton(T o)
singletonList(T o)
singletonMap(K key, V value) 3、unmodifiableXxx() 不可变容器
unmodifiableList(List<? extends T> list)
unmodifiableSet(Set<? extends T> s)
unmodifiableMap(Map<? extends K,? extends V> m)
*/
public class Demo02 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String,String>();
map.put("test", "test");
map.put("bjsxt", "bjsxt");
//控制只读
Map<String,String> map2 = Collections.unmodifiableMap(map);
//map2.put("a", "a"); //报错。不能增操作
System.out.println(map2.size()); //一个元素的容器测试
String s = new String();//空字符串
List<String> list = Collections.singletonList(new String());
list.add("test");//报错,不能操作,已经有了一个元素(空串)
list.add("bjsxt"); //只能包含一个元素的容器,不能增加。
} public static Set<String> oper(Set<String> set){
if(null==set){
return Collections.EMPTY_SET; //外部获取避免NullPointerException
}
//操作
return set;
}
}
java10 WeakHashMap的更多相关文章
- java弱引用之WeakHashMap相关资料
本人博客中有一篇文章对java中的引用有详细的介绍[http://www.cnblogs.com/javaee6/p/4763190.html],java中WeakHashMap这个类就是java弱引 ...
- Map接口,Map.Entry,hashMap类,TreeMap类,WeakHashMap。
Collection接口之前接触过,每次保存的对象是一个对象,但是在map中保存的是一对对象,是以key->value形式保存的. 定义: public interface Map<K,V ...
- WeakHashMap回收时机
import java.util.ArrayList; import java.util.List; import java.util.WeakHashMap; public class TestWe ...
- Java魔法堂:四种引用类型、ReferenceQueue和WeakHashMap
一.前言 JDK1.2以前只提供一种引用类型——强引用 Object obj = new Object(); .而JDK1.2后我们多另外的三个选择分别是软引用 java.lang.ref.SoftR ...
- 容器--WeakHashMap
一.概述 WeakHashMap是Map的一种,根据其类的命令可以知道,它结合了WeakReference和HashMap的两种特点,从而构造出了一种Key可以自动回收的Map. 前面我们已经介绍了W ...
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...
- 不正确使用WeakHashMap引起的卡死
公司的jenkins今天出了一点问题,起来以后,总是处于等待状态,所有的任务无法正常加载.登陆界面也出不了.而且cpu占用率100% 把线程导出来,看到: “Loading job NMS_Patch ...
- Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...
- 浅谈WeakHashMap
Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用时需要注意些什么?弱引用和强引用对Java GC有什么不同影响?本文将给出清晰而简洁的 ...
随机推荐
- ssh 密钥详解
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...
- 156. Binary Tree Upside Down
题目: Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node ...
- [OJ] Wildcard Matching (Hard)
LintCode 192. Wildcard Matching (Hard) LeetCode 44. Wildcard Matching (Hard) 第二次刷还是被这题虐. 其实就是跪在一个地方, ...
- WebChart网页局域网聊天系列(一):ActiveX插件编写
第一步:创建ActiveX控件类库,在解决方案中右击添加Window窗体控件库 在该类库属性中,设置 使程序集COM可见,同时设置为COM互操作注册 另外在自动生成的文件中AssemblyInfo.c ...
- Azure Backup 入门
Viswanath Tata 云 + Enterprise项目经理 Azure Backup是一款允许客户将数据备份到 Azure的强大工具.请参阅这篇文章,快速了解 Azure Backup.我 ...
- .Net 垃圾回收机制原理(一)
英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.cnblogs.com/yukaizhao/archive/2011/11/23/dot_net_GC_1.html ...
- 分布式缓存系统Memcached简介与实践(.NET memcached client library)
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- [九度OJ]1137.浮点数加法
原题链接:http://ac.jobdu.com/problem.php?pid=1137 题目描述: 求2个浮点数相加的和题目中输入输出中出现浮点数都有如下的形式:P1P2...Pi.Q1Q2... ...
- Msys下gcc的配置
打开文件/etc/profile,添加如下路径, C_INCLUDE_PATH=/e/msys/1.0/include export C_INCLUDE_PATH CPLUS_INCLUDE_PATH ...
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》
4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验.游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意.开发者在开发游戏初期,会根据 ...