ホームページ  >  記事  >  Java  >  JavaSEにおけるCollectionの説明例

JavaSEにおけるCollectionの説明例

零下一度
零下一度オリジナル
2017-07-19 16:48:091538ブラウズ

中程 復習の過程で、これまでの学習が体系的ではなく、バックテストの問題がそのまま卒業できなくなっていると感じました。たとえば、string は固定長で、StringBuffer と StringBuilder の長さは変更できます。かわった。もう少し深く聞いて、なぜそんなに差があるのか​​と尋ねると、唖然として面接官を可愛い顔で見ることしかできません。

そこで、Collectionアーキテクチャとはどのようなものなのか、関連する継承やインターフェースの実装はどうなっているのかなど、いつどのクラスを使えばよいのかがわかるように、学習内容を記事を書くという形で体系的にまとめていきたいと思います。 、そしてクラス間の違いは、一緒に働くことによってのみ、問題を解決する方法を知ることができます。

このシリーズの記事は、Java 技術職の求職者、大学のコンピュータ専攻の学生、訓練機関で Java を学習している初心者に適しています。

1.1 コレクションアーキテクチャを理解する

私たちは皆、オブジェクトを追加するための add() メソッドやオブジェクトを削除するための Remove() メソッドなど、オブジェクトを収集するために ArrayList クラスを使用しました。どれも私たちに馴染みのあるものです。しかし、これらの手法はどこから来たのでしょうか?次の図は、このクラスの継承アーキテクチャ図です。

ArrayList はクラスとして非常に複雑です。 Collection アーキテクチャ全体を 1 つの図に表示したい場合は、次のようにします。おそらく蜘蛛の巣のように絡みつくことになるだろう。これを単純化し、重要性の低いインターフェイスや実装クラスを無視すると、次のアーキテクチャ図が得られます。

写真からわかるように、Collection は別のインターフェイス Iterable を実装するインターフェイスです。 Collection の下には、List、Set、Queue という直接実装する 3 つのインターフェイスがあります。 List の下には ArrayList と LinkedList という 2 つの実装クラスがあり、Set の一般的に使用される実装クラスは TreeSet と HashSet であり、Queue の下には Deque インターフェイスの実装があり、その下に実装クラス ArrayDeque があります。この図はこの一連の記事の核となるものであり、後で繰り返し説明します。コレクションのアーキテクチャ図とも呼ばれ、各記事でその一部を紹介します。この絵に慣れることは、理解と学習に役立つだけでなく、記憶にも役立ちます。詳細かつ包括的な継承関係と実装アーキテクチャ (どのクラスがどのインターフェイスを実装し、どのクラスが継承するか) については、API ドキュメントで問い合わせることができます。

1.2 インデックス付きリスト

List は Collection インターフェイスを実装しているため、List はコレクションであり、その機能はオブジェクトを収集することであり、その特性は収集されたデータを記録することであると言えますインデックスオブジェクトの順序の形式で。 List の共通実装クラスは、先ほどのアーキテクチャ図の ArrayList です。忘れてしまった読者は前に戻って見てください。

りー

 

以上是ArrayList类的一个简单使用例子,模拟的是学生上课签到的情景。强烈建议读者跟我一样自己试着写一个简单用例,尤其是之前很少使用ArrayList的初学者,单纯的看和读跟实际敲代码产生的效果完全不一样。也可以照着我给出的例子敲,偷懒一点的话可以直接复制在机器上跑一遍。

 

从Collection架构图中可知,LinkedList同样也实现了List接口。就算只是把上面那个实验中的ArrayList全部改为LinkedList,程序照样可以运作,而且效果看起来完全相同。那么问题来了,我们什么时候应该使用ArrayList,什么时候又应该使用LinkedList呢?

 

1.2.1 ArrayList的特性

卡车和轮船都可以运送货物,我们可以根据不同的情况选择不同的运输方式。如果时间紧、运输量小,而且两个地点都在陆地上(例如北京到南京),那么我们可以使用汽车;如果时间多、运输量大,出发地和目的之间隔着海洋(例如大连到纽约),那么用船运是更好的选择。

 

刚毕业那会要找工作,为了面试背过“ArrayList像数组,读取速度快,但是需要调整索引的话表现很差;LinkedList像链表,调整索引的表现非常好,但是随机读取的速度比较慢”。那么我们可以问深一句,为什么会这样呢?不妨从源代码中找寻答案。 

1     public boolean add(E e) {2         ensureCapacityInternal(size + 1);  // Increments modCount!!3         elementData[size++] = e;4         return true;5     }

 

上面这一段是JavaSE的源代码,我们可以看到ArrayList中的add()方法非常简单,跟我们平时使用数组一样。查看源代码中更多内容你会发现,ArrayList内部就是使用Object数组来保存所收集的对象,这就是为什么说“ArrayList就像数组”的原因。在考虑是否使用ArrayList的时候,我们可以相当于考虑是否要使用数组的特性。 

1.2.2 LinkedList的特性

在学习Collection架构的时候,我们不妨可以多看源代码,看的时候优先比较几个基本方法的实现,例如add()、remove()等。从这些方法的实现,我们就可以看到不同实现类的特性。

    public boolean add(E e) {
        linkLast(e);return true;
    }/** * Links e as last element.     */void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;if (l == null)
            first = newNode;elsel.next = newNode;
        size++;
        modCount++;
    }

看到LinkdedList.add()的源代码,我们会发现其实现方式跟链表的实现如出一辙。如果last结点为null,那么说明链表为空,所以新添加的结点为头结点。如果last结点不等于null,那么把新添加的结点设为last的下一个结点,作为新的尾结点。

根据链表的特性,我们可以很快总结两点点特性:1.想要指定索引随机存取时,链接方式都得使用从第一个元素开始查找下一个元素的方式,效率比较糟糕;2.链接的每个元素都会参考下一个元素,这有利于调整索引顺序。

1.2.3 List总结

作为Collection三大阵营之一的List,最大的特点就是索引,我们可以通过索引做到随机存取。

List中常用的实现有ArrayList和LinkedList,各自的特性可以分别参考数组和链表。在比较它们之间区别的过程中,我们看了源代码,提倡在比较同一接口不同实现类时重点查看它们共同需要实现的方法,例如Collection中规定的add(),remove()等。 

面试中常见的List实现类其实还有Vector,其特性与ArrayList相同。不同在于Vector具有线程安全的特性,性能开销比较大,具体的内容会放在以后关于多线程的文章里。

以上がJavaSEにおけるCollectionの説明例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。