首页 > 编程语言 >Java 集合进阶使用(List Map Set)

Java 集合进阶使用(List Map Set)

时间:2024-04-20 14:33:18浏览次数:18  
标签:Map Set Java map System collection println out

Collection

image

Collection 是其子集的父类,所以可以使用多态的规矩,比如:创建一个 ArrayList 对象,用 Collection 接收

Collection<Integer> collection = new ArrayList<>();

注意:Collection 为接口,不能直接创建对象,但可以利用其子类,使用 Collection 方法,就如上方代码一样

Collection 方法基本使用

Collection<Integer> collection = new ArrayList<>();
collection.add(1); // 添加一个数据
ollection.add(2);
System.out.println(collection); // [1, 2]

collection.clear(); // 清空集合中的所有值
System.out.println(collection); // []

collection.add(1);
collection.add(2);
collection.remove(2);  // 删除值为 2 的数据
System.out.println(collection); // [1]

boolean contains = collection.contains(1);  // 是否包含值为 1 的数据
System.out.println(contains);  // true

boolean empty = collection.isEmpty(); // 验证是否为空
System.out.println(empty); // false

int size = collection.size(); // 集合长度
System.out.println(size); // 1

注意:

  • add 方法是有一个返回值为 boolean,List系列始终为 trueSet 系列由于不能添加重复数据,可能为 false
  • contains 方法如果查询是否包含某个对象,比如 Student 类的对象,contains 默认对比的是地址值,若要对比的是数据,需要重写 Student 类的 equals 方法

Collection 遍历

Intrator 迭代器遍历

可以把 Intrator 看作一个箭头,默认指向第 0 索引,调用一次 next(),箭头就会向后移动一位。

  • 如果后一位没有值,还要强行 next() 访问,就会报异常
  • hasNext() 方法,判断是否有下一个元素值
  • 迭代器遍历期间,不能使用添加删除等改变集合的方法
Collection<String> collection = new ArrayList<>();
collection.add("a");
collection.add("b");
collection.add("c");
collection.add("d");

Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // a
    System.out.println(iterator.next()); // b
    System.out.println(iterator.next()); // c
    System.out.println(iterator.next()); // d
    System.out.println(iterator.next()); // 如果 next 已经没有值,强行访问会报异常 NoSuchElementException
}

增强 for 遍历

List 系列和数组可以使用,快捷键 对象名.for

image

Lambda 表达式遍历

和 js 的 forEach 相似,不过 java 中的 forEach 没有第二个参数 i

collection.forEach(v->{
    System.out.println(v);
});

List

CollectionList 的父类接口,而 List 又是 ArrayList 的父类接口,其用法和 Collection 差不多,
迭代器,增强 for,lambda 都可以用

LikedList

双向链表:查询慢,守卫操作增删改的速度极快

image

泛型

基本写法

和 TS 中的泛型类似

泛型类

image

泛型方法

image

泛型接口:和泛型类的用法相似

image

泛型通配符和泛型类型约束

  • ? 表示不确定的类型,可以不传泛型

image

  • extends E 表示可以传入的泛型为 E 类以及基于 E 的子类

image

  • super E 表示可以传入的泛型为 E 类以及其所有的父类,和 extends 刚好相反

Set

Set 不能使用 for 循环遍历,无序也就不能通过索引获取元素
Set 的 API 和 Collection 基本保持一致

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引

HashSet

HashSet 基本使用

image

由图上结果可知,重复的对象并未被添加到 HashSet 中,因为重写了 hashCode 方法,两个相同对象值拥有相同的 hashCode,如果不重写 hashCode,对象值一样也不会重复。

image

LinkedHashSet

当需要存有序数据的时候用 LinkedHashSet

TreeSet

对于数值类型:整数和小数,默认都采用从小到大排序
对于字符和字符串:默认采用 ASCII 码表中的字母代表的数字进行排序

复杂类型排序

比如对 Person 类创建的对象排序,如果直接向 TreeSet 中添加对象,则会报错,因为 TreeSet 无法识别对象的默认排序规则

image

解决方法一:对指定的 javabean 类实现 Comparable 接口,制定排序规则

image

解决方法二:在创建 TreeSet 对象的时候直接通过 Comparator 指定排序规则

image

当然,该代码也可以简写为 Lambda 格式

image

应用场景中,ArrayList 使用最多,涉及到去重,HashSet 使用最多

Map

Map 是一个接口,所以也不能直接 new 创建 Map 对象,需要利用多态,间接使用 Map 的方法
Map 的使用和 js 中的 map 相似

image

Map<String, String> map = new HashMap<>();

map.put("张三", "男");
map.put("李四", "女");
map.put("王五", "人妖");
System.out.println("put: " + map); // {李四=女, 张三=男, 王五=人妖}

map.remove("王五");
System.out.println("remove: " + map); // {李四=女, 张三=男}

map.clear();
System.out.println("clear: " + map); // {}

map.put("张三", "男");
map.put("李四", "女");
map.put("王五", "人妖");

boolean containsKey = map.containsKey("张"); // containsKey 是精确匹配
System.out.println("containsKey: " + containsKey); //false

boolean containsValue = map.containsValue("男");
System.out.println("containsValue: " + containsValue); // true

boolean empty = map.isEmpty();
System.out.println("isEmpty: " + empty); // false

int size = map.size();
System.out.println("size: " + size); // 3

Mapget 方法就是根据键获取对应的值

Map 遍历

keySet

通过 keySet 方法获取到 Map 对象的键的集合,类似 js 中的 Object.keys,然后可以通过键找值

Map<String, String> map = new HashMap<>();

map.put("张三", "男");
map.put("李四", "女");
map.put("王五", "人妖");

Set<String> strings = map.keySet();
strings.forEach(s -> System.out.println(s));  // 循环三次,分别打印 李四 张三 王五

entrySet

entrySet 会生成一个键值对数组(Entry 数组),然后遍历数组,从每一个键值对(Entry)上调用 getKey 方法获取键,getValue 方法获取值

Map<String, String> map = new HashMap<>();

map.put("张三", "男");
map.put("李四", "女");
map.put("王五", "人妖");

Set<Map.Entry<String, String>> entries = map.entrySet();

entries.forEach(entry -> {
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + "=" + value);
    // 李四=女
    // 张三=男
    // 王五=人妖
});

BiConsumer和Lambda简写

image

# HashMap

HashMap 是基于 Map 的实现类,和 Map 的用法一样。
依赖 hashCodeequals 保证 键的唯一
键如果是自定义对象,需要重写 hashCodeequals 来保证唯一的键

LinkedHashMap

Map 不同的是:存储的 Map 是是有序的

  • 正常存储 Map 是无序的
  • LinkedHashMap 就是在 Map 的基础上增加了有序的功能

TreeMap

TreeSet 用法基本一致

可变参数

可变参数本质就是一个数组,可以在形参中接收多个不固定参数,和 js 中的 args 是一个效果

image

标签:Map,Set,Java,map,System,collection,println,out
From: https://www.cnblogs.com/jsonq/p/18144694

相关文章

  • 【转载】Java函数式编程——为什么new Thread()中要用函数式编程
    面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。面向对象的思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情.函数式编程思想:只要能获取到结果,谁去做的,怎么做的都不重要,......
  • Python与Java数据结构语法区别
    数组参考链接:CS61BPythonzeroedLst=[0,0,0]lst=[4,7,10]lst[0]=5print(lst[0])print(lst)print(len(lst))Javaint[]zeroedArray=newint[3];int[]array={4,7,10};array[0]=5;System.out.println(array[0]);System.out.println(Ar......
  • java srpint boot 2.2.1 第二部份,锁机制和分页查询 以及统一返回结果格式,
    第二部份,引起锁机制的原理和解决方案: 测试环境搭建第一步先建一个数据库表用于模拟商品购买。CREATETABLEproduct(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255)NOTNULL,stockINTNOTNULL,versionINTNOTNULLDEFAULT0);第二步......
  • Google和Oracle关于Java的知识产权诉讼
    Google和Oracle关于Java的知识产权诉讼背景Oracle收购SUN之后立即对Oracle展开了诉讼.经历了多级法院的上诉和驳回.2021.4.5美国联邦最高法院判断.Google不侵权.无需赔偿Oracle提起的80亿美金的诉讼但是专利官司在美国科技史上影响很大.AMD跟Intel的关于x86......
  • [Java]volatile关键字
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18031966出自【进步*于辰的博客】启发博文:《Javavolatile关键字最全总结:原理剖析与实例讲解(简单易懂)》(转发)。参考笔记二,P73、P74.1。目录1、JMM规范2、并发编程的三......
  • GraalVM-云原生时代的JVM(Java)
    一、GraalVM是什么?GraalVM是Oracle开源的一款通用虚拟机产品,官方称之为UniversalGraalVM,是新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他......
  • dbt asset-paths 简单说明
    dbt的asset-paths是一个比较有意思的配置,可以用来增强我们的文档信息,比如存放一些图片在资源描述中引用资源生成的文档中可以进行显示,提示文档的信息参考配置dbt_project.ymlasset-paths:["assets"]使用假如assets包含一些描述图片信息models/ap......
  • C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞
    视频链接:C117莫队配合bitsetP4688[Ynoi2016]掉进兔子洞_哔哩哔哩_bilibili   LuoguP4688[Ynoi2016]掉进兔子洞//莫队配合bitsetO(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<bitset>usin......
  • Robust mapping of spatiotemporal trajectories and cell–cell interactions in hea
    这篇论文主要介绍了一种名为"Robustmappingofspatiotemporaltrajectoriesandcell-cellinteractionsinhealthyanddiseasedtissues"的新方法,该方法能够在健康和疾病组织中对细胞过程进行可靠的映射,同时研究细胞间的相互作用。在生物组织中,细胞类型、局部组成和状态、分......
  • java spring boot 2 开发实战笔记
    本案例是java spingboot 2.2.1  第一步搭建环境:安装依赖由于我们公司项目是1.8环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot代码也只能用1.8boot版本为:2.2.1,新建项目后,在xml文件中复制上以下代码xml配置,最精简运行起来的  需要配置一个数据库,8.0以......