Java集合框架(Map篇)

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: 在这个示例代码中,首先定义了一个数组和一个集合,并使用Arrays.asList()方法将数组转换成集合。接着对数组和集合分别进行排序,使用binarySearch()方法查找元素位置,使用copyOf()和copy()方法复制数组和集合,最后输出结果。可以看到,Arrays和Collections提供的方法可以方便地对数组和集合进行操作,节省开发者的时间和精力。

一、概述

Map是一种经常用于存储键值对的数据结构,在Java中可以通过java.util.Map接口来定义一个Map对象。Map中的每个元素都包含了一个键和一个值,键和值可以是任意类型的对象。

在Map中,键是唯一的,而值则可以重复。可以使用put()方法向Map中添加元素,使用get()方法通过键来访问值,使用keySet()方法获取Map中所有键的集合,使用values()方法获取Map中所有值的集合。另外,Map还提供了很多其他方法,如containsKey()、containsValue()、remove()等。

常见的Map实现类有HashMap、TreeMap、LinkedHashMap,它们的实现方式不同,适用于不同的场景。HashMap使用哈希函数进行元素的散列存储,可以快速进行插入、删除和查找;TreeMap则使用红黑树进行存储,可以对元素进行有序遍历;而LinkedHashMap则维护了元素的插入顺序,可以按照插入顺序遍历元素。
在这里插入图片描述

二、map集合的特点

Map集合的特点包括:

  1. 键值对存储。Map中存储的元素是以键值对的形式保存的,每个键值对包含一个键对象和一个值对象,可以根据键对象获取对应的值对象。

  2. 键的唯一性。在Map中,每个键对象是唯一的,不能存在相同的键对象,如果向Map中添加一个已经存在的键对象,则会替换掉原有的值对象。

  3. 支持null键和null值。HashMap和Hashtable支持null键和null值,TreeMap和ConcurrentHashMap不允许有null键。

  4. 无序性。HashMap和Hashtable等散列表实现的Map在存储键值对时并不是以顺序方式存储的,因此不能保证元素的顺序。但如果使用LinkedHashMap,则可以按照插入顺序或访问顺序进行遍历。

  5. 高效性。访问和修改Map集合中的元素都非常高效,可以通过哈希表实现,时间复杂度为O(1)。

  6. 可以存储不同类型的键值对。Map集合可以存储任意类型的键和值,如基本数据类型、自定义对象等。

综上所述,Map集合是一种非常实用的数据结构,在Java中广泛应用于各种场景中,如缓存、配置等。

总结:主要的特点就是键值对的形式来存储

1、集合的基本操作

Map集合的基本操作包括:

  1. 添加元素:使用put()方法向Map中添加元素,语法:map.put(key, value),其中key为键对象,value为值对象。

  2. 获取元素:使用get()方法通过键来获取对应的值,语法:map.get(key),其中key为键对象。

  3. 删除元素:使用remove()方法通过键来删除对应的键值对,语法:map.remove(key),其中key为键对象。

  4. 判断是否包含键或值:使用containsKey()、containsValue()方法来判断Map中是否包含指定的键或值,语法:map.containsKey(key)map.containsValue(value),其中key为键对象,value为值对象。

  5. 遍历元素:可以使用keySet()、entrySet()和values()方法来遍历Map中的所有键、值或键值对。

  • keySet()方法返回一个包含所有键的Set集合,可以遍历所有键,语法:map.keySet()
  • entrySet()方法返回一个包含所有键值对的Set集合,可以遍历所有键值对,语法:map.entrySet()
  • values()方法返回一个包含所有值的Collection集合,可以遍历所有值,语法:map.values()

1)添加

在这里插入图片描述
输出结果:
在这里插入图片描述

2)删除元素

删除元素是根据map集合的key来删除的

在这里插入图片描述
输出结果:
在这里插入图片描述

3)修改元素

因为map集合是没有下标的,所以不能根据下标来进行修改,如代码里我所说的,(key)是一样的会被覆盖,利用这个特性我们可以用这种方法进行修改value

在这里插入图片描述
输出的结果:
在这里插入图片描述

4)获取

我们获取值是根据map集合的get()方法中根据key来获取的

在这里插入图片描述
输出结果:

在这里插入图片描述

5)遍历Map

因为map集合不是继承Collection,所以遍历方式和list、set集合不一样
我这里提供了三种的遍历方式:

  1. 获取map集合的键
    在这里插入图片描述
    输出结果:
    在这里插入图片描述
  1. 拿到map集合的映射关系
    在这里插入图片描述
    输出结果:
    在这里插入图片描述

  2. 遍历的只是map集合的值

在这里插入图片描述
输出结果:
在这里插入图片描述

三、扩展

1、统计字符串出现的次数

随机给定一个字符串,把重复的字符串进行统计。 因为键值对的特点:键不可以重复,但是键对应的值可以被覆盖。

实现的步骤:

  1. 把需要统计的字符串获取
  2. 把字符串遍历
  3. 以字符做为map集合的key,在map集合中寻找key对应的值是否存在;
     如果存在,key对应的值+1进行key的覆盖 
     反之,key对应的值默认为1 
    
    1. 遍历map集合
      在这里插入图片描述
      输出结果:
      在这里插入图片描述

      2、泛型的作用

      泛型的作用主要有以下几个方面:
  1. 类型安全。使用泛型可以让代码更加安全,避免因类型不匹配而出现编译错误或运行时异常。在编译时,编译器会对泛型进行类型检查,保证类型的一致性。

  2. 代码复用。使用泛型,可以编写通用的代码,这样可以增强代码的复用性,避免重复编写类似的代码,提高代码的开发效率。

  3. 提高代码清晰度和可维护性。使用泛型可以让代码更加清晰明了,可以方便地理解和维护代码。在使用泛型时,可以明确地指定类型参数,避免代码中出现类型转换等不必要的代码。

  4. 集合的统一化。Java中的集合类都使用了泛型,这使得集合类在使用时更加方便和统一,可以避免类型不匹配的问题,同时也方便了在集合中操作元素的过程中进行类型转换。

综上所述,泛型是Java中非常重要的一项功能,它可以让代码更加安全、清晰、易维护和高效,是Java编程中不可或缺的一部分。

1)示例代码1:

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a3c4f21a9d7b4852a550273fd3574865.png)

输出结果:
在这里插入图片描述

如果我用字符串:他就会出现报错

在这里插入图片描述

2)示例代码2:

/**
 * 一个普通类
 * 
 * @author tgq
 *
 * @param <T>
 */
class GenericClass<T> {
   
   
    private T value;

    public GenericClass(T value) {
   
   
        this.value = value;
    }

    public T getValue() {
   
   
        return value;
    }

    public void setValue(T value) {
   
   
        this.value = value;
    }
}

在这个泛型类中,定义了一个值为T类型的成员变量,以及Getter和Setter方法用来访问这个成员变量。通过使用泛型类型,这个类可以接受任何类型的参数,可以在实例化时指定具体的类型。



/**
     * 
     * @author tgq
     * @param args
     */
    public static void main(String[] args) {
   
   

        GenericClass<Integer> intObj = new GenericClass<>(10);
        System.out.println(intObj.getValue()); // 输出:10
        intObj.setValue(20);
        System.out.println(intObj.getValue()); // 输出:20

        GenericClass<String> strObj = new GenericClass<>("Hello");
        System.out.println(strObj.getValue()); // 输出:Hello
        strObj.setValue("World");
        System.out.println(strObj.getValue()); // 输出:World

}

在这段示例代码中,首先创建了一个类型为Integer的泛型对象intObj,然后使用Getter方法获取它的值,并使用Setter方法将值修改为20。接着创建了一个类型为String的泛型对象strObj,同样使用Getter和Setter方法访问和修改它的值。由于使用了泛型类,可以方便地使用不同类型的对象,避免了使用Object类型的代码中需要进行类型转换的问题。

3、集合工具类

Arrays和Collections都是Java中常用的工具类,它们为数组和集合类提供了一些常用的方法,方便了开发者对这些对象的操作和处理。

1)arrays

Arrays类提供了一些静态方法,用于操作数组,包括排序、查找、复制等。以下是Arrays的一些常用方法:

  1. Arrays.sort()方法:用于对数组进行排序,语法:Arrays.sort(array),其中array为要排序的数组对象。

  2. Arrays.binarySearch()方法:用于在有序数组中查找指定元素的位置,语法:Arrays.binarySearch(array, key),其中array为要查找的数组对象,key为要查找的元素。

  3. Arrays.copyOf()方法:用于复制数组,语法:Arrays.copyOf(original, newLength),其中original为要被复制的原始数组,newLength为新数组的长度。

示例:
在这里插入图片描述
输出结果:
在这里插入图片描述

2)Collections

Collections类提供了一些静态方法,用于操作集合类,包括排序、查找、复制等。以下是Collections的一些常用方法:

  1. Collections.sort()方法:用于对集合进行排序,语法:Collections.sort(list),其中list为要排序的集合对象。

  2. Collections.binarySearch()方法:用于在有序集合中查找指定元素的位置,语法:Collections.binarySearch(list, key),其中list为要查找的集合对象,key为要查找的元素。

  3. Collections.copy()方法:用于复制集合,语法:Collections.copy(dest, src),其中dest为目标集合,src为源集合。

示例:
在这里插入图片描述
输出结果:

【总结】

在这个示例代码中,首先定义了一个数组和一个集合,并使用Arrays.asList()方法将数组转换成集合。接着对数组和集合分别进行排序,使用binarySearch()方法查找元素位置,使用copyOf()和copy()方法复制数组和集合,最后输出结果。可以看到,Arrays和Collections提供的方法可以方便地对数组和集合进行操作,节省开发者的时间和精力。

相关文章
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
7天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
29 3
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
178 3
|
24天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
40 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
46 4
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
69 2
|
2月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
126 1
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
54 0