大佬教程收集整理的这篇文章主要介绍了集合的生产力工具类:Collections,我直呼好家伙。。,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Collections 是 JDK 提供的一个工具类c;位于 java.util 包下c;提供了一系列的静态方法c;方便我们对集合进行各种骚操作c;算是集合框架的一个大管家。
PS:star 这种事c;只能求c;不求没效果c;铁子们c;《Java 程序员进阶之路》在 GitHub 上已经收获了 556 枚星标c;铁子们赶紧去点点了c;冲 600 star!
https://github.com/itwanger/toBeBetterJavaer
还记得我们前面讲过的 Arrays 工具类吗?可以回去温习下。
Collections 的用法很简单c;在 Intellij IDEA 中敲完 Collections.
之后就可以看到它提供的方法了c;大致看一下方法名和参数就能知道这个方法是干嘛的。
为了节省大家的学习时间c;我将这些方法做了一些分类c;并列举了一些简单的例子。
来看例子:
List<String> list = new ArrayList<>();
list.add("沉默王二");
list.add("沉默王三");
list.add("沉默王四");
list.add("沉默王五");
list.add("沉默王六");
System.out.println("原始顺序:" + list);
// 反转
Collections.reverse(list);
System.out.println("反转后:" + list);
// 洗牌
Collections.shuffle(list);
System.out.println("洗牌后:" + list);
// 自然升序
Collections.sort(list);
System.out.println("自然升序后:" + list);
// 交换
Collections.swap(list, 2,4);
System.out.println("交换后:" + list);
输出后:
原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
反转后:[沉默王六, 沉默王五, 沉默王四, 沉默王三, 沉默王二]
洗牌后:[沉默王五, 沉默王二, 沉默王六, 沉默王三, 沉默王四]
自然升序后:[沉默王三, 沉默王二, 沉默王五, 沉默王六, 沉默王四]
交换后:[沉默王三, 沉默王二, 沉默王四, 沉默王六, 沉默王五]
binarySearch(List list, Object key)
:二分查找法c;前提是 List 已经排序过了fill(List list, Object obj)
:使用指定对象填充frequency(Collection c, Object o)
:返回指定对象出现的次数来看例子:
System.out.println("最大元素:" + Collections.@H_187_86@max(list));
System.out.println("最小元素:" + Collections.@H_187_86@min(list));
System.out.println("出现的次数:" + Collections.frequency(list, "沉默王二"));
// 没有排序直接调用二分查找c;结果是不确定的
System.out.println("排序前的二分查找结果:" + Collections.binarySearch(list, "沉默王二"));
Collections.sort(list);
// 排序后c;查找结果和预期一致
System.out.println("排序后的二分查找结果:" + Collections.binarySearch(list, "沉默王二"));
Collections.fill(list, "沉默王八");
System.out.println("填充后的结果:" + list);
输出后:
原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
最大元素:沉默王四
最小元素:沉默王三
出现的次数:1
排序前的二分查找结果:0
排序后的二分查找结果:1
填充后的结果:[沉默王八, 沉默王八, 沉默王八, 沉默王八, 沉默王八]
HashMap 是线程不安全的c;这个我们前面讲到了。那其实 ArrayList 也是线程不安全的c;没法在多线程环境下使用c;那 Collections 工具类中提供了多个 synchronizedXxx 方法c;这些方法会返回一个同步的对象c;从而解决多线程中访问集合时的安全问题。
使用起来也非常的简单:
SynchronizedList synchronizedList = Collections.synchronizedList(list);
看一眼 SynchronizedList 的源码就明白了c;不过是在方法里面使用 synchronized 关键字加了一层锁而已。
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
private static final long serialVersionUID = -7754090372962971524L;
final List<E> list;
SynchronizedList(List<E> list) {
super(list);
this.list = list;
}
public E get(int index) {
synchronized (@H_330_57@mutex) {return list.get(index);}
}
public void add(int index, E element) {
synchronized (@H_330_57@mutex) {list.add(index, element);}
}
public E remove(int index) {
synchronized (@H_330_57@mutex) {return list.remove(index);}
}
}
那这样的话c;其实效率和那些直接在方法上加 synchronized 关键字的 Vector、Hashtable 差不多(JDK 1.0 时期就有了)c;而这些集合类基本上已经废弃了c;几乎不怎么用。
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.serializable
{
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return elementData(index);
}
public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
int numMoved = elementCount - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--elementCount] = null; // Let gc do its work
return oldValue;
}
}
正确的做法是使用并发包下的 CopyOnWriteArrayList、ConcurrentHashMap。这些我们放到并发编程时再讲。
emptyXxx()
:制造一个空的不可变集合singletonXxx()
:制造一个只有一个元素的不可变集合unmodifiableXxx()
:为指定集合制作一个不可变集合举个例子:
List emptyList = Collections.emptyList();
emptyList.add("非空");
System.out.println(emptyList);
这段代码在执行的时候就抛出错误了。
Exception in thread "main" java.lang.UnsupportedoperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.itwanger.s64.Demo.main(Demo.java:61)
这是因为 Collections.emptyList()
会返回一个 Collections 的内部类 EmptyListc;而 EmptyList 并没有重写父类 AbstractList 的 add(int index, E element)
方法c;所以执行的时候就抛出了不支持该操作的 UnsupportedoperationException 了。
这是从分析 add 方法源码得出的原因。除此之外c;emptyList 方法是 final 的c;返回的 EMPTY_LIST 也是 final 的c;种种迹象表明 emptyList 返回的就是不可变对象c;没法进行增伤改查。
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
public static final List EMPTY_LIST = new EmptyList<>();
还有两个方法比较常用:
addAll(Collection<? super T> c, T... elements)
c;往集合中添加元素disjoint(Collection<?> c1, Collection<?> c2)
c;判断两个集合是否没有交集举个例子:
List<String> allList = new ArrayList<>();
Collections.addAll(allList, "沉默王九","沉默王十","沉默王二");
System.out.println("addAll 后:" + allList);
System.out.println("是否没有交集:" + (Collections.disjoint(list, allList) ? "是" : "否"));
输出后:
原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
addAll 后:[沉默王九, 沉默王十, 沉默王二]
是否没有交集:否
整体上c;Collections 工具类作为集合框架的大管家c;提供了一些非常便利的方法供我们调用c;也非常容易掌握c;没什么难点c;看看方法的注释就能大致明白干嘛的。
不过c;工具就放在那里c;用是一回事c;为什么要这么用就是另外一回事了。能不能提高自己的编码水平c;很大程度上取决于你到底有没有去钻一钻源码c;看这些设计 JDK 的大师们是如何写代码的c;学会一招半式c;在工作当中还是能很快脱颖而出的。
恐怕 JDK 的设计者是这个世界上最好的老师了c;文档写得不能再详细了c;代码写得不能再优雅了c;基本上都达到了性能上的极致。
可能有人会说c;工具类没什么鸟用c;不过是调用下方法而已c;但这就大错特错了:如果要你来写c;你能写出来 Collections 这样一个工具类吗?
这才是高手要思考的一个问题。
这是《Java 程序员进阶之路》专栏的第 64 篇。Java 程序员进阶之路c;风趣幽默、通俗易懂c;对 Java 初学者极度友好和舒适618;c;内容包括但不限于 Java 语法、Java 集合框架、Java IO、Java 并发编程、Java 虚拟机等核心知识点。
https://github.com/itwanger/toBeBetterJavaer
以上是大佬教程为你收集整理的集合的生产力工具类:Collections,我直呼好家伙。。全部内容,希望文章能够帮你解决集合的生产力工具类:Collections,我直呼好家伙。。所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。