Maison Java javaDidacticiel List en Java : une brève introduction aux interfaces d'implémentation ArrayList et LinkedList

List en Java : une brève introduction aux interfaces d'implémentation ArrayList et LinkedList

Jul 26, 2018 pm 02:22 PM

ArrayList est implémenté sur la base de tableaux. Il s'agit d'un tableau dynamique dont la capacité peut augmenter automatiquement, de la même manière que l'application dynamique de mémoire et la croissance dynamique de la mémoire en langage C. LinkedList est implémenté sur la base d'une liste chaînée circulaire bidirectionnelle (qui peut être facilement visible à partir du code source). En plus d'être exploitée comme une liste chaînée, elle peut également être utilisée comme pile, file d'attente et file d'attente à double extrémité.

1. Introduction à List

2. ArrayList

Caractéristiques de ArrayList

ArrayList est implémenté sur la base d'un tableau et est un Tableau dynamique, sa capacité peut augmenter automatiquement, similaire à l'application dynamique de mémoire et à la croissance dynamique de la mémoire en langage C.

ArrayList est thread-unsafe ne peut être utilisé que dans un environnement monothread Dans un environnement multithread, vous pouvez envisager d'utiliser Collections.synchronizedList. (Liste de liste) pour renvoyer une classe ArrayList thread-safe, vous pouvez également utiliser la classe CopyOnWriteArrayList sous le package simultané.

ArrayList implémente l'interface Serialisable, il prend donc en charge la sérialisation, peut être transmis via la sérialisation

ArrayList implémente l'interface RandomAccess, prenant en charge l'accès aléatoire rapide, qui est en fait Accès rapide en inscrivant le numéro de série

implémente l'interface Cloneable, peut être cloné

Notez ses trois méthodes de construction différentes. La capacité de l'ArrayList construit par le constructeur sans paramètre est de 10 par défaut. Le constructeur avec les paramètres Collection convertit la Collection en un tableau et l'assigne au tableau d'implémentation ArrayList elementData.

Faites attention à assurerCapacity, une méthode pour augmenter la capacité. Chaque fois qu'un élément est ajouté à ArrayList (il peut s'agir de 1 ou d'un groupe), cette méthode doit être appelée pour garantir une capacité suffisante. Lorsque la capacité n'est pas suffisante pour accueillir le nombre actuel d'éléments, la nouvelle capacité est définie à 1,5 fois l'ancienne capacité plus 1. Si la nouvelle capacité définie n'est pas suffisante, la nouvelle capacité est directement définie sur le paramètre transmis (c'est-à-dire est la capacité requise), puis utilisez la méthode Arrays.copyof() pour copier les éléments dans un nouveau tableau (voir le point 3 ci-dessous pour plus de détails). On peut en voir que lorsque la capacité n'est pas suffisante, chaque fois qu'un élément est ajouté, les éléments d'origine doivent être copiés dans un nouveau tableau, ce qui prend beaucoup de temps. Par conséquent, il est recommandé d'utiliser ArrayList uniquement lorsque le. le nombre d'éléments peut être déterminé à l'avance, sinon il est recommandé d'utiliser LinkedList.

L'implémentation d'ArrayList appelle un grand nombre de méthodes Arrays.copyof() et System.arraycopy(). Il nous est nécessaire d’avoir une compréhension approfondie de la mise en œuvre de ces deux méthodes.

Regardons d’abord la méthode Arrays.copyof(). Il a de nombreuses méthodes surchargées, mais les idées d'implémentation sont les mêmes. Regardons le code source de la version générique :

public static <T> T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}
Copier après la connexion

Évidemment, une autre méthode copyof est appelée, qui a trois paramètres, le dernier paramètre spécifie. le type de données à convertir. Le code source est le suivant :

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
    return copy;
}
Copier après la connexion

On voit clairement ici que cette méthode crée en fait un tableau avec une longueur de newlength à l'intérieur. () pour copier les éléments du tableau d'origine vers le nouveau tableau.

Regardons la méthode System.arraycopy(). Cette méthode est marquée comme native et appelle le code C/C++ du système. Elle n'est pas visible dans JDK, mais son code source est visible dans openJDK. Cette fonction appelle en fait la fonction memmove() du langage C, elle peut donc garantir la copie et le déplacement corrects des éléments dans le même tableau. Elle est beaucoup plus efficace que la méthode de copie générale et est très adaptée au traitement par lots de tableaux. Java recommande fortement d'utiliser cette méthode lors de la copie d'un grand nombre d'éléments de tableau pour obtenir une plus grande efficacité.

Faites attention aux deux méthodes toArray d'ArrayList qui sont converties en tableaux statiques.

La première, la méthode Object[] toArray(). Cette méthode peut générer une exception java.lang.ClassCastException. Si vous utilisez directement la méthode de conversion descendante pour convertir l'intégralité de la collection ArrayList en un tableau Array du type spécifié, cette exception sera levée. Cependant, si vous ne la convertissez pas en un tableau Array du type spécifié. Tableau de tableau, le downcasting, mais le downcasting de chaque élément, ne lèvera pas cette exception. Évidemment, le downcasting des éléments du tableau un par un n'est pas efficace et peu pratique.

Deuxièmement, la méthode T[] toArray(T[] a). Cette méthode peut directement transformer le tableau converti depuis ArrayList vers le bas dans son ensemble (la transformation est en fait implémentée dans le code source de cette méthode), et il peut être vu à partir du code source de cette méthode que lorsque la taille du paramètre a est insuffisante , elle sera appelée en interne méthode Arrays.copyOf, cette méthode crée en interne un nouveau tableau et le renvoie, donc la forme courante de cette méthode est la suivante :

public static Integer[] vectorToArray2(ArrayList<Integer> v) {  
    Integer[] newText = (Integer[])v.toArray(new Integer[0]);  
    return newText;  
}
Copier après la connexion

ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,ArrayList中允许元素为null

三、LinkedList

LinkedList的特点

LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做队列双端队列来使用;

LinkedList同样是非线程安全的,只在单线程下适合使用;

LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输;

实现了Cloneable接口,能被克隆;

相关推荐:

接口测试基础之入门篇

视频教程:

去除ArrayList集合中的重复自定义对象元素案例

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Apr 19, 2025 pm 11:42 PM

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Apr 19, 2025 pm 04:51 PM

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Apr 19, 2025 pm 06:21 PM

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Apr 19, 2025 pm 11:45 PM

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Comment convertir en toute sécurité les objets Java en tableaux? Comment convertir en toute sécurité les objets Java en tableaux? Apr 19, 2025 pm 11:33 PM

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Quelle est la différence entre les fuites de mémoire dans les programmes Java sur les processeurs ARM et architecture x86? Quelle est la différence entre les fuites de mémoire dans les programmes Java sur les processeurs ARM et architecture x86? Apr 19, 2025 pm 11:18 PM

Analyse du phénomène de fuite de mémoire des programmes Java sur différents processeurs d'architecture. Cet article discutera d'un cas où un programme Java présente différents comportements de mémoire sur les processeurs ARM et architecture x86 ...

Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Apr 19, 2025 pm 11:36 PM

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...

Comment convertir les noms en nombres pour implémenter le tri au sein des groupes? Comment convertir les noms en nombres pour implémenter le tri au sein des groupes? Apr 19, 2025 pm 01:57 PM

Comment convertir les noms en nombres pour implémenter le tri au sein des groupes? Lors du tri des utilisateurs en groupes, il est souvent nécessaire de convertir le nom de l'utilisateur en numéros afin qu'il puisse être différent ...

See all articles