Maison  >  Article  >  Java  >  Exemple d'explication de Collection dans JavaSE

Exemple d'explication de Collection dans JavaSE

零下一度
零下一度original
2017-07-19 16:48:091538parcourir

J'ai l'impression que l'apprentissage préalable n'est pas systématique lors du processus de révision, et les questions du back test ne peuvent plus être aussi juste graduées, comme par exemple : la ficelle est d'une longueur fixe, la longueur de StringBuffer et StringBuilder peuvent changer. Si vous demandez un peu plus en profondeur et demandez pourquoi il y a une telle différence, vous serez abasourdi et ne pourrez regarder l'intervieweur qu'avec un air mignon sur le visage.

Par conséquent, je souhaite résumer systématiquement le contenu d'apprentissage sous la forme de la rédaction d'un article, par exemple à quoi ressemble l'architecture de la collection, quels sont l'héritage et les implémentations d'interface associés, afin que nous pouvons comprendre quand quelle classe utiliser et comment coopérer entre les classes vous aidera à savoir comment résoudre le problème. Cette série d'articles convient aux candidats à un emploi technique Java, aux étudiants en informatique dans les collèges et universités et aux débutants apprenant Java dans les établissements de formation.

1.1 Comprendre l'architecture de la collection

Nous avons tous utilisé La classe ArrayList collecte des objets. Par exemple, la méthode add() ajoute de nouveaux objets et la méthode Remove() supprime des objets. Ce sont tous des objets familiers. Mais d’où viennent ces méthodes ? La figure suivante est le schéma d'architecture d'héritage de cette classe :

La classe ArrayList est tellement compliquée si vous souhaitez afficher toute l'architecture de la collection sur une seule image, elle sera probablement aussi emmêlée qu'une toile d'araignée. En le simplifiant et en ignorant certaines interfaces et classes d'implémentation moins importantes, nous pouvons obtenir le schéma d'architecture suivant.

Comme le montre l'image, Collection est une interface qui implémente une autre interface Iterable. Il existe trois interfaces sous Collection qui l'implémentent directement, à savoir List, Set et Queue. Il existe deux classes d'implémentation sous List, à savoir ArrayList et LinkedList ; les classes d'implémentation couramment utilisées de Set sont TreeSet et HashSet ; sous Queue, il y a l'implémentation de l'interface Deque, puis il y a la classe d'implémentation ArrayDeque.

Cette image sera au cœur de cette série d'articles, et sera mentionnée à plusieurs reprises plus tard. Elle pourrait tout aussi bien s'appeler le diagramme d'architecture de la collection, et chaque article le sera. en présenter une partie. Être familier avec cette image aide non seulement à comprendre et à apprendre, mais aussi à améliorer la mémoire. En ce qui concerne la relation d'héritage détaillée et complète et l'architecture d'implémentation, quelles classes implémentent quelles interfaces et quelles classes elles héritent, vous pouvez les interroger dans la documentation de l'API.

1.2 Liste avec index

La liste est implémentée Collection interface, on peut donc dire que List est une sorte de Collection, sa fonction est de collecter des objets, et sa caractéristique est d'enregistrer l'ordre des objets collectés sous forme d'index. La classe d'implémentation courante dans List est ArrayList dans le diagramme d'architecture que nous venons de mentionner. Les lecteurs qui l'ont oublié peuvent se tourner vers l'avant et y jeter un œil.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn