Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中Map,List与Set的区别

Java中Map,List与Set的区别

作者头像
阮键
发布于 2020-07-28 07:04:47
发布于 2020-07-28 07:04:47
93100
代码可运行
举报
运行总次数:0
代码可运行

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

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

特性

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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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>>存放的对象问题

一、提出问题 代码一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}
}

代码二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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对象的地址。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)
本人记录,因为基础比较差整理出来方便自己学习; 同样也希望可以对大家有帮助,有可以优化的地方的意见和建议,欢迎提出,鄙人虚心接受,认真改正;
默 语
2024/11/20
2740
Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)
Java中的Map及其使用「建议收藏」
概述: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 Map接口和Collection接口的不同 Map是双列的,Collection是单列的 Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
全栈程序员站长
2022/09/08
5460
Java中的Map及其使用「建议收藏」
Java中list<Object[]>、list<Student>、list<Map<String,String>>排序
1:list<Object[]>的排序 public static void main(String[] args) { // TODO Auto-generated method stub Object[] o1=new Object[4]; o1[0]="5"; o1[1]="o1"; o1[2]="o11"; o1[3]="o111"; Object[] o2=new Object[4]; o2[0]="3"; o2[1]="o2"; o2[2]="o22"; o2[3]="o
cMusketeer
2018/03/28
3.7K0
Java中list<Object[]>、list<Student>、list<Map<String,String>>排序
Java基础入门笔记06——String类和StringBuffer类,Java中的三大集合,Set集合,List集合,Map集合,Collection类
存储过程: 当HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,从而决定该对象在HashSet中的位置
全栈程序员站长
2022/09/21
6670
java之集合(Set、List、Map)
HashSet是Set接口的典型实现,大多数时候使用Set集合时都会使用这个实现类。我们大多数时候说的Set集合指的就是HashSet。
西西嘛呦
2020/08/26
5240
JAVA零基础小白学习免费教程day14-Set&HashMap
java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
张哥编程
2024/12/13
880
Java集合框架
1.集合和数组的区别 数组长度是固定的,集合长度是可变的 数组可以存储基本类型和引用类型,集合只能存储引用类型 2.Collection体系集合 List接口的特点: 有序、有下标、元素可重复 Set接口的特点: 无序、无下标、元素不能重复 2.1Collection父接口 特点:代表一组任意类型的对象,无序、无下标、不能重复 方法: boolean add(Object obj) //添加一个对象 boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合中 void
用户7353950
2022/06/23
2.4K0
Java : List<Map>中 根据map的某个key去重
初始数据:[{name=张三, id=1123}, {name=李四, id=2}, {name=王五, id=1123}, {name=赵六, id=3}] 去重之后:[{name=李四, id=2}, {name=赵六, id=3}, {name=张三, id=1123}]
执笔记忆的空白
2020/12/24
5.4K1
List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
☀️相关笔记章节: 🌹java 1.8 stream使用总结(个人总结有一些经典文章的集合) 🌹遍历 ArrayList和遍历 Map的几种方式 🌹Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) 🌹List,Map多层循环嵌套Demo及其理解 🌹List,Map 三种遍历方式:(总结理解) 🌹List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
默 语
2024/11/20
3760
List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
java.util.Map——Map集合的常用方法「建议收藏」
开发中最常用的就是List集合和Map集合,Map集合是基于java核心类——java.util中的;Map集合用于储存元素对,Map储存的是一对键值(key和value),是通过key映射到它的value;下面介绍的是Map集合的一些经常用到的方法以及代码示例。
全栈程序员站长
2022/08/23
3320
深入浅出 Map 的实现(HashMap、HashTable、LinkedHashMap、TreeMap)
HashMap、TreeMap、HashTable、LinkedHashMap 共同实现了接口java.util.Map, 都是键值对形式,且map的key不允许重复
执笔记忆的空白
2020/12/25
1.5K0
JAVA合并两个具有相同key的map为list
JAVA合并两个具有相同key的map为list,不多说,直接上代码: public class MapUtil { public static void main(String[] args){ List<Map<String,String>> osvList = new ArrayList<>(); Map<String,String> map1 = new HashMap<>(); map1.put("osV","5.1");
一诺千金
2020/04/25
5.2K0
Java Map集合的详解「建议收藏」
如果程序中存储了几百万个学生,而且经常需要使用学号来搜索某个学生,那么这个需求有效的数据结构就是Map。
全栈程序员站长
2022/09/02
7340
简析Map及Map集合的遍历解析、排序
其实Android对Java基础的要求并不高,虽然Android是基于Java的,但是Android有更多它自己的东西。
yechaoa
2022/06/10
9240
简析Map及Map集合的遍历解析、排序
Java之HashMap详解
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
用户5224393
2019/08/20
1.5K0
Java Collection与Map详解
所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了lterator接口的对象,即可以返回一个迭代器。
timerring
2023/05/03
1.3K0
Java Collection与Map详解
权限菜单数据无限级遍历返回json结构数据
权限菜单数据无限级遍历返回json结构数据,我这里整理2种方法,一种循环方式的,一种递归方式的 循环方式遍历 @Test public void test2(){ Long time1 = System.currentTimeMillis(); Map map1 = new HashMap(); map1.put("id",1); map1.put("pid",""); Map map2 = new HashMap(); map2.put("id",2
4xx.me
2022/06/09
6940
Java中如何遍历List , Set, Map
Java中 List , Set 有共同的父类, 就是Collection. 所有实现Collection的接口的类都有一个iterator方法,用以返回一个Iterator接口的对象.
louiezhou001
2020/03/11
1.9K0
Gson将map转换成JsonObject出现null值
Exception in thread “main” java.lang.IllegalStateException: Not a JSON Object: null at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:84)
全栈程序员站长
2022/11/09
9830
【Map vs Set】:Java数据存储的“双子星”对决
所以当需要动态查找时,即查找时要进行一些插入和删除,上述的方法并不适用 。如:在学生系统中,快速查找学生的成绩、统计单词出现的次数、确保用户名唯一(去重)。
喜欢做梦
2025/02/15
1190
【Map vs Set】:Java数据存储的“双子星”对决
推荐阅读
相关推荐
Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验