欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java源碼解析之接口List

 更新時間:2021年05月19日 11:25:14   作者:不會編程的派大星  
今天帶大家復習Java基礎的一些知識點,對接口List進行了詳細的解析,對正在學習Java的小伙伴們有很好地幫助,需要的朋友可以參考下

前言

List接口是Collection接口的三大接口之一,其中的數(shù)據(jù)可以通過位置檢索,用戶可以在指定位置插入數(shù)據(jù)。List的數(shù)據(jù)可以為空,可以重復。我們來看看api文檔是怎么說的:

在這里插入圖片描述

一、List特有的方法

我們這里就只關注和Collection不同的方法,主要有以下這些:

//在指定位置,將指定的集合插入到當前的集合中
boolean addAll(int index, Collection<? extends E> c);

//這是一個默認實現(xiàn)的方法,會通過Iterator的方式對每個元素進行指定的操作
default void replaceAll(UnaryOperator<E> operator) {
    Objects.requireNonNull(operator);
    final ListIterator<E> li = this.listIterator();
    while (li.hasNext()) {
        li.set(operator.apply(li.next()));
    }
}

//排序,依據(jù)指定的規(guī)則對當前集合進行排序,可以看到,排序是通過Arrays這個工具類完成的。
default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

//獲取指定位置的元素
E get(int index);

//修改指定位置元素的值
E set(int index, E element);

//將指定元素添加到指定的位置
void add(int index, E element);

//將指定位置的元素移除
E remove(int index);

//返回一個元素在集合中首次出現(xiàn)的位置
int indexOf(Object o);

//返回一個元素在集合中最后一次出現(xiàn)的位置
int lastIndexOf(Object o);

//ListIterator繼承于Iterator,主要增加了向前遍歷的功能
ListIterator<E> listIterator();

//從指定位置開始,返回一個ListIterator
ListIterator<E> listIterator(int index);

//返回一個子集合[fromIndex, toIndex),非結構性的修改返回值會反映到原表,反之亦然。
//如果原表進行了結構修改,則返回的子列表可能發(fā)生不可預料的事情
List<E> subList(int fromIndex, int toIndex);

通過對上面方法的研究,我們不難發(fā)現(xiàn),collection接口主要提供一些通常的方法,而List接口則針對線性表的結構,提供了對位置以及字表的操作。

二、超級實現(xiàn)類AbstractList

我們先看看源文檔是怎么來說AbstractList的,要實現(xiàn)一個不可修改的集合,只需要復寫get和size方法。如果要實現(xiàn)一個可以修改的集合,還需要復寫set方法,如果要動態(tài)調整大小,就必須實現(xiàn)add和remove方法。

接下里我們一起來來看看源碼吧!

//在AbstractCollection中,add方法默認會拋出異常,
//而在這里是調用了add(int index, E e)方法,但這個方法也是沒有實現(xiàn)的。
//這里默認會把元素添加到末尾。
public boolean add(E e) {
    add(size(), e);
    return true;
}

//同上,這個只需要進行一次遍歷即可
public boolean addAll(int index, Collection<? extends E> c) {
    //...   
}

接下里我們在繼續(xù)看看其他幾個方法,這幾個是與Iterator和ListIterator息息相關的,在AbstractList中有具體的實現(xiàn),我們先來看看它是如何把集合轉變成Iterator對象并支持foreach循環(huán)的吧。

我們通過源碼發(fā)現(xiàn):在Iterator方法中,是直接返回一個 Itr對象

public Iterator<E> iterator() {
    return new Itr();
}

其實我們很快也就會明白,它是實現(xiàn)了一個內部類,這個內部類實現(xiàn)了Iterator接口,合理的處理hasNext、next、remove方法。這個源碼就不粘貼啦,其中僅僅在remove時考慮了一下多線程問題,有興趣的可以自己去看看。

我們來看看另一個吧–ListIterator吧他也是通過一個內部類是實現(xiàn)的

public ListIterator<E> listIterator() {
    return listIterator(0);
}
public ListIterator<E> listIterator(final int index) {
    rangeCheckForAdd(index);
    return new ListItr(index);
}

事實證明,和我們想的一樣,AbstractList內部還定義了一個ListItr,實現(xiàn)了ListIterator接口,其實現(xiàn)也很簡單,就不粘貼源碼啦。

接下倆讓我們來看看AbtractList是怎么利用這兩個類來做事情的

//尋找一個元素首次出現(xiàn)的位置,只需要從前往后遍歷,找到那個元素并返回其位置即可。
public int indexOf(Object o) {
    ListIterator<E> it = listIterator();
    if (o==null) {
        while (it.hasNext())
            if (it.next()==null)
                return it.previousIndex();
    } else {
        while (it.hasNext())
            if (o.equals(it.next()))
                return it.previousIndex();
    }
    return -1;
}

//同理,尋找一個元素最后一次出現(xiàn)的位置,只需要從列表最后一位向前遍歷即可。
//看到listIterator(int index)方法是可以傳遞參數(shù)的,這個我想我們都可以照著寫出來了。
public int lastIndexOf(Object o) {
    //...
}

//這個方法是把從fromIndex到toIndex之間的元素從集合中刪除。
//clear()方法也是調用這個實現(xiàn)的(我認為clear實現(xiàn)意義并不大,因為在其上級AbstractCollection中已經有了具體實現(xiàn))。
protected void removeRange(int fromIndex, int toIndex) {
    ListIterator<E> it = listIterator(fromIndex);
    for (int i=0, n=toIndex-fromIndex; i<n; i++) {
        it.next();
        it.remove();
    }
}

在接下來讓我們來說一說兩個比較重要的內容一個是關于SubList,另一個是關于equals和hascode的。

三、SubList、equals和hascode

SubList并不是新建了一個list,只是持有當前集合的引用,然后控制了用戶可以操作的范圍,所以在接口定義時就說明了其更改會直接反應到原集合中。SubList是定AbstractList內部,并且是AbstractList的基礎上增加了對可選范圍的控制。

而equals和hascode的實現(xiàn),也關乎我們的使用。在AbstractList中,這兩個方法不僅與其實例有關,也和其內部包含的元素有關,所以在定義數(shù)據(jù)元素時,也應該復寫這兩個方法,以保證程序的正確運行。這里看下其源碼加深一下印象吧。

public boolean equals(Object o) {
    if (o == this)
        return true;
    if (!(o instanceof List))
        return false;

    ListIterator<E> e1 = listIterator();
    ListIterator<?> e2 = ((List<?>) o).listIterator();
    while (e1.hasNext() && e2.hasNext()) {
        E o1 = e1.next();
        Object o2 = e2.next();
        //這里用到了數(shù)據(jù)元素的equals方法
        if (!(o1==null ? o2==null : o1.equals(o2)))
            return false;
    }
    return !(e1.hasNext() || e2.hasNext());
}
public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        //這里用到了數(shù)據(jù)元素的hashCode方法
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

到此這篇關于Java源碼解析之接口List的文章就介紹到這了,更多相關Java接口List內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)文件拷貝的七種方式

    java實現(xiàn)文件拷貝的七種方式

    這篇文章主要介紹了java實現(xiàn)文件拷貝的七種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 如何查看JVM使用的默認的垃圾收集器

    如何查看JVM使用的默認的垃圾收集器

    這篇文章主要介紹了如何查看JVM使用的默認的垃圾收集器,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解Spring AOP 實現(xiàn)主從讀寫分離

    詳解Spring AOP 實現(xiàn)主從讀寫分離

    本篇文章主要介紹了Spring AOP 實現(xiàn)主從讀寫分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Spring中的依賴注入DI源碼詳細解析

    Spring中的依賴注入DI源碼詳細解析

    這篇文章主要介紹了Spring中的依賴注入DI源碼詳細解析,Spring的依賴注入(Dependency Injection,DI)是Spring框架核心的一部分,它是實現(xiàn)控制反轉(Inversion of Control,IoC)的一種方式,需要的朋友可以參考下
    2023-11-11
  • 為何Java8需要引入新的日期與時間庫

    為何Java8需要引入新的日期與時間庫

    這篇文章主要給大家介紹了關于Java8為什么需要引入新的日期與時間庫的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Spring中Bean創(chuàng)建完后打印語句的兩種方法

    Spring中Bean創(chuàng)建完后打印語句的兩種方法

    這篇文章主要介紹了Spring中Bean創(chuàng)建完后打印語句的兩種方法,一個是實現(xiàn)InitializingBean接口,另一個使用@Bean注解和initMethod屬性,通過代碼示例介紹的非常詳細,感興趣的小伙伴可以參考閱讀
    2023-07-07
  • 基于apache poi根據(jù)模板導出excel的實現(xiàn)方法

    基于apache poi根據(jù)模板導出excel的實現(xiàn)方法

    下面小編就為大家?guī)硪黄赼pache poi根據(jù)模板導出excel的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式

    Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式

    這篇文章主要介紹了Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 解決BeanUtils.copyProperties不支持復制集合的問題

    解決BeanUtils.copyProperties不支持復制集合的問題

    這篇文章主要介紹了解決BeanUtils.copyProperties不支持復制集合的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中由substring方法引發(fā)的內存泄漏詳解

    Java中由substring方法引發(fā)的內存泄漏詳解

    這篇文章主要介紹了Java中由substring方法引發(fā)的內存泄漏詳解,涉及substring方法引發(fā)的內存泄漏簡介,substring的作用和實現(xiàn)原理等相關內容,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12

最新評論