【小家java】Java实用数据结构Pair、MutablePair、ImmutablePair详解(推荐apache的commons组件提供)

简介: 【小家java】Java实用数据结构Pair、MutablePair、ImmutablePair详解(推荐apache的commons组件提供)

前言


我们讨论了一个非常有用的编程概念,配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用。


我们平时写代码的时候经常会遇到要返回多个元素的情况,这时我们大多数时间都是使用数组或者map或者json的方式来实现的,而common-lang包提供了组件的方式来返回多个参数,我们这片文章要介绍的是Pair接口,返回一对数据Pair抽象类,它集成了Map.Entry接口;(这个由apache提供)


Pair是一个抽象类,这个类是定义基本API的抽象实现,它指的是左右两个元素,它也实现了Map.Entry接口,也就是key是左元素,value是右元素;


子类实现的是可能是可变的也可能是不可变的,然而对存储的对象类型是没有限制的,如果可变的对象存储在Pair中,那么Pair对象也会变为可变的;


市面上的实现


javafx.util 包中


Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();


JDK自带内部类:AbstractMap.SimpleEntry 和AbstractMap.SimpleImmutableEntry

SimpleEntry定义在抽象类AbstractMap里面,其构造方法与Pair类似:


AbstractMap.SimpleEntry<Integer, String> entry  = new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();


另外AbstractMap 类还包含一个嵌套类,表示不可变配对:SimpleImmutableEntry 类


AbstractMap.SimpleImmutableEntry<Integer, String> entry = new AbstractMap.SimpleImmutableEntry<>(1, "one");



应用方式与可变的配对一样,除了配置的值不能修改,尝试修改会抛出UnsupportedOperationException异常。


Vavr库:这个本文不做描述。太偏门了

Apache Commons:组件提供的Pair(下问列出专门篇幅讲述,推荐使用)

Apache Commons提供的Pair、MutablePair、ImmutablePair详解


组件类是在包org.apache.commons.lang3.tuple下

Pair抽象类部分源码申明如下: 不可直接实例化

它虽然提供了静态方法,但实际返回的是不可变的ImmutablePair。


public abstract class Pair<L, R> implements Map.Entry<L, R>, Comparable<Pair<L, R>>, Serializable {
    private static final long serialVersionUID = 4954918890077093841L;
  /**
 * 返回一个不可变的ImmutablePair对象,即:左元素不可变、右元素不可变,Map的值也不可变
   */
    public static <L, R> Pair<L, R> of(final L left, final R right) {
        return new ImmutablePair<>(left, right);
    }
   /**
 * 获取左元素
   */
    public abstract L getLeft();
   /**
 * 获取右元素
   */
    public abstract R getRight();
   /**
 * 从Map中获取key
   */
    @Override
    public final L getKey() {
        return getLeft();
    }
   /**
 * 获取Map中value
   */
    @Override
    public R getValue() {
        return getRight();
    }
}
  • ImmutablePair不可变的左右元素对


  • MutablePair可以改变值得Pair左右元素对


   public static void main(String[] args) throws Exception {
        Pair<Integer, Integer> pair = Pair.of(1, 10); //同ImmutablePair.of(1, 10)
        Integer left = pair.getLeft();
        Integer right = pair.getRight();
        System.out.println(left); //1
        System.out.println(right); //10
        //pair.setValue(30); //报错:java.lang.UnsupportedOperationException
        pair = MutablePair.of(1, 10);
        left = pair.getLeft();
        right = pair.getRight();
        ((MutablePair<Integer, Integer>) pair).setLeft(100);
        ((MutablePair<Integer, Integer>) pair).setRight(200);
        System.out.println(left); //100
        System.out.println(right); //200
        pair.setValue(200); //备注setValue同setRight方法
    }

例子使用起来非常的简单,只是这种数据结构很多时候确认非常好用。


比如返回夫妻两个、返回一对双胞胎等等,一下就搞定了。


扩展使用:Triple、MutableTriple、ImmutableTriple 一次性返回三个对象


使用办法基本同上


   public static void main(String[] args) throws Exception {
        Triple<String, Integer, String> pair = Triple.of("姓名", 10, "邮箱");
        String name = pair.getLeft(); //姓名
        Integer age = pair.getMiddle(); //10
        String mail = pair.getRight(); //邮箱
        System.out.println(name);
        System.out.println(age);
        System.out.println(mail);
    }


最后


很多人问,这个和Map有什么区别?


我想举个例子:

一头驴和一群马的区别。


因为common.lang3一般为必导的包。所以我建议使用这里面的额数据结构


说明:Pair不能当作Controller层的返回值,或者入参。会出问题,因为它不是标准的javaBean,序列化和反序列化会出问题。一般用于系统内部,比如Service方法直接、工具方法之间传递数据,是一把利器



相关文章
|
9月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
302 1
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
971 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
7月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
375 3
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
158 1
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
259 2
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
296 2
|
9月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
907 1
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
227 5
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
237 6
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。

推荐镜像

更多