专栏首页JAVA人生/面试技巧Java中Map,List与Set的区别

Java中Map,List与Set的区别

首先,数组和集合的区别:

  • 数组是大小固定的
  • 集合可以存储和操作数目不固定的一组数据,集合只能存放引用类型的的数据,不能存放基本数据类型

特性

List

  • 允许重复
  • 有序
  • 继承自Connection

Set

  • 不允许重复
  • 无序
  • 继承自Connection

Map

  • 键值对
  • 区别与ListSet,既没有继承也没有实现Connection

场景

三者各自适用什么样的场景?

List

  • 使用索引对元素进行访问 ArrayList适合快速查找,LinkedList适合增删元素
  • 对有序有需求

Set

  • 确保元素的唯一性 常用的Set有:HashSetLinkedHashSetTreeSet。其中,TreeSet中的元素可以使用Comparator 或者 Comparable 进行排序;LinkedHashSet也按照元素的插入顺序对它们进行存储

Map

  • 希望以键值对的形式存在 常用的Map有:HashMapLinkedHashSetTreeMap。其中HashMap是无序的,LinkedHashSet有序,TreeMap可通过Comparator 或者 Comparable 进行排序 另外HashTable也可以实现键值对,并且相对于HashMap是线程安全的,但是由于JAVA5以上 ConcurrentHashMap是线程安全的,但现在已经基本被HashMap取代

怎么让HashMap同步?

  • synchronizeMap
Map m = Collections.synchronizeMap(hashMap);
  • JAVA5以上 ConcurrentHashMapHashTable的替代 (即线程安全的)

关于List<Map<String, Object>>理解

首先map<String,Object>是定义了一个Map集合变量,然后list<map<String,Object>>是定义了一个List的集合变量,是map的一个集合;map是那个list的其中一个值。 List<Map<String,Object> list=new ArrayList<Map<String,Object>>; Map<String,Object> map=new HashMap<String,Object>; list.add(map);//map是list中的其中一个值。

List集合中的对象是一个Map对象,而这个Map对象的键是String类型,值是Object类型

package com.test;

import java.util.*;

public class MyTest01 {
public static void main(String[] args) {

List<Map<String, Object>> listMaps = new ArrayList<Map<String, Object>>();

Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("1", "a");
map1.put("2", "b");
map1.put("3", "c");
listMaps.add(map1);

Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("11", "aa");
map2.put("22", "bb");
map2.put("33", "cc");
listMaps.add(map2);

for (Map<String, Object> map : listMaps) {
for (String s : map.keySet()) {
System.out.print(map.get(s) + " ");
}
}
System.out.println();
System.out.println("========================");
for (int i = 0; i < listMaps.size(); i++) {
Map<String, Object> map = listMaps.get(i);
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String string = (String) iterator.next();
System.out.println(map.get(string));
}
}
System.out.println("++++++++++++++++++++++++++++");
for (Map<String, Object> map : listMaps) {
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.print(m.getKey() + " ");
System.out.println(m.getValue());
}
}
System.out.println("-----------------------------");
}
}

List<Map<String, Object>>存放的对象问题

一、提出问题 代码一:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
public static void main(String args[]) {
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); 
Map<String, Object> map = new HashMap<String, Object>(); 
for(int i=0;i<5;i++) {
//    Map<String, Object> map = new HashMap<String, Object>(); 
map.put("a", i); 
map.put("b", i); 
list.add(map); 
} 
System.out.println(list);
}
}

代码二:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
public static void main(String args[]) {
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); 
//    Map<String, Object> map = new HashMap<String, Object>(); 
for(int i=0;i<5;i++) {
Map<String, Object> map = new HashMap<String, Object>(); 
map.put("a", i); 
map.put("b", i); 
list.add(map); 
} 
System.out.println(list);
}
}
 

二、给出答案 猜猜看代码一二运行的结果分别是啥?

没错,就是:

代码一:

[{a=4,b=4},{a=4,b=4},{a=4,b=4},{a=4,b=4},{a=4,b=4}] 代码二:

[{a=0,b=0},{a=1,b=1},{a=2,b=2},{a=3,b=3},{a=4,b=4}]

三、问题分析 代码一中,List<Map<String, Object>>里面存放的是map对象的地址,尽管循环了五次,但是每次的map对象对应的都是同一个地址,即listMap里面存放的是五个同样的map对象。 代码二中,每次循环的时候都实例化一个新的map对象,这样list在执行add方法的时候,每次都是存的不一样的map对象。 可以通过debug来观察list存放的map对象对应的id。如图:

代码一:

代码二:

四、总结 通过上面的分析,我们可以知道,以后需要创建不同的map对象的时候,需要在循环里面进行map的创建。

而不是在循环体外面,因为List<Map<String, Object>>指向的是map对象的地址。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java中Map,List与Set的区别

    数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 ja...

    似水的流年
  • Java|Map、List与Set的区别

    黄小怪
  • List、Set、Map的区别

    转载自 https://www.cnblogs.com/IvesHe/p/6108933.html

    allsmallpig
  • java集合中list、set、map接口间的区别

    collection 接口list接口元素是有顺序的,元素可以重复因为每个元素有自己的角标(索引)set接口元素是无序的,且不可以重复(存入和取出的顺序不一定一...

    用户7886150
  • java中 List,Set,Map有什么具体区别?

    ArraryList是List的其中一个实现类,我们常用的集合,底层是动态数组,它可以存储null值和任何类型的数据;他的初始化大小在源码中是private s...

    用户8870853
  • List,Set,Map三者的区别

    查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这...

    崔笑颜
  • c++ list, vector, map, set 区别与用法比较

    List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实...

    hbbliyong
  • 深入理解Java中的List、Set与Map集合

    谭庆波
  • Java中如何遍历List , Set, Map

    Java中 List , Set 有共同的父类, 就是Collection. 所有实现Collection的接口的类都有一个iterator方法,用以返回一个...

    louiezhou001
  • 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了。ArrayList是用于实现动态数组...

    用户1105954
  • Java中Set与Set<?>到底区别在哪?

    您可能知道,无界通配符 Set<?> 可以容纳任何类型的元素,而原始类型Set也可以容纳任何类型的元素。那它们之间有什么区别呢?

    淡定的蜗牛
  • 【深入理解java集合系列】List,Set,Map用法以及区别

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一...

    爱笑的架构师
  • 华为三面:说说List、Map和Set有什么区别!

    集合类是Java开发最常用的工具,也是面试经常会问到的问题。Java提供了高性能的集合框架,主要包括两种容器类型:一种是集合(Collection),存储一个元...

    Java程序猿
  • Java 类集框架(Set, List, Map)的使用

    Set 接口和 List 接口都是 Collection 的子接口,因此我们先看看Collection 接口中有什么方法:

    Java团长
  • Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

    Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 ArrayList 和Vector是采用...

    郭耀华
  • set与frozenset的区别

    同多数语言一样,set表示集合,最重要的特性就是无序,所以Python中的set不支持indexing,但支持len(set),x in set 等操作。 s...

    用户2936342
  • List与List<?>的区别何在

    泛型是Java最基础的语法之一,不过这种语法依然有值得一说的地方:如果仅停留在泛型的基本使用上,泛型当然很简单;但如果从字节码层次来看泛型,将会发现更多泛型的本...

    疯狂软件李刚
  • Java的map和Go的map的区别

    我们先说Java 的HashMap 跟Go map的实现的共同点,1.都是利用 键值对的 key 得到一个 hashCode,算出桶的位置,什么是桶 其实就是一...

    人生海海山山而川
  • 介绍下 Set、Map、WeakSet 和 WeakMap 的区别?

    向 Set 加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equ...

    Javanx

扫码关注云+社区

领取腾讯云代金券