Heim >Java >javaLernprogramm >Beispielerklärung der Sammlung in JavaSE

Beispielerklärung der Sammlung in JavaSE

零下一度
零下一度Original
2017-07-19 16:48:091575Durchsuche

Ich habe das Gefühl, dass das vorherige Lernen während des Überprüfungsprozesses nicht systematisch erfolgt und die Backtest-Fragen nicht mehr so ​​einfach abgestuft sein können, wie zum Beispiel: Die Zeichenfolge hat eine feste Länge, die Länge von StringBuffer und StringBuilder können sich ändern. Wenn Sie etwas tiefer fragen und fragen, warum es so einen Unterschied gibt, werden Sie sprachlos sein und den Interviewer nur mit einem süßen Gesicht ansehen.

Daher möchte ich den Lerninhalt systematisch in Form eines Artikels zusammenfassen, z. B. wie die Sammlungsarchitektur aussieht, welche zugehörigen Vererbungs- und Schnittstellenimplementierungen es gibt Wir können verstehen, wann wir sollten. Welche Klasse wir verwenden und wie wir zwischen den Klassen zusammenarbeiten, hilft Ihnen dabei, das Problem zu lösen. Diese Artikelserie eignet sich für Stellenbewerber im Java-Technikbereich, Informatikstudenten an Hochschulen und Universitäten sowie Anfänger, die Java in Ausbildungseinrichtungen lernen.

1.1 Die Architektur der Sammlung verstehen

Wir haben alle Verwendet wird die ArrayList-Klasse. Beispielsweise fügt die Methode add() neue Objekte hinzu und entfernt Objekte. Diese sind alle bekannt. Doch woher kamen diese Methoden? Die folgende Abbildung ist das Vererbungsarchitekturdiagramm dieser Klasse:

Die ArrayList-Klasse ist so kompliziert. Wenn Sie die gesamte Collection-Architektur auf einem Bild zeigen möchten, wird sie wahrscheinlich so verworren sein wie ein Spinnennetz. Wenn wir es vereinfachen und einige weniger wichtige Schnittstellen und Implementierungsklassen ignorieren, können wir das folgende Architekturdiagramm erhalten.

Wie aus dem Bild ersichtlich ist, ist Collection eine Schnittstelle, die eine andere Schnittstelle Iterable implementiert. Unter Collection gibt es drei Schnittstellen, die es direkt implementieren, nämlich List, Set und Queue. Unter List gibt es zwei Implementierungsklassen, nämlich ArrayList und LinkedList. Die häufig verwendeten Implementierungsklassen von Set sind TreeSet und HashSet. Unter Queue gibt es die Implementierungsklasse ArrayDeque.

Dieses Bild wird den Kern dieser Artikelserie bilden und später wiederholt erwähnt werden. Es könnte genauso gut als Sammlungsarchitekturdiagramm bezeichnet werden, und jeder Artikel wird vorgestellt ein Teil davon. Die Kenntnis dieses Bildes hilft nicht nur beim Verstehen und Lernen, sondern auch beim Gedächtnis. Die detaillierte und umfassende Vererbungsbeziehung und Implementierungsarchitektur, welche Klassen welche Schnittstellen implementieren und welche Klassen sie erben, können Sie in der API-Dokumentation abfragen.

1.2 Liste mit Index

Liste ist implementierte Sammlung Schnittstelle, daher können wir sagen, dass die Liste eine Art Sammlung ist, ihre Funktion darin besteht, Objekte zu sammeln, und ihre Eigenschaft darin besteht, die Reihenfolge der gesammelten Objekte in Form eines Index aufzuzeichnen. Die übliche Implementierungsklasse in List ist ArrayList im gerade erwähnten Architekturdiagramm. Leser, die es vergessen haben, können nach vorne schauen.

 1 /** 2  * ArrayList的实验用例 3  */ 4  5 import java.util.*; 6  7 public class Student { 8     public static void main(String[] args) { 9         List list = new ArrayList(); //使用JavaSE的List和ArrayList10         Scanner scanner = new Scanner(System.in);11         String name;12         while(true) {13             System.out.print("学生签到:");14             name = scanner.nextLine();15             if(name.equals("quit")) {16                 break;17             }18             list.add(name); //实用Add()方法收集对象19         }20         System.out.println("今天上来上课的学生名单:");21         foreach(list);22     }23 24     private static void foreach(List list) {25         for(int i = 0; i < list.size(); i++) {26             String student = (String) list.get(i); //使用get()方法依据索引取得收集的对象27             System.out.println(student);28         }29     }30 }

以上是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具有线程安全的特性,性能开销比较大,具体的内容会放在以后关于多线程的文章里。

Das obige ist der detaillierte Inhalt vonBeispielerklärung der Sammlung in JavaSE. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn