/** * Copyright (c) 2015, biezhi 王爵 (biezhi.me@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.blade.kit; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.EnumMap; import java.util.EnumSet; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import java.util.WeakHashMap; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.LinkedBlockingQueue; /** * 有关集合处理的工具类,通过静态方法消除泛型编译警告。 * <p> * 这个类中的每个方法都可以“安全”地处理 null ,而不会抛出 NullPointerException。 * </p> * * @author <a href="mailto:biezhi.me@gmail.com" target="_blank">biezhi</a> * @since 1.0 */ public abstract class CollectionKit { private static final int DEFAULT_INITIAL_CAPACITY = 16; private static final int DEFAULT_CONCURRENCY_LEVEL = 4; /** * new HashMap */ public static <K, V> HashMap<K, V> newHashMap() { return new HashMap<K, V>(); } /** * new HashMap and initialCapacity */ public static <K, V> HashMap<K, V> newHashMap(int size) { return new HashMap<K, V>(size); } /** * new HashMap and initialCapacity */ public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() { return new LinkedHashMap<K, V>(); } /** * new HashMap and initialCapacity */ public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(int size) { return new LinkedHashMap<K, V>(size); } /** * new concurrentHashMap */ public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap() { return new ConcurrentHashMap<K, V>(DEFAULT_INITIAL_CAPACITY, 0.75f, DEFAULT_CONCURRENCY_LEVEL); } /** * new concurrentHashMap and initialCapacity */ public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap(int size) { return new ConcurrentHashMap<K, V>(size); } /** * new ArrayList */ public static <T> ArrayList<T> newArrayList() { return new ArrayList<T>(); } /** * new ArrayList and initialCapacity */ public static <T> ArrayList<T> newArrayList(int size) { return new ArrayList<T>(size); } /** * new HashSet */ public static <T> HashSet<T> newHashSet() { return new HashSet<T>(); } /** * new HashSet and initialCapacity */ public static <T> HashSet<T> newHashSet(int size) { return new HashSet<T>(size); } /** * new TreeSet */ public static <T> TreeSet<T> newTreeSet() { return new TreeSet<T>(); } /** * map sort */ public static <K, V> Map<K, V> sortMap(Map<K, V> map, Comparator<Entry<K, V>> compator) { Map<K, V> result = new LinkedHashMap<K, V>(); List<Entry<K, V>> entries = new ArrayList<Entry<K, V>>(map.entrySet()); Collections.sort(entries, compator); for (Entry<K, V> entry : entries) { result.put(entry.getKey(), entry.getValue()); } return result; } /** * return map is empty */ public static <K,V> boolean isEmpty(Map<K, V> map){ return (null == map || map.isEmpty()); } /** * return array is empty */ public static <T> boolean isEmpty(T[] arr){ return null == arr || arr.length == 0; } /** * merge array * @param a * @param b * @return */ @SuppressWarnings("unchecked") public static <T> T[] concat(T[] a, T[] b) { final int alen = a.length; final int blen = b.length; if (alen == 0) { return b; } if (blen == 0) { return a; } final T[] result = (T[]) java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), alen + blen); System.arraycopy(a, 0, result, 0, alen); System.arraycopy(b, 0, result, alen, blen); return result; } /** * 判断Map是否不为null和空{} * * @param map ## @see Map * @return 如果不为空, 则返回true */ public static boolean isNotEmpty(Map<?, ?> map) { return (map != null) && (map.size() > 0); } /** * 判断Collection是否为null或空数组[]。 * * @param collection * @see Collection * @return 如果为空, 则返回true */ public static boolean isEmpty(Collection<?> collection) { return (collection == null) || (collection.size() == 0); } /** * 判断Collection是否不为null和空数组[]。 * * @param collection * @return 如果不为空, 则返回true */ public static boolean isNotEmpty(Collection<?> collection) { return (collection != null) && (collection.size() > 0); } /** * 判断Enumeration是否有元素 * * @param enums ## @see Enumeration * @return 如果有元素, 则返回true */ public static boolean hasItems(Enumeration<?> enums) { return (enums != null) && (enums.hasMoreElements()); } /** * 判断Enumeration是否没有元素 * * @param enums ## @see Enumeration * @return 如果没有元素, 则返回true */ public static boolean hasNotItems(Enumeration<?> enums) { return (enums == null) || (!enums.hasMoreElements()); } /** * 判断Iterator是否有元素 * * @param iters ## @see Iterator * @return 如果有元素, 则返回true */ public static boolean hasItems(Iterator<?> iters) { return (iters != null) && (iters.hasNext()); } /** * 判断Iterator是否没有元素 * * @param iters ## @see Iterator * @return 如果没有元素, 则返回true */ public static boolean hasNotItems(Iterator<?> iters) { return (iters != null) && (iters.hasNext()); } /** * 创建ArrayList实例 * * @param <E> * @return ArrayList实例 */ public static <E> ArrayList<E> createArrayList() { return new ArrayList<E>(); } /** * 创建ArrayList实例 * * @param <E> * @param initialCapacity 初始化容量 * @return ArrayList实例 */ public static <E> ArrayList<E> createArrayList(int initialCapacity) { return new ArrayList<E>(initialCapacity); } /** * 创建ArrayList实例 * * @param <E> * @param collection 集合 @see Collection * @return ArrayList实例 */ public static <E> ArrayList<E> createArrayList(Collection<? extends E> collection) { if (collection == null) { return new ArrayList<E>(); } return new ArrayList<E>(collection); } /** * 创建ArrayList实例 * * @param iter 迭代器 @see Iterable * @return ArrayList实例 */ public static <E> ArrayList<E> createArrayList(Iterable<? extends E> iter) { if (iter instanceof Collection<?>) { return new ArrayList<E>((Collection<? extends E>) iter); } ArrayList<E> list = new ArrayList<E>(); iterableToCollection(iter, list); list.trimToSize(); return list; } /** * 创建ArrayList实例 * * @param V 构建对象集 * @return ArrayList实例 */ public static <T, V extends T> ArrayList<T> createArrayList(V...args) { if (args == null || args.length == 0) { return new ArrayList<T>(); } ArrayList<T> list = new ArrayList<T>(args.length); for (V v : args) { list.add(v); } return list; } /** * 创建LinkedList实例 * * @param <E> * @return LinkedList实例 */ public static <E> LinkedList<E> createLinkedList() { return new LinkedList<E>(); } /** * 创建LinkedList实例 * * @param collection 集合 @see Collection * @return LinkedList实例 */ public static <E> LinkedList<E> createLinkedList(Collection<? extends E> collection) { if (collection == null) { return new LinkedList<E>(); } return new LinkedList<E>(collection); } /** * 创建LinkedList实例 * * @param Iterable 迭代器 @see Iterable * @return LinkedList实例 */ public static <T> LinkedList<T> createLinkedList(Iterable<? extends T> c) { LinkedList<T> list = new LinkedList<T>(); iterableToCollection(c, list); return list; } /** * 创建LinkedList实例 * * @param V 构建对象集 * @return LinkedList实例 */ public static <T, V extends T> LinkedList<T> createLinkedList(V...args) { LinkedList<T> list = new LinkedList<T>(); if (args != null) { for (V v : args) { list.add(v); } } return list; } /** * 创建一个List。 * <p> * 和{@code createArrayList(args)}不同,本方法会返回一个不可变长度的列表,且性能高于 {@code createArrayList(args)}。 * </p> */ public static <T> List<T> asList(T...args) { if (args == null || args.length == 0) { return Collections.emptyList(); } return Arrays.asList(args); } /** * 创建HashSet实例 * * @param <E> * @return HashSet实例 */ public static <E> HashSet<E> createHashSet() { return new HashSet<E>(); } /** * 创建HashSet实例 * * @param <E> * @param initialCapacity 初始化容量 * @return HashSet实例 */ public static <E> HashSet<E> createHashSet(int initialCapacity) { return new HashSet<E>(initialCapacity); } /** * 创建HashSet实例 * * @param collection 集合 * @return HashSet实例 */ public static <E> HashSet<E> createHashSet(Collection<? extends E> collection) { if (collection == null) { return new HashSet<E>(); } return new HashSet<E>(collection); } /** * 创建HashSet实例 * * @param args 传入参数 * @return HashSet实例 */ public static <E, O extends E> HashSet<E> createHashSet(O...args) { if (args == null || args.length == 0) { return new HashSet<E>(); } HashSet<E> set = new HashSet<E>(args.length); for (O o : args) { set.add(o); } return set; } /** * 创建一个HashSet。 * * @param iter 迭代器 @see Iterable * @return HashSet实例 */ public static <T> HashSet<T> createHashSet(Iterable<? extends T> iter) { HashSet<T> set; if (iter instanceof Collection<?>) { set = new HashSet<T>((Collection<? extends T>) iter); } else { set = new HashSet<T>(); iterableToCollection(iter, set); } return set; } /** * 创建LinkedHashSet实例 * * @param <E> * @return LinkedHashSet实例 */ public static <E> LinkedHashSet<E> createLinkedHashSet() { return new LinkedHashSet<E>(); } /** 创建一个LinkedHashSet。 */ public static <T, V extends T> LinkedHashSet<T> createLinkedHashSet(V...args) { if (args == null || args.length == 0) { return new LinkedHashSet<T>(); } LinkedHashSet<T> set = new LinkedHashSet<T>(args.length); for (V v : args) { set.add(v); } return set; } /** 创建一个LinkedHashSet。 */ public static <T> LinkedHashSet<T> createLinkedHashSet(Iterable<? extends T> iter) { LinkedHashSet<T> set; if (iter instanceof Collection<?>) { set = new LinkedHashSet<T>((Collection<? extends T>) iter); } else { set = new LinkedHashSet<T>(); iterableToCollection(iter, set); } return set; } /** 创建一个TreeSet。 */ @SuppressWarnings("unchecked") public static <T, V extends T> TreeSet<T> createTreeSet(V...args) { return (TreeSet<T>) createTreeSet(null, args); } /** 创建一个TreeSet。 */ public static <T> TreeSet<T> createTreeSet(Iterable<? extends T> c) { return createTreeSet(null, c); } /** 创建一个TreeSet。 */ public static <T> TreeSet<T> createTreeSet(Comparator<? super T> comparator) { return new TreeSet<T>(comparator); } /** 创建一个TreeSet。 */ public static <T, V extends T> TreeSet<T> createTreeSet(Comparator<? super T> comparator, V...args) { TreeSet<T> set = new TreeSet<T>(comparator); if (args != null) { for (V v : args) { set.add(v); } } return set; } /** 创建一个TreeSet。 */ public static <T> TreeSet<T> createTreeSet(Comparator<? super T> comparator, Iterable<? extends T> c) { TreeSet<T> set = new TreeSet<T>(comparator); iterableToCollection(c, set); return set; } /** * 创建TreeSet实例 * * @param <E> * @param set 排序的散列 @see SortedSet * @return TreeSet实例 */ public static <E> TreeSet<E> createTreeSet(SortedSet<E> set) { if (set == null) { return new TreeSet<E>(); } return new TreeSet<E>(set); } /** * 创建HashMap实例 * * @param <K> * @param <V> * @return HashMap实例 */ public static <K, V> HashMap<K, V> createHashMap() { return new HashMap<K, V>(); } /** * 创建HashMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @return HashMap实例 */ public static <K, V> HashMap<K, V> createHashMap(int initialCapacity) { return new HashMap<K, V>(initialCapacity); } /** * 创建HashMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @param loadFactor 加载因子 * @return HashMap实例 */ public static <K, V> HashMap<K, V> createHashMap(int initialCapacity, float loadFactor) { return new HashMap<K, V>(initialCapacity, loadFactor); } public static <K, V> HashMap<K, V> synchronizedMap() { return (HashMap<K, V>) Collections.synchronizedMap(new HashMap<K, V>()); } /** * 创建HashMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return HashMap实例 */ public static <K, V> HashMap<K, V> createHashMap(Map<? extends K, ? extends V> map) { return new HashMap<K, V>(map); } /** * 创建LinkedHashMap实例 * * @param <K> * @param <V> * @return LinkedHashMap实例 */ public static <K, V> LinkedHashMap<K, V> createLinkedHashMap() { return new LinkedHashMap<K, V>(); } /** * 创建LinkedHashMap实例 * * @param initialCapacity 初始化容量 * @return LinkedHashMap实例 */ public static <K, V> LinkedHashMap<K, V> createLinkedHashMap(int initialCapacity) { return new LinkedHashMap<K, V>(initialCapacity); } /** * 创建LinkedHashMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @param loadFactor 加载因子 * @return LinkedHashMap实例 */ public static <K, V> LinkedHashMap<K, V> createLinkedHashMap(int initialCapacity, float loadFactor) { return new LinkedHashMap<K, V>(initialCapacity, loadFactor); } /** * 创建LinkedHashMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return HashMap实例 */ public static <K, V> LinkedHashMap<K, V> createLinkedHashMap(Map<? extends K, ? extends V> map) { if (map == null) { return new LinkedHashMap<K, V>(); } return new LinkedHashMap<K, V>(map); } /** * 创建ConcurrentMap实例 * * @param <K> * @param <V> * @return ConcurrentMap实例 */ public static <K, V> ConcurrentMap<K, V> createConcurrentMap() { return new ConcurrentHashMap<K, V>(); } /** * 创建ConcurrentMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return ConcurrentMap实例 */ public static <K, V> ConcurrentMap<K, V> createConcurrentMap(Map<? extends K, ? extends V> map) { if (map == null) { return null; } return new ConcurrentHashMap<K, V>(map); } /** * 创建ConcurrentMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @return ConcurrentMap实例 */ public static <K, V> ConcurrentMap<K, V> createConcurrentMap(int initialCapacity) { return new ConcurrentHashMap<K, V>(initialCapacity); } /** * 创建ConcurrentMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @param loadFactor 加载因子 * @return ConcurrentMap实例 */ public static <K, V> ConcurrentMap<K, V> createConcurrentMap(int initialCapacity, float loadFactor) { return new ConcurrentHashMap<K, V>(initialCapacity, loadFactor); } private static <E> void iterableToCollection(Iterable<? extends E> iter, Collection<E> list) { if (iter == null) { return; } for (E element : iter) { list.add(element); } } public static <E extends Enum<E>> EnumSet<E> createEnumSet(Collection<E> c) { if (c == null) { return null; } return EnumSet.copyOf(c); } public static <E extends Enum<E>> EnumSet<E> createEnumSet(Class<E> elementType) { if (elementType == null) { return null; } return EnumSet.allOf(elementType); } /** * 创建TreeMap实例 * * @param <K> * @param <V> * @return TreeMap实例 */ public static <K, V> TreeMap<K, V> createTreeMap() { return new TreeMap<K, V>(); } /** * 创建TreeMap实例 * * @param <K> * @param <V> * @param comparator 比较器 @see Comparator * @return TreeMap实例 */ public static <K, V> TreeMap<K, V> createTreeMap(Comparator<? super K> comparator) { if (comparator == null) { return null; } return new TreeMap<K, V>(comparator); } /** * 创建TreeMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return TreeMap实例 */ public static <K, V> TreeMap<K, V> createTreeMap(Map<? extends K, ? extends V> map) { if (map == null) { return null; } return new TreeMap<K, V>(map); } /** * 创建TreeMap实例 * * @param <K> * @param <V> * @param map 排序的映射表 @see Map * @return TreeMap实例 */ public static <K, V> TreeMap<K, V> createTreeMap(SortedMap<K, ? extends V> map) { if (map == null) { return null; } return new TreeMap<K, V>(map); } /** * 创建WeakHashMap实例 * * @param <K> * @param <V> * @return WeakHashMap实例 */ public static <K, V> WeakHashMap<K, V> createWeakHashMap() { return new WeakHashMap<K, V>(); } /** * 创建WeakHashMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @return WeakHashMap实例 */ public static <K, V> WeakHashMap<K, V> createWeakHashMap(int initialCapacity) { return new WeakHashMap<K, V>(initialCapacity); } /** * 创建WeakHashMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return WeakHashMap实例 */ public static <K, V> WeakHashMap<K, V> createWeakHashMap(Map<? extends K, ? extends V> map) { if (map == null) { return new WeakHashMap<K, V>(); } return new WeakHashMap<K, V>(map); } /** * 创建WeakHashMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @param loadFactor 加载因子 * @return WeakHashMap实例 */ public static <K, V> WeakHashMap<K, V> createWeakHashMap(int initialCapacity, float loadFactor) { return new WeakHashMap<K, V>(initialCapacity, loadFactor); } /** * 创建IdentityHashMap实例 * * @param <K> * @param <V> * @return IdentityHashMap实例 */ public static <K, V> IdentityHashMap<K, V> createIdentityHashMap() { return new IdentityHashMap<K, V>(); } /** * 创建IdentityHashMap实例 * * @param <K> * @param <V> * @param initialCapacity 初始化容量 * @return IdentityHashMap实例 */ public static <K, V> IdentityHashMap<K, V> createIdentityHashMap(int initialCapacity) { return new IdentityHashMap<K, V>(initialCapacity); } /** * 创建IdentityHashMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return IdentityHashMap实例 */ public static <K, V> IdentityHashMap<K, V> createIdentityHashMap(Map<? extends K, ? extends V> map) { if (map == null) { return null; } return new IdentityHashMap<K, V>(map); } public static <K extends Enum<K>, V> EnumMap<K, V> createEnumMap(Class<K> keyType) { if (keyType == null) { return null; } return new EnumMap<K, V>(keyType); } public static <K extends Enum<K>, V> EnumMap<K, V> createEnumMap(Map<K, ? extends V> map) { if (map == null) { return null; } return new EnumMap<K, V>(map); } /** * 创建PriorityQueue实例 * * @param <E> * @return PriorityQueue实例 */ public static <E> PriorityQueue<E> createPriorityQueue() { return new PriorityQueue<E>(); } /** * 创建PriorityQueue实例 * * @param <E> * @param initialCapacity 初始化容量 * @return PriorityQueue实例 */ public static <E> PriorityQueue<E> createPriorityQueue(int initialCapacity) { return new PriorityQueue<E>(initialCapacity); } /** * 创建PriorityQueue实例 * * @param <E> * @param collection 集合 @see Collection * @return PriorityQueue实例 */ public static <E> PriorityQueue<E> createPriorityQueue(Collection<? extends E> collection) { if (collection == null) { return null; } return new PriorityQueue<E>(collection); } /** * 创建PriorityQueue实例 * * @param <E> * @param initialCapacity 初始化容量 * @param comparator 比较器 @see Comparator * @return PriorityQueue实例 */ public static <E> PriorityQueue<E> createPriorityQueue(int initialCapacity, Comparator<? super E> comparator) { if (comparator == null) { return new PriorityQueue<E>(initialCapacity); } return new PriorityQueue<E>(initialCapacity, comparator); } /** * 创建PriorityQueue实例 * * @param <E> * @param queue 队列 @see PriorityQueue * @return PriorityQueue实例 */ public static <E> PriorityQueue<E> createPriorityQueue(PriorityQueue<? extends E> queue) { if (queue == null) { return null; } return new PriorityQueue<E>(queue); } /** * 创建PriorityQueue实例 * * @param <E> * @param set 排序的散列 @see SortedSet * @return PriorityQueue实例 */ public static <E> PriorityQueue<E> createPriorityQueue(SortedSet<? extends E> set) { if (set == null) { return null; } return new PriorityQueue<E>(set); } /** * 创建ArrayDeque实例 * * @param <E> * @return ArrayDeque实例 */ public static <E> ArrayDeque<E> createArrayDeque() { return new ArrayDeque<E>(); } /** * 创建ArrayDeque实例 * * @param <E> * @param collection 集合 @see Collection * @return ArrayDeque实例 */ public static <E> ArrayDeque<E> createArrayDeque(Collection<? extends E> collection) { if (collection == null) { return null; } return new ArrayDeque<E>(collection); } /** * 创建ArrayDeque实例 * * @param <E> * @param initialCapacity 初始化容量 * @return ArrayDeque实例 */ public static <E> ArrayDeque<E> createArrayDeque(int initialCapacity) { return new ArrayDeque<E>(initialCapacity); } /** * 创建BitSet实例 * * @param <E> * @return BitSet实例 */ public static <E> BitSet createBitSet() { return new BitSet(); } /** * 创建BitSet实例 * * @param <E> * @param initialCapacity 初始化容量 * @return BitSet实例 */ public static <E> BitSet createBitSet(int initialCapacity) { return new BitSet(); } /** * 创建ConcurrentSkipListMap实例 * * @param <K> * @param <V> * @return ConcurrentSkipListMap实例 */ public static <K, V> ConcurrentSkipListMap<K, V> createConcurrentSkipListMap() { return new ConcurrentSkipListMap<K, V>(); } /** * 创建ConcurrentSkipListMap实例 * * @param <K> * @param <V> * @param comparator 比较器 @see Comparator * @return ConcurrentSkipListMap实例 */ public static <K, V> ConcurrentSkipListMap<K, V> createConcurrentSkipListMap(Comparator<? super K> comparator) { if (comparator == null) { return new ConcurrentSkipListMap<K, V>(); } return new ConcurrentSkipListMap<K, V>(comparator); } /** * 创建ConcurrentSkipListMap实例 * * @param <K> * @param <V> * @param map 映射表 @see Map * @return ConcurrentSkipListMap实例 */ public static <K, V> ConcurrentSkipListMap<K, V> createConcurrentSkipListMap(Map<? extends K, ? extends V> map) { if (map == null) { return new ConcurrentSkipListMap<K, V>(); } return new ConcurrentSkipListMap<K, V>(map); } /** * 创建ConcurrentSkipListMap实例 * * @param <K> * @param <V> * @param map 排序的映射表 @see SortedMap * @return ConcurrentSkipListMap实例 */ public static <K, V> ConcurrentSkipListMap<K, V> createConcurrentSkipListMap(SortedMap<? extends K, ? extends V> map) { if (map == null) { return new ConcurrentSkipListMap<K, V>(); } return new ConcurrentSkipListMap<K, V>(map); } /** * 创建ConcurrentSkipListSet实例 * * @param <E> 泛型 * @return ConcurrentSkipListSet实例 */ public static <E> ConcurrentSkipListSet<E> createConcurrentSkipListSet() { return new ConcurrentSkipListSet<E>(); } /** * 创建ConcurrentSkipListSet实例 * * @param <E> 泛型 * @param collection 集合 @see Collection * @return ConcurrentSkipListSet实例 */ public static <E> ConcurrentSkipListSet<E> createConcurrentSkipListSet(Collection<? extends E> collection) { if (collection == null) { return new ConcurrentSkipListSet<E>(); } return new ConcurrentSkipListSet<E>(collection); } /** * 创建ConcurrentSkipListSet实例 * * @param <E> 泛型 * @param comparator 比较器 @see Comparator * @return ConcurrentSkipListSet实例 */ public static <E> ConcurrentSkipListSet<E> createConcurrentSkipListSet(Comparator<? super E> comparator) { if (comparator == null) { return new ConcurrentSkipListSet<E>(); } return new ConcurrentSkipListSet<E>(comparator); } /** * 创建ConcurrentSkipListSet实例 * * @param <E> 泛型 * @param set 可排序的散列 @see SortedSet * @return ConcurrentSkipListSet实例 */ public static <E> ConcurrentSkipListSet<E> createConcurrentSkipListSet(SortedSet<E> set) { if (set == null) { return new ConcurrentSkipListSet<E>(); } return new ConcurrentSkipListSet<E>(set); } /** * 创建ConcurrentLinkedQueue实例 * * @param <E> 泛型 * @return ConcurrentLinkedQueue实例 */ public static <E> Queue<E> createConcurrentLinkedQueue() { return new ConcurrentLinkedQueue<E>(); } /** * 创建ConcurrentLinkedQueue实例 * * @param <E> 泛型 * @param collection 集合 @see Collection * @return ConcurrentLinkedQueue实例 */ public static <E> Queue<E> createConcurrentLinkedQueue(Collection<? extends E> collection) { if (collection == null) { return new ConcurrentLinkedQueue<E>(); } return new ConcurrentLinkedQueue<E>(collection); } /** * 创建CopyOnWriteArrayList实例 * * @param <E> 泛型 * @return CopyOnWriteArrayList实例 */ public static <E> CopyOnWriteArrayList<E> createCopyOnWriteArrayList() { return new CopyOnWriteArrayList<E>(); } /** * 创建CopyOnWriteArrayList实例 * * @param <E> 泛型 * @param collection 集合 @see Collection * * @return CopyOnWriteArrayList实例 */ public static <E> CopyOnWriteArrayList<E> createCopyOnWriteArrayList(Collection<? extends E> collection) { if (collection == null) { return new CopyOnWriteArrayList<E>(); } return new CopyOnWriteArrayList<E>(); } /** * 创建CopyOnWriteArrayList实例 * * @param <E> 泛型 * @param toCopyIn 创建一个保存给定数组的副本的数组 * * @return CopyOnWriteArrayList实例 */ public static <E> CopyOnWriteArrayList<E> createCopyOnWriteArrayList(E[] toCopyIn) { if (toCopyIn == null) { return new CopyOnWriteArrayList<E>(); } return new CopyOnWriteArrayList<E>(toCopyIn); } /** * 创建CopyOnWriteArraySet实例 * * @param <E> 泛型 * @return CopyOnWriteArraySet实例 */ public static <E> CopyOnWriteArraySet<E> createCopyOnWriteArraySet() { return new CopyOnWriteArraySet<E>(); } /** * 创建CopyOnWriteArraySet实例 * * @param <E> 泛型 * @param collection 集合 @see Collection * * @return CopyOnWriteArraySet实例 */ public static <E> CopyOnWriteArraySet<E> createCopyOnWriteArraySet(Collection<? extends E> collection) { return new CopyOnWriteArraySet<E>(); } public static <E> BlockingQueue<E> createLinkedBlockingQueue() { return new LinkedBlockingQueue<E>(); } public static <E> BlockingQueue<E> createLinkedBlockingQueue(int capacity) { return new LinkedBlockingQueue<E>(capacity); } public static <E> BlockingQueue<E> createLinkedBlockingQueue(Collection<? extends E> collection) { if (collection == null) { return new LinkedBlockingQueue<E>(); } return new LinkedBlockingQueue<E>(collection); } // ========================================================================== // 常用转换。 // ========================================================================== /** * 字符串数组去重复 * @param arr * @return */ public static String[] arrayToHeavy(String[] arr){ Set<String> set = new HashSet<String>(); for (int i = 0; i < arr.length; i++) { set.add(arr[i]); } String[] a = (String[]) set.toArray(new String[set.size()]); return a; } /** * list去重复 * @param list * @return */ public static <T> List<T> listToHeavy(List<T> list){ Set<T> set = new HashSet<T>(list); list.clear(); list.addAll(set); return list; } // ========================================================================== // 集合运算。 // ========================================================================== /** 集合交集 */ public static final <T> Set<T> intersection(Set<T> set1, Set<T> set2) { if (set1 == null || set2 == null) { return null; } if (set1.isEmpty() || set2.isEmpty()) { return Collections.emptySet(); } Set<T> result = CollectionKit.createHashSet(); Set<T> smaller = (set1.size() > set2.size()) ? set2 : set1; Set<T> bigger = (smaller == set2) ? set1 : set2; for (T value : smaller) { if (bigger.contains(value)) { result.add(value); } } return result; } public static <T> Set<T> subtract(Set<T> set1, Set<T> set2) { if (set1 == null || set2 == null) { return null; } Set<T> result = createHashSet(set1); result.removeAll(set2); return result; } public static <T> Set<T> union(Set<T> set1, Set<T> set2) { if (isEmpty(set1)) { return set2; } if (isEmpty(set2)) { return set1; } Set<T> result = createHashSet(set1); result.addAll(set2); return result; } /** 连接 */ public static <T> List<? extends T> concatSuper(List<? extends T> collection1, List<? extends T> collection2) { if (isEmpty(collection1)) { return collection2; } if (isEmpty(collection2)) { return collection1; } List<T> result = createArrayList(collection1.size() + collection2.size()); result.addAll(collection1); result.addAll(collection2); return result; } /** 连接 */ public static <T> List<T> concat(List<T> collection1, List<T> collection2) { if (isEmpty(collection1)) { return collection2; } if (isEmpty(collection2)) { return collection1; } collection1.addAll(collection2); return collection1; } // FIXME createCollections add DataFilter implement }