java.util.Collections
来源:互联网 发布:沈阳管家婆软件代理 编辑:程序博客网 时间:2024/05/01 14:55
1、Collection使用比数组方便
例如:toString方法
String[] arr = new String[]{"A","B","C"};System.out.println(arr.toString());List<String> list = java.util.Arrays.asList(arr);System.out.println(list.toString());输出结果:[Ljava.lang.String;@15db9742[A, B, C]
2、Arrays.asList(T… t)
Arrays.asList(T… t)返回的list是一个不可以编辑的集合对象。但是可以添加空对象,但是不可以添加“null”
Arrays.asList(T… t)方法会的list,为Arrays的内部类 ,此私有静态内部类继承了AbstractList,此抽象AbstractList类对于add,remove方法的时下为直接抛出"unSopportedOperationException".
String[] arr = new String[]{"A","B","C"};System.out.println(arr.toString());List<String> list = java.util.Arrays.asList(arr);System.out.println(list.toString());//抛出异常:java.lang.UnsupportedOperationExceptionlist.remove(1);//抛出异常:java.lang.UnsupportedOperationExceptionlist.add(null);//抛出异常:java.lang.NullPointerExceptionlist.addAll(null);List<String> list2 = new ArrayList<String>();list2.add("D");list.addAll(list2);//不抛出异常list.addAll(Collections.EMPTY_LIST);
Arrays的源码如下:
@SafeVarargs @SuppressWarnings("varargs") public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
AbstractList<E>源码如下:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { public E remove(int index) { throw new UnsupportedOperationException(); }}
list.addAll的源码如下,所以,在添加null元素是抛出异常“NullPointException”,添加“空的集合”时,不抛出异常,添加“有元素的集合”是,抛出“unSopportedException”
public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; }
3、Collecionts集合操作
使用removeAll(Collection<?> c) 、containsAll(Collection<?> c) 、addAll(Collection<? extends E> c)、retainAll(Collection<?> c) 方法对集合进行操作,实现将一个集合(特别是由数组转化而成的集合)的内容转移到另一个集合,或者从一个较大对象集合中移除一个较小对象集合,或者判断一个较大的集合中是否存在一个较小的集合,或者保留某一个集合中的内容。
取代数组的循环遍历方法查找、删除、判断有无。
这些方法的效率远高于自己程序写的循环遍历方法。
4、遍历接口java.langIterator
实现了接口java.lang.Iterable中的iterator()方法返回一个java.util.Iterator,此接口在是在[JDK1.5]版本添加,返回一个实现了接口java.lang.Iterator [JDK1.2]的类。
我们可以随意使用 for 循环的变种,它可以在幕后处理上述所有工作,
例如:通过 Iterator 提供 Person 对象的孩子列表的一种方法。 这里提供内部 List 的一个引用 (这使 Person 外的调用者可以为家庭增加孩子 — 而大多数父母并不希望如此),Person 类型实现 Iterable。这种方法还使得 for 循环可以遍历所有孩子。
此方法实现了对“对父母的孩子的遍历,并且无法对Person的实例进行添加“child Person”与删除“child Person”,并且实现了Person类的向下递归。
// Person.javaimport java.util.*;public class Person implements Iterable<Person>{ public Person(String name, Person... kids){ this.name = name; for (Person child : kids) children.add(child); } public String geName() { return this.name; } public Iterator<Person> iterator() { return children.iterator(); } public void setName(String value) { this.name = value; } public String toString() { return "[Person: " +"name=" + name + "]"; } private String name; private List<Person> children = new ArrayList<Person>();} // App.javapublic class App{ public static void main(String[] args){ Person ted = new Person("Ted", new Person("Michael"), new Person("Matthew")); // Iterate over the kids for (Person kid : ted){ System.out.println(kid.getFirstName()); } }}
5、Collections的经典算法
1、反转 reverse(List<?> list)
翻转指定列表中的元素的顺序。
2、 排序sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序,数组可以使用Arrays.sort()进行排序。
3、 混排(Shuffling)
shuffle(List<?> list)混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性(假设随机源是公正的)
4、 替换所以的元素(Fill),
Collections.fill(li,"aaa");
5、 拷贝(Copy)
copy(List<? super T> dest, List<? extends T> src) 用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List 至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。
dest的长度必须大于等于src集合的长度,如果小于,则抛出IndexOfBoundsException异常。
6、min方法,
返回Collections中最小元素(min)
7、max方法,
返回Collections中最小元素(max)
8、lastIndexOfSubList方法,
返回指定源列表中最后一次出现指定目标列表的起始位置lastIndexOfSubList(List<?> source, List<?> target)
9、indexOfSubList
indexOfSubList(List<?> source, List<?> target) 返回指定源列表中第一次出现指定目标列表的起始位置
10、Rotate
根据指定的距离循环移动指定列表中的元素 Collections.rotate(list,-1); 如果是负数,则正向移动,正数则方向移动 这个方法常常和List的subList方法结合使用,用于将一个list的某个或多个元素进行移动,而不破坏其余元素的顺序。例如为了将某个list的位置j的元素向前移动到k的位置。(设移动的距离为d(d >= 0),k = j + d + 1)。
Collections.rotate(list.subList(j, k+1), -1);
详情参见:http://blog.csdn.net/u014532901/article/details/52891183
11、nCopies(int n, T o)
返回由指定对象的 n 个副本组成的不可变列表。
12、reverseOrder()
返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序
13、reverseOrder(Comparator<T> cmp)
返回一个比较器,它强行逆转指定比较器的顺序。
//Student类实现了Comparable接口,实现了compare方法,Collections.reverseOrder()返回的比较器为Student比较器的反向比较器
Comparator<Student> com = Collections.reverseOrder();
Collections.sort(list, com);
14、swap(list,i,j)
在指定列表的指定位置处交换元素。
15、 swap(List<?> list,int i, int j)
(如果指定位置相同,则调用此方法不会更改列表。)
16、binarySearch(List<? extends Comparable<? super T>> list, T key)
使用二分搜索法搜索指定列表,以获得指定对象。
- java.util.Collections;Collections .synchronizedMap
- java.util.Collections学习
- java.util.Collections类
- java.util.Collections学习
- java.util.Collections使用说明
- java.util.Collections
- java.util.Collections 类
- java.util.Collections
- java.util.Collections.reverse()
- Java.util.Collections 类
- java.util.Collections
- 9. java.util.Collections
- util.Collection与java.util.Collections区别
- Java.util.Collections类包
- 要点Java20 java.util.Collections
- java.util.Collections方法大全
- java.util.Collections空集合
- java.util.Collections 进行排序
- 下拉多选列表框
- 深度学习的日记一:线性代数
- mysql 双主迁移
- 关于<context:annotation-config/>
- 公有云市场持续演进,IaaS的优势扩大
- java.util.Collections
- Java并发编程:同步容器
- Spring错误问题java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
- xml与HTML的区别
- java 基础面试题1
- ASP.NET验证控件
- urdf 和 xacro
- 肖仰华 | 基于知识图谱的可解释人工智能:机遇与挑战
- java动态代理学习