自学内容网 自学内容网

java和JS 遍历一个Map对象的不同

使用For遍历

let paramMap = { key1: "value1", key2: "value2" };
let jsonObject = {};

Java

JSONObject jsonObject = new JSONObject();
for (Map.Entry<String, String> param : paramMap.entrySet()) {
    jsonObject.put(param.getKey(), param.getValue());
}

JS

for (let key in paramMap) {
    if (paramMap.hasOwnProperty(key)) {
        jsonObject[key] = paramMap[key];
    }
}

Q: 为什么JAVA要使用 paramMap.entrySet 返回一个Set结构才能被 For 遍历呢? 

A: 

• Map本质上是一种映射结构,不支持直接遍历,因为它不是序列化的数据结构(像List或Set那样有顺序的元素)。

• 通过 entrySet(),Map把所有的键值对转换成了一个Set集合,每个元素都是一个 Map.Entry(键值对),这样你就可以用for-each循环来遍历所有的键值对了。

Q:那为什么JS可以直接for in 遍历Map结果,而Java不行  ? -  -

A:简单来说是语言的差异。 

更深层是, Java要求数据结构要明确,实现哪些接口,能做哪些操作都要显式规定(这叫类型安全)。Map 这种映射结构并不是为了遍历而设计的,它只是提供键值对的映射功能(这叫分离职责)。

Java设计中将映射和集合分开,因此遍历Map中的键值对时,需要通过entrySet()方法来获取一个可以遍历的集合。而JavaScript中,对象本身就是可枚举的键值对,因此不需要转换即可遍历。

其实JS 也有跟JAVA很像的遍历对象的方法 

let map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');

for (let [key, value] of map.entries()) {
    console.log(key + ": " + value);
}

// 

这里  entries 跟 java的 entrySet非常类似 - - 都是为了明确区分映射和可遍历集合。


原文地址:https://blog.csdn.net/weixin_43416349/article/details/142833801

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!