- 浏览: 595694 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
在Java集合中有一种特殊的Map类型:WeakHashMap。 WeakHashMap 继承于AbstractMap,实现了Map接口。 和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null。 不过WeakHashMap的键是“弱键”,里面存放了键对象的弱引用,当某个键不再正常使用时,会从WeakHashMap中被自动移除。当一个键对象被垃圾回收,那么相应的值对象的引用会从Map中删除。WeakHashMap能够节约存储空间,可用来缓存那些非必须存在的数据。
那么这个“弱键”的原理呢?大致上是通过WeakReference和ReferenceQueue实现的。 WeakHashMap的key是“弱键”,即是WeakReference类型的;ReferenceQueue是一个队列,它会保存被GC回收的“弱键”。实现步骤是: (01) 新建WeakHashMap,将“键值对”添加到WeakHashMap中。实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。 (02) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)队列中。 (03) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的键值对;同步它们,就是删除table中被GC回收的键值对。 这就是“弱键”如何被自动从WeakHashMap中删除的步骤了。 和HashMap一样,WeakHashMap是不同步的。可以使用 Collections.synchronizedMap 方法来构造同步的 WeakHashMap。
WeakHashMap源码分析,WeakHashMap维护了一个ReferenceQueue,保存了所有存在引用的Key对象。WeakHashMap.Entry<K,V>中并没有保存Key,只是将Key与ReferenceQueue关联上了。
那么这个“弱键”的原理呢?大致上是通过WeakReference和ReferenceQueue实现的。 WeakHashMap的key是“弱键”,即是WeakReference类型的;ReferenceQueue是一个队列,它会保存被GC回收的“弱键”。实现步骤是: (01) 新建WeakHashMap,将“键值对”添加到WeakHashMap中。实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。 (02) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)队列中。 (03) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的键值对;同步它们,就是删除table中被GC回收的键值对。 这就是“弱键”如何被自动从WeakHashMap中删除的步骤了。 和HashMap一样,WeakHashMap是不同步的。可以使用 Collections.synchronizedMap 方法来构造同步的 WeakHashMap。
WeakHashMap源码分析,WeakHashMap维护了一个ReferenceQueue,保存了所有存在引用的Key对象。WeakHashMap.Entry<K,V>中并没有保存Key,只是将Key与ReferenceQueue关联上了。
WeakHashMap<String, String> map = new WeakHashMap<String, String>(); // 没有引用 所以对被清除 map.put(new String("1"), "1"); // 存在常量池 所以不会被收集 map.put("2", "2"); String s = new String("3"); // 还有被引用 所以不会被收集 map.put(s, "3"); while (map.size() > 0) { try { Thread.sleep(500); } catch (InterruptedException ignored) { } System.out.println("Map Size:" + map.size()); System.out.println(map.get("1")); System.out.println(map.get("2")); System.out.println(map.get("3")); System.gc(); }
发表评论
文章已被作者锁定,不允许评论。
-
java HashMap TreeMap(key顺序) LinkedHashMap(插入顺序)学习
2018-06-07 10:27 943java为数据结构中的映射定义了一个接口java.util.M ... -
java RESTful 详解
2018-04-27 11:35 640(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
java 通过HttpsUrlConnection访问接口数据
2018-04-19 11:25 981server: ssl: key-stor ... -
java 使用多线程的场景总结
2018-04-10 14:35 1694在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在 ... -
java Enum枚举设置
2018-04-10 10:55 475/** * 数据状态:0:无效,1:有效 **/ ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1611REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
java FYOpenApi实现短信发送
2018-01-02 17:10 11601.配置文件 sms.OpenUrl = http://s ... -
java JSONObject序列化包含Date类型数据的Java对象
2017-12-26 16:31 1611如果Date.class无法进行转换则使用Timestamp. ... -
java 用HttpsURLConnection进行传递中文时错误总结
2017-12-07 16:42 649传递中文时需要用Writer而不是OutputStream ... -
java 内存泄漏
2017-11-27 13:51 4901.内存溢出 out of memory ... -
ActiveMQ 三种发送消息方式(同步,异步,单向)
2017-11-17 10:25 2431MQ 发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、 ... -
java Guava ListenableFuture实现线程回调功能
2017-11-14 10:17 1773java Future具有局限性。在实际应用中,当需要下 ... -
java Curator实现分布式锁
2017-09-05 14:39 1085Curator实现分布式锁主要依赖于zookeeper ... -
java Guava工具集学习(强大)
2017-09-05 10:28 429import java.util.Iterator ... -
java CyclicBarrier进行并发编程
2017-08-25 15:44 665CyclicBarrier允许一组线程相互等待达到一个公共的障 ... -
java 几种性能优化的总结
2017-08-23 14:08 3161、使用StringBuilder 一般 ... -
java 使用kyro进行高性能序列化对象和集合
2017-08-23 14:05 2145import java.io.ByteArrayInp ... -
java 对重复电话号码进行排除的优化(排序和前后对比)
2017-08-22 14:14 7841.先对10万数据排序; 2.对比前后两条数据 ; 3.筛 ... -
ActiveMQ 结合Spring进行数据同步
2017-07-19 15:27 580注意事项hibernate配置文件必须设置自动提交否则不能插入 ... -
java 通过反射原理进行复制操作
2017-07-10 14:24 504// 这些实例的对象字段[sCode] String ...
相关推荐
5. WeakHashMap:键使用弱引用,当键不再被引用时,键值对会被自动删除。 Map的遍历方式: 1. for-each循环:使用增强for循环遍历Map的entrySet()。 2. Iterator迭代器:通过Map的entrySet().iterator()获取迭代器...
WeakHashMap是弱引用map,就是Key键是一个弱引用的键,如果Key键被回收,则在get该map中值后,会自动remove掉value。如果Key键始终被强引用,则是无法被回收的;注意Value是被强引用的,所以不要让Value间接的引用了...
Map<Key, Value> map = new WeakHashMap(); ``` 3. **合理使用静态变量**:尽量减少静态变量的使用,特别是不要让静态变量引用可变对象。 4. **及时清理监听器和回调函数中的引用**:当不再需要监听器或回调函数...
12. WeakHashMap:键使用弱引用的Map,当键不再被引用时,条目会自动从Map中移除。 13. Timer和TimerTask:定时任务调度,可以安排一次或周期性的任务执行。 14. Bitset:位集,用于高效存储和操作位标志。 15. ...
弱表格(WeakTables),如Java中的WeakHashMap,通常是弱引用使用的典型场景。弱表格中,键(key)与值(value)之间的循环引用会导致垃圾收集器无法收集这些元素,即使它们从外部不再可达。这在某些类型的应用中...
- `WeakHashMap`:基于弱引用的键,适用于缓存场景,当没有强引用指向键时,键会被垃圾回收器回收。 #### ArrayList与LinkedList对比 - `ArrayList`在随机访问时效率高于`LinkedList`,因为`LinkedList`需要从头...
除了上述实现类,还有WeakHashMap、IdentityHashMap等特殊用途的Map实现,它们分别处理弱引用和比较对象引用相等的情况。 在实际开发中,选择合适的Map实现类取决于具体需求,如是否需要有序、是否考虑线程安全、...
TreeMap则按照Key进行排序,而WeakHashMap使用弱引用键,有助于防止内存泄漏。 4. ConcurrentHashMap和Hashtable:ConcurrentHashMap是线程安全的Map,采用了分段锁策略,比Hashtable在多线程环境下表现更优。它在...
- `WeakHashMap`:键是弱引用,这意味着当键对象没有强引用时,键值对会被垃圾回收器回收,适用于缓存场景。 #### 遍历Collection 所有`Collection`的实现都支持`iterator()`方法,用于遍历集合中的元素。通过迭代...
LinkedHashMap保持了元素的插入顺序,WeakHashMap允许弱引用键,当键不再被引用时,键值对会自动移除。IdentityHashMap使用对象的引用相等性作为判断键是否相同的依据,而非equals()方法的返回值。 在性能方面,...
`WeakHashMap`则允许键为弱引用,当键不再被引用时,键值对会被自动移除。 选择集合类时,需要考虑以下因素: - **API**:选择符合需求的接口和实现,如需要保持元素排序则选择`SortedSet`或`SortedMap`的实现。 - ...
- **WeakHashMap**:弱引用类型,当没有强引用指向键时,键可以被垃圾回收。 - **Hashtable**:线程安全,但由于使用synchronized关键字同步整个映射,在高并发环境下性能较差。 #### 二、Collection接口详解 - ...
在Java编程中,WeakHashMap是一种特殊的哈希表,它的键(Key)是弱引用,当键被垃圾回收器清除后,即使有值(Value)存在,该条目也会自动从哈希表中移除。 线程死锁的原因通常包括以下几点: 1. **资源互斥**:每...
`WeakHashMap`是一种特殊的`HashMap`,其键使用弱引用,一旦键不再被引用,就会被垃圾回收。`HashTable`是线程安全的`Map`实现,但不推荐在现代Java中使用,因为它性能较差且不支持`null`值。 在选择集合实现时,...
#弱对象池问题您是否曾经想跟踪一堆对象而不直接引用它们,以免使用弱引用干扰它们的自然生命周期? 您是否曾经尝试过在运行时扩展Java对象?解决方案WeakObjectPool :用于保存和扩展[弱引用的对象]的池( “ ...
- **`WeakHashMap`**:一种特殊类型的`HashMap`,它使用弱引用作为键。这意味着当键不再被其他地方引用时,它们可以从映射中删除以回收内存。 - **`Hashtable`**:这是最早的`Map`实现之一,它是线程安全的,但效率...
- **WeakHashMap**和**IdentityHashMap**:特殊类型的Map,WeakHashMap的键使用弱引用,键在不再被引用时会被自动清理;IdentityHashMap使用对象的引用地址而非equals()方法来判断键的相等性。 4. **关联操作** -...
- **WeakHashMap**: 这种实现使用弱引用作为键,主要用于缓存场景,当没有强引用指向这些键时,这些键就会被垃圾回收器回收,从而释放内存空间。 - **IdentityHashMap**: 在这种实现中,键的相等性是由`==`操作符而...