当前位置: 移动技术网 > IT编程>开发语言>Java > 基于java集合中的一些易混淆的知识点(详解)

基于java集合中的一些易混淆的知识点(详解)

2019年07月22日  | 移动技术网IT编程  | 我要评论

漳州吉马印刷职业技术学院,乔什61哈切森,4个月宝宝发育指标

(一) 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接口呢,这样就可以让集合类直接继承这三个方法?

看一下jdk中的集合类,比如list一族或者set一族,都是实现了iterable接口,但并不直接实现iterator接口。

仔细想一下这么做是有道理的。 

因为iterator接口的核心方法next()或者hasnext() 是依赖于迭代器的当前迭代位置的。

如果collection直接实现iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。

当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。

除非再为iterator接口添加一个reset()方法,用来重置当前迭代位置。

但即时这样,collection也只能同时存在一个当前迭代位置。

而iterable则不然,每次调用都会返回一个从头开始计数的迭代器。

多个迭代器是互不干扰的。

以上这篇基于java集合中的一些易混淆的知识点(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网