使用HashMap须要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()

Map/HashMap是java中一种非经常常使用的数据结构,一般我们在应用中做的事情就是调用put向容器写入数据或者是get从容器读取数据。

Map.entrySet()这种方法返回了键值对的集合,也是JDK官方推荐的遍历Map的方式。

Set<Map.Entry<String, String>> allEntrys = maps.entrySet();

for (Map.Entry<String, String> as : allEntrys)
{
    String key = as.getKey();
	String value = as.getValue();
}

可是我们不应该将Map.entrySet()的返回结果,传递给不可信代码。为什么呢?先看以下一段代码:

 public static void main(String[] args) throws Exception
 {
     HashMap<String, String> maps = new HashMap<String, String>();
     maps.put("name", "xiu");
     maps.put("age", "25");

     System.out.println(maps);// {age=25, name=xiu}

     Set<Map.Entry<String, String>> allEntrys = maps.entrySet();
     Map.Entry<String, String> nameEntry = null;
     for (Map.Entry<String, String> as : allEntrys)
     {
         String key = as.getKey();
         if (key.equals("name"))
         {
             nameEntry = as;
         }
     }
     // 删除entry
     allEntrys.remove(nameEntry);

     System.out.println(maps);// {age=25}
 }

非常明显,我们通过Map.entrySet()的返回结果,可以删除原始HashMap中存储的键值对。假设我们将Set<Map.Entry<String, String>> allEntrys 作为函数參数传递给不可信代码。那么外部的恶意代码就能删除原始HashMap中存储的数据。所以我们应该避免传递Set<Map.Entry<String,
String>>作为函数參数。防止外部代码恶意的或者不小心改动了原始的数据。

这个隐藏的功能不是全部的java程序猿都知道,所以须要注意下,以免编程出错。

时间: 2024-09-29 16:55:20

使用HashMap须要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()的相关文章

使用HashMap需要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()

Map/HashMap是java中一种很常用的数据结构,一般我们在应用中做的事情就是调用put向容器写入数据或者是get从容器读取数据.Map.entrySet()这个方法返回了键值对的集合,也是JDK官方推荐的遍历Map的方式. Set<Map.Entry<String, String>> allEntrys = maps.entrySet(); for (Map.Entry<String, String> as : allEntrys) { String key =

10 HashMap,Map.Entry,LinkedHashMap,TreeMap,Hashtable,Collections类

Map集合的功能概述 添加功能 * V put(K key,V value):添加元素.            * 如果键是第一次存储,就直接存储元素,返回null            * 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值 删除功能 * void clear():移除所有的键值对元素        * V remove(Object key):根据键删除键值对元素,并把值返回 判断功能 * boolean containsKey(Object key):判断集合是否包

从HashMap到LrcCache的源码分析

打算研究android的一个图片加载库Android-Universal-Image-Loader,然后就看到了缓存的策略,于是又看到了LruCache,是一个最近最少使用算法LRU.前几天看操作系统也看到了LRU算法,是用在缺页中断发生时,进行置换算法才用的一种.缓存中的LrcCache和操作系统中的页置换算法思想是一样的,于是心血来潮,决定把这部分实现看看,然后就有了这篇博客,从HashMap的实现到LinkedHashMap再到LruCache,总共包含三个类的源码分析,花费了整整一晚上.

java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象联系起来, * @author lenovo * */ //土拨鼠 public class Groundhog { protected int number; public Groundhog(int n) { number=n; } @Override public String toString() { return "Groundhog #" + number

java该HashTable,HashMap和HashSet

同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的三个集合HashTable,HashSet和HashMap具体解释. 本文文件夹: 1. HashTable和HashMap的差别 2. HashSet和HashMap的差别 3. HashMap,HashSet工作原理 4. HashSet工作原理 5. 常见问题 1. HashTable和HashMap的

深入理解Java中的HashMap的实现原理

HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作为key.也就是能够用一个对象作为key去查找还有一个对象. 在我们探讨HashMap的实现原理之前,我们先自己实现了一个SimpleMap类,该类继承自AbstractMap类. 详细实现例如以下: import java.util.*; public class SimpleMap<K,V>

HashMap源代码剖析

大部分思路都是一样的 .仅仅是一些细节不一样.源代码中都标了出来.jdk容器源代码还是挺简单的. public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { //容量默认值 static final int DEFAULT_INITIAL_CAPACITY = 16; //最大容量 static final int MAXIMUM_CA

【Java集合源代码剖析】HashMap源代码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在參加CSDN博文大赛,假设您喜欢我的文章.希望您能帮我投一票.谢谢! 投票地址:http://vote.blog.csdn.net/Article/Details? articleid=35568011 HashMap简单介绍 HashMap是基于哈希表实现的,每个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,相同会自己

HashMap源码分析(二)--HashMap

话不多说直接上开始 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 初始容量为16 static final int MAXIMUM_CAPACITY = 1 << 30; static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * The bin count threshold for using a tree rather than list for a * bin.