java集合中的一些易混淆的知识点

(一) 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()的说明摘自http://trinea.iteye.com/blog/1248517,对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则不然,每次调用都会返回一个从头开始计数的迭代器。

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

时间: 2024-11-08 23:07:12

java集合中的一些易混淆的知识点的相关文章

js和java中正则表达式的易混淆点

js中正则表达式的使用 对表单中的值进行正则表达式匹配一般有两种方法: var reg = new RegExp(regStr); reg.test(value); 如下: var reg = new RegExp("\\d{3}"); reg.test("abc123def"); 结果:true 注:new RegExp中传的是正则表达式的字符串,\需要用\转义. str.match(regex);      如"abc123def".matc

微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

最近有人问我 OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示,为什么选中了 Keep Nulls 但是数据库中没有 NULL 值? 为什么在 Flat File Source 中勾选上了 Retain null values from the source as null values in the data flow 但是为什么目标表上显示的是一个当前日期,而不是 NULL 值等等,单开此文来解释这些非常容易混淆的概念. 在比较纯粹的 ETL 项

java集合中List与set的区别

java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayList list = new ArrayList();//构造出List对象 list.add(1); list.add("string"); list.add(true); list.add(3.14); list.add(null); for(int i = 0; i < size()

Java集合中的LinkedHashMap类

jdk1.8.0_144 本文阅读最好先了解HashMap底层,可前往<Java集合中的HashMap类>. LinkedHashMap由于它的插入有序特性,也是一种比较常用的Map集合.它继承了HashMap,很多方法都直接复用了父类HashMap的方法.本文将探讨LinkedHashMap的内部实现,以及它是如何保证插入元素是按插入顺序排序的. 在分析前可以先思考下,既然是按照插入顺序,并且以Linked-开头,就很有可能是链表实现.如果纯粹以链表实现,也不是不可以,LinkedHashM

Java集合中对象排序

集合中的对象排序需求还是比较常见的,当然我们可以重写equals方法,循环比较:同时Java为我们提供了更易使用的APIs.当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序. Comparable接口方式 类自身实现Comparable接口,实现该接口中的compareTo方法. import java.util.A

如何删除JAVA集合中的元素

经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.hasNext();) { String str = (String)it.next(); if (str.equals("chengang")){ list.remove(str); } } } 这种写法一运行就会报如下异常: Exception in thread "main&qu

java集合中Comparable和Comparator辨析

一.Comparable和Comparator简介 在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较.但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要使用Comparable和Comparator. Comparable和Comparator都是用来实现集合中的排序的,只是Comparable是在集合内图定义的方法实现排序,而Comparator是在集合外部实现的排序.所以如果想对结合排序,需要在

java集合中对象某属性比较排序Comparable与Comparator

要对集合中的对象的某属性进行排序有两种方式. a. 一种是要排序对象类实现comparable接口的compareTo方法:然后把对象放入list:然后调用Collections.sort(list);b. 一种是不对要排序对象类做任何改动,创建Comparator接口的实现类C:然后 把对象放入list:然后调用Collections.sort(list, C); a.eg ---------------------------------- 1 public class User imple

Java集合中迭代器

迭代器的作用:就是用于抓取集合中的元素. 迭代器的方法: hasNext() 问是否有元素可遍历.如果有元素可以遍历,返回true,否则返回false .next() 获取元素...remove() 移除迭代器最后一次返回 的元素 NoSuchElementException 没有元素的异常. 出现的原因: 没有元素可以被迭代了... import java.util.ArrayList; import java.util.Collection; import java.util.Iterato