开发者社区> 范大脚脚> 正文

java10 WeakHashMap

简介:
+关注继续查看
WeakHashMap:
对象所占用的区域是不能直接操作的,都是通过引用来操作。

引用分类:
1.强引用(StrongReference):gc(垃圾回收机制)运行时不回收。例如字符串常量池。字符串虽然你不用了,但是别人可能使用,字符串常量池是可以共享的,因此不能回收。
2.软引用(SoftReference):gc运行的时候可能回收也可能不回收,jvm内存不够的时候才回收。软引用可用于制作缓存,常用的数据不需要经常获取,把它缓存下来,jvm内存不够的时候才把这个对象占用的区域进行回收。
3.弱引用(WeakReference):gc运行的时候立即回收。
4.虚引用(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());//2
        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());//1
        map.put(new String("a"), "a3");
        map.put(new String("a"), "a4");
        System.out.println(map.size());//3
    }
}



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());//4
    }
}
//季节
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;
    }
}
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4833572.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
主流实时流处理计算框架Flink初体验。
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。此外,Flink的运行时本身也支持迭代算法的执行。Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存中的速度和任何规模执行计算。Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。
5 0
esc使用体验心得
在我看来云服务器有以下优点:省力,不需要专门花时间去维护服务器的硬件,看服务器是否运行正常;稳定,这应该是最主要的有点;安全,做web开发最怕的当然是攻击,所以选择大厂的服务器,自然是最香的;省钱,这当然也是很重要的,尤其对于我们学生用户还是很友好的,爆赞!
4 0
阿里云ecs使用体验
整了台服务器部署项目上线
4 0
pywebio编写前端页面
pywebio编写前端页面
4 0
Python 脚本一个要注意的点
Python 脚本一个要注意的点
5 0
浅浅的学习一下汇编技术入门基础知识,隔壁家的小孩都学哭了。
我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络,数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。
6 0
链路追踪:Sleuth整合ZipKin
Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper论文实现,可以收集微服务运行过程中的实时链路数据,并进行展示。
3 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载