(一) collection和collections
这两者均位于java.util包下,不同的是:
collection是一个集合接口,有ListSet等常见的子接口,是集合框架图的第一个节点,,提供了对集合对象进行基本操作的一系列方法。
常见的方法有:
boolean add(E e) 往容器中添加元素;int size() 返回collection的元素数;boolean isEmpty() 判断此容器是否为空; boolean contains(Object o) 如果此collection包含指定的元素,则返回true,,这里会用到equals()方法;boolean remove(Object o) 移除指定元素的实例;等。
而collections是一个包装类,它包含有各种有关集合操作的静态多态方法,它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。
常见的方法有:
void sort(List) 对List的内容进行排序。
这里要注意的是,(ps:以下有关sort()的说明摘自浅谈对象数组或list排序及Collections排序原理,对List及Collection排序追本溯源,写得很清晰)
这个sort()函数中的排序主体是Arrays.sort(),
@SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] array = list.toArray(); Arrays.sort(array); int i = 0; ListIterator<T> it = list.listIterator(); while (it.hasNext()) { it.next(); it.set((T) array[i++]); } }而Arrays.sort()中,可以看出是通过ComparableTimSort.sort(Object[] a)实现的:
public static void sort(Object[] array) { // BEGIN android-changed ComparableTimSort.sort(array); // END android-changed }static void sort(Object[] a)到static void sort(Object[] a, int lo, int hi)到private static void binarySort(Object[] a, int lo, int hi, int start)。在binarySort中用于大小比较部分为:
Comparable<Object> pivot = (Comparable) a[start]; int left = lo; int right = start; assert left <= right; while (left < right) { int mid = (left + right) >>> 1; if (pivot.compareTo(a[mid]) < 0) right = mid; else left = mid + 1; }
二分查找中比较大小部分使用了Comparable接口的唯一一个方法:compareTo(),所有如果自定义的类装载到容器中需要进行比较的时候,要实现Comparable接口或继承Comparator类,并重写compareTo()方法。
int binarySearch(List object) 对于顺序的List容器,采用折半查找法查找指定对象;void reverse(List) 对List的容器内的对象进行逆序排列;等。
(二)Iterator和Iterable
首先,Iterable位于java.lang包下,Iterator位于java.util包下。在集合框架中,Iterator接口中定义了一下三个方法:boolean hasNext();E next();void remove()。而Iterable中只定义了一个方法:iterator(),返回值为实现了Iterator接口的的一个对象。Collection继承了Iterable这个超级接口,故所有的集合框架中的实现类都具有iterator()这个方法,而多态让Iterator的引用可以访问到当前集合中实现了Iterator的那部分(即那三个方法)。此时如果需要删除元素,由于Iterator对这个集合操作时完成了锁定,在用Iterator循环遍历的过程中只能使用Iterator的remove()方法,而不能使用Collection自己的remove(Object)方法。
那么为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢,这样就可以让集合类直接继承这三个方法?
看一下html" target="_blank">JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。
因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。
如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。
以上这篇基于java集合中的一些易混淆的知识点(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍PHP易混淆知识整理笔记,包括了PHP易混淆知识整理笔记的使用技巧和注意事项,需要的朋友参考一下 1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的。echo输出后没有返回值,但print有返回值,当其执行失败时返回flase。因此可以作为一个普通函数来使用,例如执行下面的代码后变量$r的值将为1。 这意味着print可用
本文向大家介绍基于java中集合的概念(详解),包括了基于java中集合的概念(详解)的使用技巧和注意事项,需要的朋友参考一下 1.集合是储存对象的,长度可变,可以封装不同的对象 2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加) 就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类. 二每一个容器的数据结构不同,所以取出的动作
我正在阅读关于线程的oracle java教程,我看到了这个示例 当有人可能使用这些方法签入他们的代码时?thread.interrupt(标志)是静态的,所以通过上面的检查,我们实际上检查是否有任何踏面被中断了?即使是这样,根据教程,当线程通过调用静态方法thread.interrupted检查中断时,中断状态将被清除。或任何通过抛出InterruptedException退出的方法在这样做时将
本文向大家介绍关于SQL注入绕过的一些知识点,包括了关于SQL注入绕过的一些知识点的使用技巧和注意事项,需要的朋友参考一下 一、 绕过waf思路 从第一步起,一点一点去分析,然后绕过。 1、过滤 and,or 2、过滤 and, or, union 3、过滤 and, or, union, where 4、过滤 and, or, union, where, limit 5、过滤 and, or,
本文向大家介绍Lua中关于元方法的一些知识点小结,包括了Lua中关于元方法的一些知识点小结的使用技巧和注意事项,需要的朋友参考一下 本篇要介绍的东西比较零散,都是一些小知识点,所以就放在一起了。 1.两个具有不同元表的值进行算术操作(比如加法) 之前举例的时候,两个table相加,这两个table都是具有相同的元表的,所以没有任何问题。 那么,如果两个table或者两个进行相加操作的值,具有不同的
本文向大家介绍Android 一些常用的混淆Proguard,包括了Android 一些常用的混淆Proguard的使用技巧和注意事项,需要的朋友参考一下 一些公共的模板 一些自定义的模板 aar中增加独立的混淆配置 检查混淆和追踪异常 开启 Proguard 功能,则每次构建时 ProGuard 都会输出下列文件: dump.txt 说明 APK 中所有类文件的内部结构。 mapping.txt
我刚刚学习了透视投影,并且发现在openGl中应用它有点令人困惑。 考虑一个简单的正方形。<br>在使用透视投影之前,我可以定义其顶点在[-1,1]空间中的坐标,对于{0.0f,0.0f,0.0 f,1.0f、1.0f、1.0 f、1,0.0 F}的输入,该正方形将占据窗口的第一象限 考虑我的代码中的以下部分: 设置矩阵: 制服: 顶点着色器: 但是,结果是一个空白屏幕 我需要在此应用哪些额外的转
我在跟踪http://spark.apache.org/docs/latest/sql-programming-guide.html 打字后: 我有一些我没有看到答案的问题。 首先,什么是$符号?如 第二,我能从第二行得到数据吗(我不知道第二行的数据是什么)。 第三,你将如何阅读彩色图像与火花sql? 第四,我仍然不确定数据集和火花中的数据帧有什么区别。变量df是一个数据帧,所以我可以将“Mich