java-初识引用分类及Map实现类WeakHashMap
1.同样的,话不多讲直接上代码
(1)认识了解下引用分类及其作用
package com.otherMapProduce; import java.lang.ref.WeakReference;
/*
* IdentityHashMap:键只以地址去重,而不是比较hashcode与equals,键是常量池中的字符串
* EnumMap:键必须为枚举的值,构造器:public EnumMap(指定枚举的class对象)
* 引用分类:
* 1.强引用:StrongReference:引用指向对象,gc(Garbage Collection)运行时不回收
* 2.软引用:SoftReference:gc运行时可能回收(jvm内存不够则无法回收)
* 3.弱引用:WeakReference:gc运行时立即回收
* 4.虚引用:PhantomReference类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQueue)联合使用
* 目的:
* 避免对象长期驻留在内存中,解决垃圾回收机制回收时机问题
*/
public class RefenenceTest { public static void main(String[] args) {
//常量池字符串,共享(不可回收)
String str="I like codes very much!";
//非常量池字符串
String str2=new String("I like codes very much!");
//弱引用管理对象
WeakReference<String> s=new WeakReference<String>(str);
WeakReference<String> s2=new WeakReference<String>(str2);
System.out.println("垃圾回收前str:"+s.get());
System.out.println("垃圾回收前str2:"+s.get());
//断开引用
str=null;
str2=null;
//通知回收
System.gc();
System.runFinalization();
System.out.println("垃圾回收后str:"+s.get());
System.out.println("垃圾回收后str2:"+s2.get());
}
}
效果截图:
2.WeakHashMap的简单使用:
package com.otherMapProduce; import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.WeakHashMap;
//WeakHashMap:键为弱引用,回收键后自动删除key-value对象
public class WeakHashMapTest { public static void main(String[] args) { WeakHashMap<String,String> map=new WeakHashMap<String,String>();
//放入测试数据,分别放入常量池对象和非常量池对象,前者不会回收,后者会回收
//常量池对象
map.put("A", "葵花宝典");
map.put("B", "九阴真经");
//非常量池对象
map.put(new String("C"),"九阳神功");
map.put(new String("D"), "乾坤大挪移");
System.out.println("未经过垃圾回收前 : "+map.size());
//借助Set容器构造迭代器将它们读出来
Set<Entry<String, String>> set=map.entrySet();
Iterator it=set.iterator();
System.out.println("存放的数据为:");
while(it.hasNext()) {
System.out.print(it.next()+" ");
}
//通知回收
System.gc();
System.runFinalization();
System.out.println();
System.out.println("经过垃圾回收后: "+map.size());
} }
效果截图:
ps:这里只是简单了解一下引用及WeakHashMap的相关知识,仅供学习并未深入,如有不正之处欢迎大佬指正,必定虚心改正。
java-初识引用分类及Map实现类WeakHashMap的更多相关文章
- Java容器-引用分类与部分Map用法
目录 1.引用分类 2.了解WeakHashMap.IdentityHashMap.EnumMap 3.同步控制与只读设置 代码实现 1.引用分类(面试) 强引用(StrongReference):引 ...
- 【Java多线程系列六】Map实现类
Map的一些实现类有及其特性 类 线程安全 特性 Hashtable 是 Key不能为null HashMap 否 读写效率最高,但在Java6多线程环境下使用不当可能陷入死循环,进而导致CPU使用率 ...
- JAVA 中的 Collection 和 Map 以及相关派生类的概念
JAVA中Collection接口和Map接口的主要实现类 Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的 ...
- JAVA中Collection接口和Map接口的主要实现类
Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素 ...
- Java并发包——线程安全的Map相关类
Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...
- Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable
Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...
- java 实体对象转Map公共类
java 实体对象转Map公共类 package org.kxtkx.portal.utils; import java.lang.reflect.Field; import java.util.Ha ...
- Java 数据类型:集合接口Map:HashTable;HashMap;IdentityHashMap;LinkedHashMap;Properties类读取配置文件;SortedMap接口和TreeMap实现类:【线程安全的ConcurrentHashMap】
Map集合java.util.Map Map用于保存具有映射关系的数据,因此Map集合里保存着两个值,一个是用于保存Map里的key,另外一组值用于保存Map里的value.key和value都可以是 ...
- Java初识
基础概念 特点: 完全面向对象,动态 解释性,简单.易移植,跨平台 安全健壮,高性能 多线程,分布式 三种核心机制: Java虚拟机 Java Virtual Machine 垃圾收集机制 Garba ...
随机推荐
- Java实现单例模式的9种方法
一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...
- 分布式数据中间件TDDL、Amoeba、Cobar、MyCAT架构比较
框架比较 TDDL Amoeba Cobar MyCat 点评 TDDL不同于其它几款产品,并非独立的中间件,只能算作中间层,是以Jar包方式提供给应用调用.属于JDBC Shard的思想,网上也有很 ...
- Linux中搭建Maven私服
linux安装maven 先解压maven的压缩包apache-maven-3.5.4-bin.tar.gz 命令: tar -zavf pache-maven-3.5.4-bin.tar.gz ...
- [Swift]LeetCode495. 提莫攻击 | Teemo Attacking
In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned ...
- [Swift]LeetCode732. 我的日程安排表 III | My Calendar III
Implement a MyCalendarThree class to store your events. A new event can always be added. Your class ...
- PHP实现用户注册并保存数据到文件
首先我们实现功能时,分析实现的步骤是什么,就这个而言,我们应该接收用户提交的数据并进行校验,然后保存在文件,最后给用户反馈. 这里需要注意的是为了避免嵌套过深,这里使用自定义函数来实现,其代码如下: ...
- 【Git】(2)---checkout、branch、log、diff、.gitignore
常用命令 一.命令 1.checkout 切换分支 git checkout 分支名 #切换分支 #如果在当前分支上对文件进行修改之后,没有commit就切换到另外一个分支b, 这个时候会报错,因为没 ...
- Java 多线程(五)—— 线程池基础 之 FutureTask源码解析
FutureTask是一个支持取消行为的异步任务执行器.该类实现了Future接口的方法. 如: 取消任务执行 查询任务是否执行完成 获取任务执行结果(”get“任务必须得执行完成才能获取结果,否则会 ...
- JAVA日志的前世今生
这世界上很多事情,看起来就像彩虹一样炫目而神奇,实际上背后蕴含着随处可见的原理.就好像静儿几年前买过一件超贵的防辐射服,当时销售人员把手机严严实实的包在防辐射服里,然后让我打电话测试,果然没有信号. ...
- IntelliJ IDEA 导入新项目
在现有的idea中close project 关闭当前项目, 然后import project