`

Java 泛型集合工具类

    博客分类:
  • Java
 
阅读更多
package my.tools;

import java.util.Set;
import java.util.Map;
import java.util.List;
import java.util.Queue;
import java.util.HashSet;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.LinkedHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
* 包含获得各种集合对象的常用方法的泛型工具类。
* <p>
* 如果要获得一个 {@code Map<String, String>} 的对象,可以通过下面的方式实现:
* {@literal Map<String, String> map = GenericUtils.getMap();}。但是不能直接作为参数使用,例如有这样一个方法:
* {@literal setInfo(Map<String, String>)},不能直接这样调用:<s>
* <code>setInfo(GenericUtils.getMap())</code></s>
* </p>
* 
* @author Fuchun
* @version $Id: GenericUtils.java 4754 2011-03-26 19:50 fuchun $
*/
public class GenericUtils {

    /**
     * 用该方法来代替 {@code new HashMap<K, V>()} 方式获得新的 {@code java.util.Map} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @return 返回 {@code java.util.Map<K, V>} 关于 {@code java.util.HashMap<K, V>} 实现的新实例。
     */
    public static <K, V> Map<K, V> getMap() {
        return new HashMap<K, V>();
    }

    /**
     * 用该方法来代替 {@code new HashMap<K, V>(int)} 方式获得新的 {@code java.util.Map} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @param initialCapacity 初始容量。
     * @return 返回 {@code java.util.Map<K, V>} 关于 {@code java.util.HashMap<K, V>} 实现的新实例。
     */
    public static <K, V> Map<K, V> getMap(int initialCapacity) {
        return new HashMap<K, V>(initialCapacity);
    }

    /**
     * 用该方法来代替 {@code new ConcurrentHashMap<K, V>()} 方式获得新的 {@code java.util.Map} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @return 返回 {@code java.util.Map<K, V>} 关于
     *         {@code java.util.concurrent.ConcurrentHashMap<K, V>} 实现的新实例。
     */
    public static <K, V> Map<K, V> getConcurrentMap() {
        return new ConcurrentHashMap<K, V>();
    }

    /**
     * 用该方法来代替 {@code new ConcurrentHashMap<K, V>(int)} 方式获得新的 {@code java.util.Map}
     * 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @param initialCapacity 初始容量。
     * @return 返回 {@code java.util.Map<K, V>} 关于
     *         {@code java.util.concurrent.ConcurrentHashMap<K, V>} 实现的新实例。
     */
    public static <K, V> Map<K, V> getConcurrentMap(int initialCapacity) {
        return new ConcurrentHashMap<K, V>(initialCapacity);
    }

    /**
     * 用该方法来代替 {@code new LinkedHashMap<K, V>()} 方式获得新的 {@code java.util.Map} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @return 返回 {@code java.util.Map<K, V>} 关于 {@code java.util.LinkedHashMap<K, V>}
     *         实现的新实例。
     */
    public static <K, V> Map<K, V> getLinkedMap() {
        return new LinkedHashMap<K, V>();
    }

    /**
     * 用该方法来代替 {@code new LinkedHashMap<K, V>(int)} 方式获得新的 {@code java.util.Map} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @param initialCapacity 初始容量。
     * @return 返回 {@code java.util.Map<K, V>} 关于 {@code java.util.LinkedHashMap<K, V>}
     *         实现的新实例。
     */
    public static <K, V> Map<K, V> getLinkedMap(int initialCapacity) {
        return new LinkedHashMap<K, V>(initialCapacity);
    }

    /**
     * 用该方法来代替 {@code new TreeMap<K, V>()} 方式获得新的 {@code java.util.Map} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @return 返回 {@code java.util.Map<K, V>} 关于 {@code java.util.TreeMap<K, V>} 实现的新实例。
     */
    public static <K, V> Map<K, V> getTreeMap() {
        return new TreeMap<K, V>();
    }

    /**
     * 用该方法来代替 {@code new ConcurrentHashMap<K, V>()} 方式获得新的
     * {@code java.util.concurrent.ConcurrentHashMap} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @return 返回 {@code java.util.concurrent.ConcurrentMap<K, V>} 关于
     *         {@code java.util.concurrent.ConcurrentHashMap<K, V>} 实现的新实例。
     */
    public static <K, V> ConcurrentMap<K, V> getConcurrentHashMap() {
        return new ConcurrentHashMap<K, V>();
    }

    /**
     * 用该方法来代替 {@code new ConcurrentHashMap<K, V>(int)} 方式获得新的
     * {@code java.util.concurrent.ConcurrentHashMap} 的实例对象。
     * 
     * @param <K> {@code Map} 中的键对象。
     * @param <V> {@code Map} 中的值对象。
     * @param initialCapacity 初始容量。
     * @return 返回 {@code java.util.concurrent.ConcurrentMap<K, V>} 关于
     *         {@code java.util.concurrent.ConcurrentHashMap<K, V>} 实现的新实例。
     */
    public static <K, V> ConcurrentMap<K, V> getConcurrentHashMap(int initialCapacity) {
        return new ConcurrentHashMap<K, V>(initialCapacity);
    }

    /**
     * 用该方法来代替 {@code new ArrayList<T>()} 方式获得新的 {@code java.util.List} 的实例对象。
     * 
     * @param <T> {@code List<T>} 中保存的对象。
     * @return 返回 {@code java.util.List<T>} 关于 {@code java.util.ArrayList<T>} 实现的新实例。
     */
    public static <T> List<T> getList() {
        return new ArrayList<T>();
    }

    /**
     * 用该方法来代替 {@code new ArrayList<T>(int)} 方式获得新的 {@code java.util.List} 的实例对象。
     * 
     * @param <T> {@code List<T>} 中保存的对象。
     * @param initialCapacity 列表的初始容量。
     * @return 返回 {@code java.util.List<T>} 关于 {@code java.util.ArrayList<T>} 实现的新实例。
     */
    public static <T> List<T> getList(int initialCapacity) {
        return new ArrayList<T>(initialCapacity);
    }

    /**
     * 用该方法来代替 {@code new ArrayList<T>()} 方式获得新的 {@code java.util.List} 的实例对象。
     * 
     * @param <T> {@code List<T>} 中保存的对象。
     * @param c 其中的元素将存放在新的 {@code list} 中的 {@code collection}。
     * @return 返回 {@code java.util.List<T>} 关于 {@code java.util.ArrayList<T>} 实现的新实例。
     */
    public static <T> List<T> getList(Collection<? extends T> c) {
        if (ObjectUtils.isNotEmpty(c))
            return new ArrayList<T>(c);
        return new ArrayList<T>();
    }

    /**
     * 用该方法来代替 {@code new LinkedList<T>()} 方式获得新的 {@code java.util.List} 的实例对象。
     * 
     * @param <T> {@code List<T>} 中保存的对象。
     * @return 返回 {@code java.util.List<T>} 关于 {@code java.util.LinkedList<T>} 实现的新实例。
     */
    public static <T> List<T> getLinkedList() {
        return new LinkedList<T>();
    }

    /**
     * 用该方法来代替 {@code new HashSet<T>()} 方式获得新的 {@code java.util.Set} 的实例对象。
     * 
     * @param <T> {@code Set<T>} 中保存的对象。
     * @return 返回 {@code java.util.Set<T>} 关于 {@code java.util.HashSet<T>} 实现的新实例。
     */
    public static <T> Set<T> getHashSet() {
        return new HashSet<T>();
    }

    /**
     * 用该方法来代替 {@code new HashSet<T>(int)} 方式获得新的 {@code java.util.Set} 的实例对象。
     * 
     * @param <T> {@code Set<T>} 中保存的对象。
     * @param initialCapacity 列表的初始容量。
     * @return 返回 {@code java.util.Set<T>} 关于 {@code java.util.HashSet<T>} 实现的新实例。
     */
    public static <T> Set<T> getHashSet(int initialCapacity) {
        return new HashSet<T>(initialCapacity);
    }

    /**
     * 用该方法来代替 <code>new HashSet<T>(Collection<? extends T> c)</code> 方式获得新的
     * {@code java.util.Set} 的实例对象。
     * 
     * @param <T> {@code Set} 中保存的对象。
     * @param c 其中的元素将存放在新的 {@code set} 中的 {@code collection}。
     * @return 返回 {@code java.util.Set<T>} 关于 {@code java.util.HashSet<T>} 实现的新实例。
     */
    public static <T> Set<T> getHashSet(Collection<? extends T> c) {
        if (ObjectUtils.isEmpty(c))
            return new HashSet<T>();
        return new HashSet<T>(c);
    }

    /**
     * 用该方法来代替 {@code new TreeSet<T>()} 方式获得新的 {@code java.util.Set} 的实例对象。
     * 
     * @param <T> {@code Set<T>} 中保存的对象。
     * @return 返回 {@code java.util.Set<T>} 关于 {@code java.util.TreeSet<T>} 实现的新实例。
     */
    public static <T> Set<T> getTreeSet() {
        return new TreeSet<T>();
    }

    /**
     * 用该方法来代替 <code>new TreeSet<T>(Collection<? extends T> c)</code> 方式获得新的
     * {@code java.util.Set} 的实例对象。
     * 
     * @param <T> {@code Set} 中保存的对象。
     * @param c 其中的元素将存放在新的 {@code set} 中的 {@code collection}。
     * @return 返回 {@code java.util.Set<T>} 关于 {@code java.util.TreeSet<T>} 实现的新实例。
     */
    public static <T> Set<T> getTreeSet(Collection<? extends T> c) {
        if (ObjectUtils.isEmpty(c))
            return new TreeSet<T>();
        return new TreeSet<T>(c);
    }

    /**
     * 用该方法来代替 {@code new LinkedList<E>()} 方式获得新的 {@code java.util.Queue} 的实例对象。
     * 
     * @param <E> {@code Queue<E>} 中保存的对象。
     * @return 返回 {@code java.util.Queue<E>} 关于 {@code java.util.LinkedList<E>} 实现的新实例。
     */
    public static <E> Queue<E> getQueue() {
        return new LinkedList<E>();
    }

    /**
     * 合并两个有相同元素类型的 {@code java.util.Set}。
     * <ul>
     * <li>{@code setA == null && setB == null} --> 返回 {@link #getHashSet()}。</li>
     * <li>{@code setA != null && setB == null} --> 返回 {@code setA}。</li>
     * <li>{@code setA == null && setB != null} --> 返回 {@code setB}。</li>
     * <li>{@code setA != null && setB != null} --> 返回 {@code setA} 和 {@code setB} 的并集。
     * </li>
     * </ul>
     * 
     * @param <T> {@code Set} 中保存的对象。
     * @param setA 第一个 {@code Set}。
     * @param setB 第二个 {@code Set}。
     * @return 返回 {@code setA} 和 {@code setB} 的并集。
     */
    public static <T> Set<T> unionHashSet(Set<T> setA, Set<T> setB) {
        boolean isEmptySetA = ObjectUtils.isEmpty(setA);
        boolean isEmptySetB = ObjectUtils.isEmpty(setB);
        if (isEmptySetA && isEmptySetB)
            return getHashSet();
        if (isEmptySetA && !isEmptySetB)
            return setB;
        if (!isEmptySetA && isEmptySetB)
            return setA;
        Set<T> result = getHashSet(setA);
        result.addAll(setB);
        return result;
    }

    /**
     * 取两个有相同元素类型的 {@code java.util.Set} 的交集,即公共部份的新的 {@code java.util.Set}。
     * <ul>
     * <li>{@code setA == null && setB == null} --> 返回 {@code null}。</li>
     * <li>{@code setA != null && setB == null} --> 返回 {@code null}。</li>
     * <li>{@code setA == null && setB != null} --> 返回 {@code null}。</li>
     * <li>{@code setA != null && setB != null} --> 返回 {@code setA} 和 {@code setB} 的交集。
     * </li>
     * </ul>
     * 
     * @param <T> {@code Set} 中保存的对象。
     * @param setA 第一个 {@code Set}。
     * @param setB 第二个 {@code Set}。
     * @return 返回 {@code setA} 和 {@code setB} 的交集。
     */
    public static <T> Set<T> intersectHashSet(Set<T> setA, Set<T> setB) {
        if (ObjectUtils.isEmpty(setA) || ObjectUtils.isEmpty(setB))
            return null;
        Set<T> result = getHashSet(setA);
        result.retainAll(setB);
        return result;
    }

    /**
     * 移除 {@code setA} 中那些包含在 {@code setB} 中的元素。<br />
     * 此方法不会修改 {@code setA},只是复制一份作相应操作,返回的是全新的 {@code Set} 对象。
     * <ul>
     * <li>{@code setA == null} --> 返回 {@code null}。</li>
     * <li>{@code setB == null} --> 返回 {@code setA}。</li>
     * <li>{@code setA != null && setB != null} --> 返回 {@code setA} 和 {@code setB}
     * 的不对称差集。</li>
     * </ul>
     * 
     * @param <T> {@code Set} 中保存的对象。
     * @param setA 第一个 {@code Set}。
     * @param setB 第二个 {@code Set}。
     * @return 返回 {@code setA} 和 {@code setB} 的不对称差集。
     */
    public static <T> Set<T> differenceHashSet(Set<T> setA, Set<T> setB) {
        if (ObjectUtils.isEmpty(setA))
            return null;
        if (ObjectUtils.isEmpty(setB))
            return setA;
        Set<T> result = getHashSet(setA);
        result.removeAll(setB);
        return result;
    }

    /**
     * 取两个有相同元素类型的 {@code java.util.Set} 的补集。
     * 
     * @param <T> {@code Set} 中保存的对象。
     * @param setA 第一个 {@code Set}。
     * @param setB 第二个 {@code Set}。
     * @return 返回 {@code setA} 和 {@code setB} 的补集。
     */
    public static <T> Set<T> complementHashSet(Set<T> setA, Set<T> setB) {
        return differenceHashSet(unionHashSet(setA, setB), intersectHashSet(setA, setB));
    }
}

 

分享到:
评论

相关推荐

    java泛型集合 java集合 集合 java Collection

    总的来说,Java泛型集合和集合框架提供了强大的数据存储和处理能力,而`Collection`接口作为基础,连接了各种集合类型。了解并熟练掌握这些概念和用法,对于提高Java编程效率和代码质量至关重要。

    JAVA泛型集合

    总之,Java泛型集合是提高代码质量和效率的重要工具,它强化了类型系统,使开发者能够编写更安全、更健壮的代码,同时降低了潜在的bug风险。理解和熟练掌握泛型集合的使用,对于Java程序员来说至关重要。

    Java集合框架及泛型

    6. **Collections**: 这是一个包含各种集合操作的工具类,如排序、查找、翻转等。提供的算法类包括`sort()`, `binarySearch()`, `reverse()`, `shuffle()`等。 泛型是Java中处理类型安全的一种方式,允许我们在类、...

    Java泛型的用法及T.class的获取过程解析

    * 工具类:泛型可以用于工具类中,例如工具类的静态方法可以使用泛型。 五、结论 泛型是Java编程语言中的一种重要特性,它可以提高代码的灵活性和可读性。通过使用泛型,我们可以编写更加灵活和可维护的代码。此外...

    Java Generics and Collections (Java泛型与集合)

    8. **实用工具类**:如Arrays、Collections和Guava库中的工具类,它们提供了丰富的静态方法来处理集合。 通过阅读"Java Generics and Collections",开发者不仅可以掌握Java泛型和集合的基本使用,还能深入了解它们...

    Java泛型编程最全总结

    在实际开发中,泛型可以用于创建通用的工具类,例如`Collections.sort()`方法,它可以对任何实现了`Comparable`接口的列表进行排序。泛型也可以应用于数据结构,如`HashMap`和`LinkedList`,提高容器的安全性和效率...

    Java泛型技术之发展.pdf

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用...Java泛型技术的不断发展和完善,也为Java程序员提供了强大的工具来应对复杂的数据处理场景。

    [Java泛型和集合].

    总之,Java泛型和集合是提高代码质量和效率的关键工具,理解并熟练掌握它们对于成为一名优秀的Java开发者至关重要。通过深入学习本书和相关代码示例,你将能够更好地利用这些特性来编写更安全、更高效的代码。

    详解Java常用工具类—泛型

    Java泛型是Java语言中的一种机制,可以用来约束集合中的元素类型,提高代码的可读性和安全性。下面将对Java泛型进行详细的介绍。 一、泛型概述 泛型是Java 5中引入的一种机制,用于解决Java中集合类库中的类型安全...

    java泛型Demo

    这个"java泛型Demo"可能包含了一些具体的例子,如创建泛型类、泛型方法的使用,以及如何通过泛型处理集合。通过这些示例,你可以更直观地理解泛型的工作原理和实际应用。 总之,Java泛型是提高代码质量、安全性和...

    自定义泛型集合

    在Java编程语言中,自定义泛型集合是一个重要的概念,它允许我们创建具有类型安全性的容器类,以存储特定类型的对象。泛型是Java SE 5.0引入的一个特性,目的是提高代码的类型安全性,减少类转换异常,并提供更好的...

    java 泛型入门 实例

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。本篇文章将带你入门Java泛型,通过实例深入理解其核心概念。 1. **泛型的基本概念** - 泛型...

    实例讲解Java泛型编程的快速入门

    - Java泛型在编译后会进行类型擦除,这意味着在运行时,所有的泛型类型信息都会被替换为它们的边界类型或`Object`。因此,泛型并不改变对象的实际类型,仅在编译时提供类型检查。 6. **泛型与集合** - Java集合...

    Java泛型总结(2)进阶篇

    Java泛型是Java SE 5.0引入的一个重要特性,极大地提高了代码的类型安全性和重用性。在本文中,我们将深入探讨Java泛型的进阶概念,包括通配符、边界、类型擦除以及在实际开发中的应用。 1. 通配符 通配符在Java...

    java 泛型

    1. **类型擦除**:Java泛型在编译后会被擦除,这意味着在运行时,泛型类和非泛型类是相同的。类型参数被替换为它们的边界类型(通常是`Object`)。因此,泛型的主要优势在于编译时的检查,而不是运行时的性能提升。 ...

    Java泛型与容器详细笔记.pdf (带书签)

    Guava是Google提供的开源Java库,它包含了大量有用和高效的工具类,例如用于集合操作的工具类,它简化了常见的集合操作,提高了代码的可读性和可维护性。Apache Commons也是一个流行的开源Java库,它提供了很多实用...

    JAVA泛型详解[参考].pdf

    总的来说,Java泛型是一个强大的工具,它提高了代码的可读性、类型安全性,并降低了运行时错误的可能性。通过理解和熟练使用泛型,开发者可以编写出更高效、更少bug的Java应用程序。在实际开发中,尤其是在处理数据...

    Java泛型类型擦除后的补偿

    本文将深入探讨Java泛型类型擦除的概念,并介绍在类型擦除后,为了保持泛型的安全性和便利性,Java设计者所采取的一些补偿机制。 1. **类型擦除**: - 在编译期间,所有的泛型类型信息都会被替换为它们的实际类型...

    JAVA泛型与集合框架.ppt

    Java泛型与集合框架是Java编程中至关重要的概念,它们极大地增强了代码的可读性、类型安全性以及效率。泛型是Java 5引入的新特性,主要用于集合类,它允许在编译时进行类型检查,避免了运行时的类型转换异常。 泛型...

Global site tag (gtag.js) - Google Analytics