Maison > Java > javaDidacticiel > Quatre méthodes de parcours Java arrayList et utilisation de la classe ArrayList en Java

Quatre méthodes de parcours Java arrayList et utilisation de la classe ArrayList en Java

高洛峰
Libérer: 2017-01-22 15:59:21
original
1668 Les gens l'ont consulté

Quatre méthodes de parcours Java arrayList et utilisation de la classe ArrayList en Java

package com.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListDemo {
  public static void main(String args[]){
    List<String> list = new ArrayList<String>();
    list.add("luojiahui");
    list.add("luojiafeng");
    //方法1
    Iterator it1 = list.iterator();
    while(it1.hasNext()){
      System.out.println(it1.next());
    }
    //方法2
    for(Iterator it2 = list.iterator();it2.hasNext();){
       System.out.println(it2.next());
    }
    //方法3
    for(String tmp:list){
      System.out.println(tmp);
    }
    //方法4
    for(int i = 0;i < list.size(); i ++){
      System.out.println(list.get(i));
    }
  }
}
Copier après la connexion

ps : L'utilisation de la classe ArrayList en Java

1. Qu'est-ce qu'ArrayList

ArrayList est le tableau dynamique légendaire En termes MSDN, il s'agit d'une version complexe d'Array qui offre les avantages suivants :

. Ajout et soustraction dynamique d'éléments

implémente les interfaces ICollection et IList

définit de manière flexible la taille du tableau

2. Comment utiliser ArrayList

L'exemple le plus simple :

ArrayList List = new ArrayList();
for( int i=0;i <10;i++ ) //给数组增加10个Int元素
List.Add(i);
//..程序做一些处理
List.RemoveAt(5);//将第6个元素移除
for( int i=0;i <3;i++ ) //再增加3个元素
List.Add(i+20);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));//返回ArrayList包含的数组
Copier après la connexion

Ceci est un exemple simple bien qu'il n'inclut pas toutes les méthodes d'ArrayList, il peut refléter l'utilisation la plus courante d'ArrayList<. 🎜>

3. Méthodes et attributs importants d'ArrayList

1) Constructeur

ArrayList fournit trois constructeurs :

public ArrayList();
Constructeur par défaut, le tableau interne; sera initialisé avec la taille par défaut (16)
public ArrayList(ICollection);
Construit avec un objet ICollection, et les éléments de la collection seront ajoutés à ArrayList
public ArrayList(int) ; 🎜>Initialisez le tableau interne avec la taille spécifiée

2) Attribut IsSynchronized et méthode ArrayList.Synchronized

L'attribut IsSynchronized indique si l'instance ArrayList actuelle prend en charge la synchronisation des threads, et ArrayList.Synchronized Le statique La méthode renverra une encapsulation synchronisée par thread d’ArrayList.


Si vous utilisez une instance non synchronisée par thread, vous devez appeler manuellement lock pour maintenir la synchronisation des threads lorsque plusieurs threads y accèdent, par exemple :

ArrayList list = new ArrayList();
//...
lock( list.SyncRoot ) //当ArrayList为非线程包装的时候
Copier après la connexion

L'attribut SyncRoot est en fait lui-même, mais afin de répondre à la définition SyncRoot d'ICollection,

SyncRoot est toujours utilisé ici pour maintenir la standardisation du code source

{
list.Add( “Add a Item” );
}
Copier après la connexion

Si vous utilisez l'instance renvoyée par la méthode ArrayList.Synchronized, il n'est pas nécessaire de considérer le problème de la synchronisation des threads. Cette instance elle-même est thread-safe. . En fait, ArrayList implémente un mécanisme interne pour assurer la synchronisation des threads. Classe, ArrayList.Synchronized renvoie une instance de cette classe, et chaque attribut qu'elle contient utilise le mot-clé lock pour assurer la synchronisation des threads.

3) Attribut Count et attribut Capacité

L'attribut Count est le nombre d'éléments actuellement contenus dans ArrayList. Cet attribut est en lecture seule.

L'attribut Capacité est le nombre maximum que ArrayList peut actuellement contenir. Cet attribut peut être défini manuellement, mais lorsqu'il est défini sur une valeur inférieure à la valeur Count, une exception sera levée.


4) Add, AddRange, Remove, RemoveAt, RemoveRange, Insert, InsertRange

Ces méthodes sont similaires

La méthode Add est utilisée pour ajouter un élément à la liste actuelle . End

La méthode AddRange est utilisée pour ajouter un lot d'éléments à la fin de la liste actuelle

La méthode Remove est utilisée pour supprimer un élément, par référence à l'élément lui-même
La méthode RemoveAt est utilisée pour supprimer un élément, par valeur d'index Supprimer
RemoveRange est utilisé pour supprimer un lot d'éléments en spécifiant l'index de départ et le nombre de suppressions
Insérer est utilisé pour ajouter un élément à la position spécifiée, et les éléments à la fin. de la liste sont reculés dans l'ordre.
InsertRange est utilisé Ajoutez un lot d'éléments à partir de la position spécifiée, et les éléments à la fin de la liste reculent dans l'ordre

De plus, il y a plusieurs méthodes similaires :

La méthode Clear est utilisée pour effacer tous les éléments existants

La méthode Contains est utilisée pour savoir si un objet est dans la liste


Je n'entrerai pas dans les détails sur les autres un par un. Vous pouvez consulter MSDN, qui l'explique plus en détail


5) Méthode TrimSize

Cette méthode est utilisée pour fixer l'ArrayList à la taille réelle. Lorsqu'il est déterminé que les éléments du tableau dynamique ne sont plus ajoutés, cette méthode peut être appelée pour libérer la mémoire libre.

6) Méthode ToArray

Cette méthode copie les éléments d'ArrayList dans un nouveau tableau.

4. ArrayList et conversion de tableau

Exemple 1 :

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));
Copier après la connexion
Copier après la connexion

Exemple 2 :

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = new Int32[List.Count];
List.CopyTo(values);
Copier après la connexion
Copier après la connexion

Ce qui précède présente deux méthodes de conversion d'ArrayList en tableau

Exemple 3 :

ArrayList List = new ArrayList();
List.Add( “string” );
List.Add( 1 );
//往数组中添加不同类型的元素
object[] values = List.ToArray(typeof(object)); //正确
string[] values = (string[])List.ToArray(typeof(string)); //错误
Copier après la connexion
Copier après la connexion

n'est pas la même chose que un tableau, car il peut être converti en tableau Object, il n'y a rien de mal à ajouter des éléments de différents types à ArrayList. Cependant, lors de l'appel de la méthode ArrayList, vous devez soit transmettre un type qui peut être converti correctement pour tous les éléments, soit. un type Objet, sinon il générera des Anomalies qui ne pourront pas être transformées.

5. Meilleures suggestions pour l'utilisation d'ArrayList

Dans cette section, nous discuterons de la différence entre ArrayList et array, ainsi que de l'efficacité d'ArrayList


1) ArrayList est Array La version complexe de


ArrayList encapsule en interne un tableau de type Object Dans un sens général, elle n'a aucune différence essentielle avec un tableau, même

selon la taille. des éléments réels, lorsqu'il est déterminé que les éléments du tableau dynamique ne sont plus ajoutés, cette méthode peut être appelée pour libérer la mémoire libre.


6) Méthode ToArray

Cette méthode copie les éléments d'ArrayList dans un nouveau tableau.

4. ArrayList et conversion de tableau

Exemple 1 :

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));
Copier après la connexion
Copier après la connexion

Exemple 2 :

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = new Int32[List.Count];
List.CopyTo(values);
Copier après la connexion
Copier après la connexion

Deux méthodes de conversion d'ArrayList en tableau sont présentées ci-dessus

Exemple 3 :

ArrayList List = new ArrayList();
List.Add( “string” );
List.Add( 1 );
//往数组中添加不同类型的元素
object[] values = List.ToArray(typeof(object)); //正确
string[] values = (string[])List.ToArray(typeof(string)); //错误
Copier après la connexion
Copier après la connexion

和数组不一样,因为可以转换为Object数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。

5、ArrayList最佳使用建议

这一节我们来讨论ArrayList与数组的差别,以及ArrayList的效率问题

1)ArrayList是Array的复杂版本

ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

2)内部的Object类型的影响

对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。
但是恰恰对于大多数人,多数的应用都是使用值类型的数组。
消除这个影响是没有办法的,除非你不用它,否则就要承担一部分的效率损失,不过这部分的损失不会很大。

3)数组扩容

这是对ArrayList效率影响比较大的一个因素。
每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

例1:比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:

16*2*2*2*2 = 256

四次的扩容才会满足最终的要求,那么如果一开始就以:

ArrayList List = new ArrayList( 210 );
的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。

例2:预计有30个元素而创建了一个ArrayList:

ArrayList List = new ArrayList(30);

在执行过程中,加入了31个元素,那么数组会扩充到60个元素的大小,而这时候不会有新的元素再增加进来,而且有没有调用TrimSize方法,那么就有1次扩容的操作,并且浪费了29个元素大小的空间。如果这时候,用:

ArrayList List = new ArrayList(40);

那么一切都解决了。
所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。

4)频繁的调用IndexOf、Contains等方法(Sort、BinarySearch等方

法经过优化,不在此列)引起的效率损失
首先,我们要明确一点,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用Hashtable或SortedList等键值对的集合。

ArrayList al=new ArrayList();
al.Add("How");
al.Add("are");
al.Add("you!");
al.Add(100);
al.Add(200);
al.Add(300);
al.Add(1.2);
al.Add(22.8);
Copier après la connexion

更多java arrayList遍历的四种方法及Java中ArrayList类的用法相关文章请关注PHP中文网!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal