博客
关于我
Java面试之Java集合1——List、Set和Map的区别
阅读量:249 次
发布时间:2019-03-01

本文共 4510 字,大约阅读时间需要 15 分钟。

List、Set和Map的区别

  List Set Map
元素顺序 有序 无序 key无序、value无序
元素是否可重复 可重复 不可重复 key不可重复、value可重复

List

注意:List中存储的元素有序,指的是读出的顺序与存入的顺序是一致的,这叫做有序。比如说List添加了元素1,3,2,那么循环遍历List读出的元素顺序也是1,3,2,而不是1,2,3,这才叫List的存储元素有序。

public class Demo {    public static void main(String[] args) {        List
list = new ArrayList<>(); // 读入的顺序是:1,3,2 list.add(1); list.add(3); list.add(2); // 取出的顺序也是:1,3,2 System.out.println(list); }}/** * 打印结果: * [1, 3, 2] */

元素可重复,指添加到List集合中的元素可以是重复的元素,重复的元素可以是值相等的基本数据类型数据,也可以是重写equals和hashCode方法的对象。

class Person {    private String name;    public Person(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Person person = (Person) o;        return name != null ? name.equals(person.name) : person.name == null;    }    @Override    public int hashCode() {        return name != null ? name.hashCode() : 0;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                '}';    }}public class Demo {    public static void main(String[] args) {        List
list = new ArrayList<>(); // 添加重复元素 list.add(1); list.add(1); list.add(2); System.out.println(list); // 添加重复对象 List
personList = new ArrayList<>(); Person p1 = new Person("张三"); Person p2 = new Person("张三"); personList.add(p1); personList.add(p2); System.out.println(personList); }}/** * 打印结果: * [1, 1, 2] * [Person{name='张三'}, Person{name='张三'}] */

Set

注意:Set存储的元素是无序的,这里的无序指的是存入的顺序与输出的顺序可能是不一致的。例如存入的元素顺序是1,3,2,那么输出的元素顺序可能是1,2,3或者其他,这取决于hashCode值。因为元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,所以输出顺序是按照hashCode值来的。

public class Demo {    public static void main(String[] args) {        Set
set = new HashSet<>(); // 输入元素的顺序是:1,3,2 set.add(1); set.add(3); set.add(2); // 输出元素的顺序是:1,2,3 System.out.println(set); }}/** * 打印结果: * [1, 2, 3] */

Set存储的元素是不允许重复的,无论是基本数据类型的元素还是对象

class Person {    private String name;    public Person(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Person person = (Person) o;        return name != null ? name.equals(person.name) : person.name == null;    }    @Override    public int hashCode() {        return name != null ? name.hashCode() : 0;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                '}';    }}public class Demo {    public static void main(String[] args) {        // 存入基本数据类型的重复元素        Set
set = new HashSet<>(); set.add(1); set.add(1); set.add(2); System.out.println(set); // 存入重写了equals和hashCode方法的对象 Set
personSet = new HashSet<>(); personSet.add(new Person("张三")); personSet.add(new Person("张三")); personSet.add(new Person("李四")); System.out.println(personSet); }}/** * 打印结果: * [1, 2] * [Person{name='李四'}, Person{name='张三'}] */

Map

Map存储的元素是键值对(key-value),键和值都是无序的,即存入顺序与输出顺序可能都不一样

public class Demo {    public static void main(String[] args) {        // key可能是无序的,value也可能是无序的        /*            键key输入顺序是:3,2,1            值value输入顺序是:a,b,c         */        Map
map=new HashMap<>(); map.put(3,"a"); map.put(2,"b"); map.put(1,"c"); System.out.println(map.keySet());// 打印键 System.out.println(map.values());// 打印值 }}/** * 打印结果: * [1, 2, 3] * [c, b, a] */

Map中要求键(key)不重复,但允许值(value)重复

public class Demo {    public static void main(String[] args) {        // 如果键名重复,那么只会保存一个,即会去重        Map
map=new HashMap<>(); map.put(1,1); map.put(1,2); map.put(1,3); System.out.println(map); // 如果键值重复,那么是可以的 Map
map2=new HashMap<>(); map2.put(1,1); map2.put(2,1); map2.put(3,1); System.out.println(map2); }}/** * 打印结果: * {1=3} * {1=1, 2=1, 3=1} */

 

转载地址:http://cckx.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>