精华内容
下载资源
问答
  • 主要介绍了JAVA8独有的map遍历方式(非常好用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 自己整理的map遍历的方式及性能分析,欢迎批评指正哈哈
  • map遍历的四种方法

    2015-12-07 11:08:15
    详细介绍啦遍历map的几种方式,好吧,共有四种方式
  • 今天小编就为大家分享一篇关于golang中range在slice和map遍历中的注意事项,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 主要介绍了原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作,结合实例形式分析了JS使用forEach()和map()以及jQuery使用$.each、$.map进行遍历操作相关技巧与操作注意事项,需要的朋友可以...
  • 相信大家在日常的开发过程中,经常需要对List或Map里面的符合某种业务的数据进行删除,但是如果不了解里面的...下面这篇文章将会给大家详细介绍Java如何在List和Map遍历过程中删除元素,有需要的朋友们可以参考借鉴。
  • Freemarker 遍历Map数据

    2021-01-07 04:19:22
    数据模型: @RequestMapping(/freemarker) @Controller public class FreemarkerController { //测试1 @RequestMapping(/test1) public String test1(Model model){ //向数据模型放数据 model.addAttribute(name...
  • 主要提供java中的map遍历实例及效率比较
  • map遍历的三种方法

    2011-08-29 10:23:47
    map遍历的三种方法map遍历的三种方法map遍历的三种方法
  • jdk1.8 Map遍历

    千次阅读 2020-06-21 15:41:50
    Map<Integer, Integer> map = new HashMap<Integer, Integer>(); map.put(1, 10); map.put(2, 20); map.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    map.put(1, 10);
    map.put(2, 20);
    map.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
    
    展开全文
  • 文章目录map遍历过程中的操作问题问题复现 map遍历过程中的操作问题 问题复现  今天在

    map遍历过程中的操作问题

    问题复现

     今天在周赛的过程中,建立了一个treeMap存储数据,想在遍历map的过程中添加新的元素进入map中,然后出现了ConcurrentModificationException。
    代码复现

    @Test
        public void test(){
            Map<Integer, Integer> map = new HashMap<>();
            map.put(0, 1);
            map.put(1, 1);
            map.put(2, 1);
            for(int key : map.keySet()){
                map.put(key + 1, 1);
                map.put(key + 2, 1);
            }
            for(int val : map.values()){
                System.out.println(val);
            }
        }
    

    出现异常
    可以看到,抛出了一个异常,无法在遍历的时候增加新的元素。

    问题原因

     该问题出现的原因就是因为在遍历过程中会维护modCount和expectCount两个变量,如果在遍历的过程中进行了remove等操作,会导致modCount修改次数和预期修改次数expectCount不一致,从而抛出异常。

    解决方法

    1. 在遍历时移除元素:可以使用迭代器的remove方法。

    需要注意的时,在遍历过程中不能将map中所有的元素都移除,这样会抛出异常,需要保留一个元素。

        @Test
        public void test(){
            Map<Integer, Integer> map = new HashMap<>();
            map.put(0, 1);
            map.put(1, 1);
            map.put(2, 1);
            Iterator<Integer> iterator = map.keySet().iterator();
            while(iterator.hasNext()){
                if(iterator.next() == 1)
                iterator.remove();
            }
            for(int val : map.values()){
                System.out.println(val);
            }
    
        }
    
    
    1. 修改元素,可以使用setValue()方法
        @Test
        public void test(){
            Map<Integer, Integer> map = new HashMap<>();
            map.put(0, 1);
            map.put(1, 1);
            map.put(2, 1);
            Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry<Integer, Integer> it = iterator.next();
                it.setValue(2);
            }
            for(int val : map.values()){
                System.out.println(val);
            }
    
        }
    
    

    知识有限,还不知道有什么方便的方法可以在遍历的过程中向map中添加元素。

    展开全文
  • vue中map遍历对象数组

    千次阅读 2020-08-10 09:21:18
    今天在写map遍历对象数组的时候,vue提示报错 :陷入了更新死循环,原因是遍历操作修改了原数组对象,导致map又一次触发,因此正确做法是map操作时不能改变原数组。 data() { return { names: [ { id: 1, name:...

    前言

    今天在写map遍历对象数组的时候,vue提示报错 :陷入了更新死循环,原因是遍历操作修改了原数组对象,导致map又一次触发,因此正确做法是map操作时不能改变原数组
    在这里插入图片描述

      data() {
          return {
            names: [
              { id: 1, name: '张三', age: 20 },
              { id: 2, name: '李四', age: 8 },
              { id: 3, name: '张三', age: 18 }
            ]
          }
        },
        methods: {
          fun1() {
            return this.names.filter((item) => {
              return item.age >= 18
            })
          },
          fun2() {
            return this.names.map((item) => {
              item.age = item.age + 1 //age++
              return item
            })
    
          },
    

    正确做法:

        data() {
          return {
            names: [
              { id: 1, name: '张三', age: 20 },
              { id: 2, name: '李四', age: 8 },
              { id: 3, name: '张三', age: 18 }
            ]
          }
        },
        methods: {
          fun2() {
            return this.names.map((item) => {
              temp = JSON.parse(JSON.stringify(item))//为了防止错误发生,采用深拷贝
              temp.age = item.age + 1
              return temp
            })
    

    对象是 JavaScript 的基本块。对象是属性的集合,属性是键值对。JavaScript 中的几乎所有对象都是位于原型链顶部 Object 的实例。

    介绍

    如你所知,赋值运算符不会创建一个对象的副本,它只分配一个引用,我们来看下面的代码:

    JavaScript 代码:
      
    1. let obj = {
    2. a: 1,
    3. b: 2,
    4. };
    5. let copy = obj;
    6.  
    7. obj.a = 5;
    8. console.log(copy.a);
    9. // 结果
    10. // copy.a = 5;

    —> Edit on JS Bin

    obj 变量是一个新对象初始化的容器。copy 变量指向同一个对象,是对该对象的引用。所以现在有两种方式可以访问这个 { a: 1, b: 2, } 对象。你必须通过 obj 变量或 copy 变量,无论你是通过何种方式对这个对象进行的任何操作都会影响该对象。

    不变性(Immutability)最近被广泛地谈论,这个很重要!上面示例的方法消除了任何形式的不变性,如果原始对象被你的代码的另一部分使用,则可能导致bug。

    复制对象的原始方式

    复制对象的原始方法是循环遍历原始对象,然后一个接一个地复制每个属性。我们来看看这段代码:

    JavaScript 代码:
      
    1. function copy(mainObj) {
    2. let objCopy = {}; // objCopy 将存储 mainObj 的副本
    3. let key;
    4.  
    5. for (key in mainObj) {
    6. objCopy[key] = mainObj[key]; // 将每个属性复制到objCopy对象
    7. }
    8. return objCopy;
    9. }
    10.  
    11. const mainObj = {
    12. a: 2,
    13. b: 5,
    14. c: {
    15. x: 7,
    16. y: 4,
    17. },
    18. }
    19.  
    20. console.log(copy(mainObj));

    —> Edit on JS Bin

    存在的问题

    1. objCopy 对象具有一个新的 Object.prototype方法,这与 mainObj 对象的原型方法不同,这不是我们想要的。我们需要精确的拷贝原始对象。
    2. 属性描述符不能被复制。值为 false 的 “可写(writable)” 描述符在 objCopy 对象中为 true
    3. 上面的代码只复制了 mainObj 的可枚举属性。
    4. 如果原始对象中的一个属性本身就是一个对象,那么副本和原始对象之间将共享这个对象,从而使其各自的属性指向同一个对象。

    ——— 注,开始 ——

    关于第2点中的 writable 属性:

    writable 设置为false时,表示不可写,也就是说属性不能被修改。

    JavaScript 代码:
      
    1. var o = {}; // Creates a new object
    2.  
    3. Object.defineProperty(o, 'a', {
    4. value: 37,
    5. writable: false
    6. });
    7.  
    8. console.log(o.a); // logs 37
    9. o.a = 25; // No error thrown
    10. // (it would throw in strict mode,
    11. // even if the value had been the same)
    12. console.log(o.a); // logs 37. The assignment didn't work.
    13.  
    14. // strict mode
    15. (function() {
    16. 'use strict';
    17. var o = {};
    18. Object.defineProperty(o, 'b', {
    19. value: 2,
    20. writable: false
    21. });
    22. o.b = 3; // throws TypeError: "b" is read-only
    23. return o.b; // returns 2 without the line above
    24. }());

    正如上例中看到的,修改一个 non-writable 的属性不会改变属性的值,同时也不会报异常。

    详细查看:MDN 文档

    ——— 注,开始 ——

    浅拷贝对象

    当拷贝源对象的顶级属性被复制而没有任何引用,并且拷贝源对象存在一个值为对象的属性,被复制为一个引用时,那么我说这个对象被浅拷贝。如果拷贝源对象的属性值是对象的引用,则只将该引用值复制到目标对象。

    浅层复制将复制顶级属性,但是嵌套对象将在原始(源)对象和副本(目标)对象之间是共享。

    使用 Object.assign() 方法

    Object.assign() 方法用于将从一个或多个源对象中的所有可枚举的属性值复制到目标对象。

    JavaScript 代码:
      
    1. let obj = {
    2. a: 1,
    3. b: 2,
    4. };
    5. let objCopy = Object.assign({}, obj);
    6. console.log(objCopy);
    7. // Result - { a: 1, b: 2 }

    —> Edit on JS Bin

    到目前为止。我们创建了一个 obj 的副本。让我们看看是否存在不变性:

    JavaScript 代码:
      
    1. let obj = {
    2. a: 1,
    3. b: 2,
    4. };
    5. let objCopy = Object.assign({}, obj);
    6.  
    7. console.log(objCopy); // result - { a: 1, b: 2 }
    8. objCopy.b = 89;
    9. console.log(objCopy); // result - { a: 1, b: 89 }
    10. console.log(obj); // result - { a: 1, b: 2 }

    —> Edit on JS Bin

    在上面的代码中,我们将 objCopy 对象中的属性 b 的值更改为 89 ,并且当我们在控制台中 log 修改后的 objCopy 对象时,这些更改仅应用于 objCopy 。我们可以看到最后一行代码检查 obj 对象并没有被修改。这意味着我们已经成功地创建了拷贝源对象的副本,而且它没有引用。

    Object.assign()的陷阱

    不要高兴的太早! 虽然我们成功地创建了一个副本,一切似乎都正常工作,记得我们讨论了浅拷贝? 我们来看看这个例子:

    JavaScript 代码:
      
    1. let obj = {
    2. a: 1,
    3. b: {
    4. c: 2,
    5. },
    6. }
    7. let newObj = Object.assign({}, obj);
    8. console.log(newObj); // { a: 1, b: { c: 2} }
    9.  
    10. obj.a = 10;
    11. console.log(obj); // { a: 10, b: { c: 2} }
    12. console.log(newObj); // { a: 1, b: { c: 2} }
    13.  
    14. newObj.a = 20;
    15. console.log(obj); // { a: 10, b: { c: 2} }
    16. console.log(newObj); // { a: 20, b: { c: 2} }
    17.  
    18. newObj.b.c = 30;
    19. console.log(obj); // { a: 10, b: { c: 30} }
    20. console.log(newObj); // { a: 20, b: { c: 30} }
    21.  
    22. // 注意: obj.b.c = 30; 为什么呢..

    —> Edit on JS Bin

    obj.b.c = 30 ?

    这就是 Object.assign() 的陷阱。Object.assign 只是浅拷贝。 newObj.bobj.b 都引用同一个对象,没有单独拷贝,而是复制了对该对象的引用。任何对对象属性的更改都适用于使用该对象的所有引用。我们如何解决这个问题?继续阅读…我们会在下一节给出修复方案。

    注意:原型链上的属性和不可枚举的属性不能复制。 看这里:

    JavaScript 代码:
      
    1. let someObj = {
    2. a: 2,
    3. }
    4.  
    5. let obj = Object.create(someObj, {
    6. b: {
    7. value: 2,
    8. },
    9. c: {
    10. value: 3,
    11. enumerable: true,
    12. },
    13. });
    14.  
    15. let objCopy = Object.assign({}, obj);
    16. console.log(objCopy); // { c: 3 }

    —> Edit on JS Bin

    someObj 是在 obj 的原型链,所以它不会被复制。
    属性 b 是不可枚举属性。
    属性 c 具有 可枚举(enumerable) 属性描述符,所以它可以枚举。 这就是为什么它会被复制。

    深度拷贝对象

    深度拷贝将拷贝遇到的每个对象。副本和原始对象不会共享任何东西,所以它将是原件的副本。以下是使用 Object.assign() 遇到问题的修复方案。让我们探索一下。

    使用 JSON.parse(JSON.stringify(object));

    这可以修复了我们之前提出的问题。现在 newObj.b 有一个副本而不是一个引用!这是深度拷贝对象的一种方式。 这里有一个例子:

    JavaScript 代码:
      
    1. let obj = {
    2. a: 1,
    3. b: {
    4. c: 2,
    5. },
    6. }
    7.  
    8. let newObj = JSON.parse(JSON.stringify(obj));
    9.  
    10. obj.b.c = 20;
    11. console.log(obj); // { a: 1, b: { c: 20 } }
    12. console.log(newObj); // { a: 1, b: { c: 2 } } (一个新的对象)

    不可变性: ?

    —> Edit on JS Bin

    陷阱

    不幸的是,此方法不能用于复制用户定义的对象方法。 见下文。

    复制对象方法

    方法是一个对象的属性,它是一个函数。在以上的示例中,我们还没有复制对象的方法。现在让我们尝试一下,使用我们学过的方法来创建副本。

    JavaScript 代码:
      
    1. let obj = {
    2. name: 'scotch.io',
    3. exec: function exec() {
    4. return true;
    5. },
    6. }
    7.  
    8. let method1 = Object.assign({}, obj);
    9. let method2 = JSON.parse(JSON.stringify(obj));
    10.  
    11. console.log(method1); //Object.assign({}, obj)
    12. /* result
    13. {
    14. exec: function exec() {
    15. return true;
    16. },
    17. name: "scotch.io"
    18. }
    19. */
    20.  
    21. console.log(method2); // JSON.parse(JSON.stringify(obj))
    22. /* result
    23. {
    24. name: "scotch.io"
    25. }
    26. */

    —> Edit on JS Bin

    结果表明,Object.assign() 可以用于复制对象的方法,而使用 JSON.parse(JSON.stringify(obj)) 则不行。

    复制循环引用对象

    循环引用对象是具有引用自身属性的对象。让我们使用已学的复制对象的方法来复制一个循环引用对象的副本,看看它是否有效。

    使用 JSON.parse(JSON.stringify(object))

    让我们尝试使用 JSON.parse(JSON.stringify(object))

    JavaScript 代码:
      
    1. // 循环引用对象
    2. let obj = {
    3. a: 'a',
    4. b: {
    5. c: 'c',
    6. d: 'd',
    7. },
    8. }
    9.  
    10. obj.c = obj.b;
    11. obj.e = obj.a;
    12. obj.b.c = obj.c;
    13. obj.b.d = obj.b;
    14. obj.b.e = obj.b.c;
    15.  
    16. let newObj = JSON.parse(JSON.stringify(obj));
    17.  
    18. console.log(newObj);

    —> Edit on JS Bin

    结果是:

    很明显,JSON.parse(JSON.stringify(object)) 不能用于复制循环引用对象。

    使用 Object.assign()

    让我们尝试使用 Object.assign()

    JavaScript 代码:
      
    1. // 循环引用对象
    2. let obj = {
    3. a: 'a',
    4. b: {
    5. c: 'c',
    6. d: 'd',
    7. },
    8. }
    9.  
    10. obj.c = obj.b;
    11. obj.e = obj.a;
    12. obj.b.c = obj.c;
    13. obj.b.d = obj.b;
    14. obj.b.e = obj.b.c;
    15.  
    16. let newObj2 = Object.assign({}, obj);
    17.  
    18. console.log(newObj2);

    —> Edit on JS Bin

    结果是:

    Object.assign() 适用于浅拷贝循环引用对象,但不适用于深度拷贝。随意浏览浏览器控制台上的循环引用对象树。我相信你会发现很多有趣的工作在那里。

    使用展开操作符(…)

    ES6已经有了用于数组解构赋值的 rest 元素,和实现的数组字面展开的操作符。看一看这里的数组的展开操作符的实现:

    JavaScript 代码:
      
    1. const array = [
    2. "a",
    3. "c",
    4. "d", {
    5. four: 4
    6. },
    7. ];
    8. const newArray = [...array];
    9. console.log(newArray);
    10. // 结果
    11. // ["a", "c", "d", { four: 4 }]

    —> Edit on JS Bin

    对象字面量的展开操作符目前是ECMAScript 的第 3 阶段提案。对象字面量的展开操作符能将源对象中的可枚举的属性复制到目标对象上。下面的例子展示了在提案被接受后复制一个对象是多么的容易。

    JavaScript 代码:
      
    1. let obj = {
    2. one: 1,
    3. two: 2,
    4. }
    5.  
    6. let newObj = { ...z };
    7.  
    8. // { one: 1, two: 2 }

    注意:这将只对浅拷贝有效

    结论

    在 JavaScript 中复制对象可能是相当艰巨的,特别是如果您刚开始使用 JavaScript 并且不了解该语言的方式。希望本文帮助您了解并避免您可能遇到复制对象的陷阱。如果您有任何库或一段代码可以获得更好的结果,欢迎与社区分享。

    原文链接:https://scotch.io/bar-talk/copying-objects-in-javascript

    相关阅读

    展开全文
  • Map 遍历Key - value 方法

    2021-01-25 10:36:05
    import org.junit.Test; import java.util.Collection; import java.util.Collections; import java.util.HashMap;...import java.util.Map; import java.util.Set; public class MapTest { @Test public void Te
    • HashMap :

    作为Map 的主要实现类,线程不安全的,效率高,存储Null 的key —value

    • Hashtable

    作为古老的实现类,线程安全的,效率低,不能存储null的key 和value


    package Com.oyee.study.gather;

    import org.junit.Test;

    import java.util.Collection;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;

    public class MapTest {
    @Test
    public void Test(){
    Map map = new HashMap();
    map.put(1,“小米”);
    map.put(2,“华为”);
    map.put(3,“三星”);
    map.put(4,“苹果”);
    map.put(5,“酷派”);
    // System.out.println(map);
    // 遍历所有的key 集
    Set set = map.keySet();
    Iterator iterator = set.iterator();
    while (iterator.hasNext()){
    System.out.println(iterator.next());
    }

    	//遍历所有的value 集
    	Collection values = map.values();
    	for (Object m :values ){
    		System.out.println(m);
    	}
    	Map map1 = new HashMap();
    		map1.put(6,"锤子");
    		map1.put(7,"锤子");
    		map1.putAll(map1);
    //	System.out.println(map1);
    }
    }
    

    在这里插入图片描述

    	// 遍历所有的key- value 集合
    	Set set1 = map.entrySet();
    	Iterator iterator1 = set1.iterator();
    		while (iterator1.hasNext()){
    			System.out.println(iterator1.next());
    		}
    

    在这里插入图片描述

    展开全文
  • js中 map 遍历数组

    万次阅读 2019-08-27 13:40:52
    forEach()和map()都是遍历数组的方法,用法类似,但是还是有很大区别: 相同点:  1.都是循环遍历数组中的每一项;  2.在遍历中执行匿名函数都可以接收三个参数,分别为:遍历过程的每一项、遍历序号(索引值)、...
  • map赋值+map遍历

    2020-08-01 21:31:14
    一、map赋值 二、map遍历
  • 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方式去遍历。 方法一:在for循环中使用entries实现Map遍历 最常见也是大多数情况下用的最多...
  • Map遍历的四种方式

    2019-07-21 23:26:53
    1. for each 遍历
  • map 遍历时 删除元素

    千次阅读 2019-08-03 09:23:21
    import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator...import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class Test { ...
  • c++map遍历排序

    千次阅读 2020-01-23 19:31:57
    遍历map也有迭代器 1 2 3 4 map<char, int> ::iterator it; for (map<char, int> ::iterator it = ma.begin(); it != ma.end(); it ++){ cout << it->first << ' ' << it...
  • js中遍历Map对象的方法 console.log(jsonData);//火狐控制台打印输出: Object { fileNumber="文件编号", fileName="文件名称"} for(var key in jsonData) console.log("属性:" + key + ",值:"+ jsonData[key]);...
  • 接下来介绍java8的 map遍历 第一种方式:通过k,v遍历 map.forEach((key, value) -> { System.out.println(key+value); }); 第二种方式:通过Map.entrySet遍历,在大容量时推荐使用,也是map遍历中效率...
  • Map遍历(包含jdk1.8新方法)

    千次阅读 2020-04-13 16:42:59
    Java四种遍历方法 Map<String, String> map=new HashMap<String, String>(); map.put(“a”, “rweq1s”); map.put("", “r2weq”); map.put(“1”, “”); map.put(“2”, “”); 1.entrySet()方法 ...
  • react map遍历,react native map遍历

    千次阅读 2019-03-22 16:27:00
    react map遍历(截取部分重要代码) {this.state.images.map((img, i) => { return ( <div className="swiperBox" key={"img" + i}> <p className="swiperP"> Updat...
  • 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方式去遍历。 方法一:在for循环中使用entries实现Map遍历: /** * 最常见也是大多数情况下...
  • map遍历的几种方式和效率问题

    万次阅读 多人点赞 2018-07-05 10:09:21
    一、map遍历的效率 先创建一个map,添加好数据: Map&lt;String, String&gt; map = new HashMap&lt;&gt;(); for (int i = 0; i &lt; 1000000; i++) { map.put(i + "", i + "...
  • Map 遍历的方法(java & kotlin)

    千次阅读 2019-01-30 17:03:14
    一、java 遍历Map 1.map.keySet() 2.Iterator 3.Map.Entry推荐,尤其是容量大时,v&gt; 4.Map.values()遍历所有的value,但不能遍历key 二、kotlin遍历Map 1.map.forEach 2.(key,value) 一、java 遍历Map...
  • freemarker中map遍历

    千次阅读 2019-01-07 16:45:40
    freemarker中map遍历获取值 后台数据:   HashMap&lt;String, String&gt; map = new HashMap&lt;&gt;(); map.put("adf","空间"); map.put("xxx","空间2&...
  • Java Map遍历的六种方式 目录 1、map.keySet()取得key的set集合,foreach遍历 2、map.keySet()取得key的set集合,Iterator游标迭代 3、map.entrySet()方法把map转成Set,foreach遍历 4、map.entrySet()方法把...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475,172
精华内容 190,068
关键字:

map遍历