Heim  >  Artikel  >  Java  >  Vier Methoden der Java-ArrayList-Durchquerung und die Verwendung der ArrayList-Klasse in Java

Vier Methoden der Java-ArrayList-Durchquerung und die Verwendung der ArrayList-Klasse in Java

高洛峰
高洛峰Original
2017-01-22 15:59:211604Durchsuche

Vier Methoden der Java-ArrayList-Durchquerung und die Verwendung der ArrayList-Klasse in 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));
    }
  }
}

ps: Die Verwendung der ArrayList-Klasse in Java

1. Was ist ArrayList?

ArrayList ist das legendäre dynamische Array. Es ist eine komplexe Version von Array. Es bietet die folgenden Vorteile:

Dynamisches Addieren und Subtrahieren von Elementen

implementiert die ICollection- und IList-Schnittstellen

legt flexibel die Größe des Arrays fest

2. So verwenden Sie ArrayList

Das einfachste Beispiel:

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包含的数组

Dies ist ein einfaches Beispiel. Obwohl es nicht alle Methoden von ArrayList enthält, kann es die häufigste Verwendung von ArrayList widerspiegeln

3. Wichtige Methoden und Attribute von ArrayList

1) Konstruktor

ArrayList bietet drei Konstruktoren:
public ArrayList();
Standardkonstruktor, das interne Array wird mit der Standardgröße (16) initialisiert
public ArrayList(ICollection);
Konstruiert mit einem ICollection-Objekt, und die Elemente der Sammlung werden der ArrayList
public ArrayList(int) Initialisieren Sie das interne Array mit der angegebenen Größe

2) IsSynchronized-Attribut und ArrayList.Synchronized-Methode

Das IsSynchronized-Attribut gibt an, ob die aktuelle ArrayList-Instanz Thread-Synchronisierung unterstützt, und ArrayList.Synchronized ist statisch Die Methode gibt eine Thread-synchronisierte Kapselung von ArrayList zurück.


Wenn Sie eine nicht-Thread-synchronisierte Instanz verwenden, müssen Sie die Sperre manuell aufrufen, um die Thread-Synchronisierung aufrechtzuerhalten, wenn mehrere Threads darauf zugreifen, zum Beispiel:

ArrayList list = new ArrayList();
//...
lock( list.SyncRoot ) //当ArrayList为非线程包装的时候

Das SyncRoot-Attribut ist eigentlich es selbst, aber um die SyncRoot-Definition von ICollection zu erfüllen,

SyncRoot wird hier weiterhin verwendet, um die Standardisierung des Quellcodes aufrechtzuerhalten

{
list.Add( “Add a Item” );
}

Wenn Sie die von der ArrayList.Synchronized-Methode zurückgegebene Instanz verwenden, müssen Sie das Problem der Thread-Synchronisierung nicht berücksichtigen. Diese Instanz selbst ist threadsicher Tatsächlich implementiert ArrayList einen internen Mechanismus, um die Thread-Synchronisierung sicherzustellen. ArrayList.Synchronized gibt eine Instanz dieser Klasse zurück, und jedes Attribut darin verwendet das Schlüsselwort lock, um die Thread-Synchronisierung sicherzustellen.

3) Count-Attribut und Capacity-Attribut

Das Count-Attribut ist die Anzahl der aktuell in der ArrayList enthaltenen Elemente. Dieses Attribut ist schreibgeschützt.

Das Capacity-Attribut ist die maximale Anzahl, die die ArrayList derzeit enthalten kann. Dieses Attribut kann manuell festgelegt werden, aber wenn es auf einen kleineren Wert als den Count-Wert gesetzt wird, wird eine Ausnahme ausgelöst.

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

Diese Methoden sind ähnlich

Die Add-Methode wird verwendet, um ein Element zur aktuellen Liste hinzuzufügen End

AddRange-Methode wird verwendet, um einen Stapel von Elementen am Ende der aktuellen Liste hinzuzufügen.
Remove-Methode wird verwendet, um ein Element durch Verweis auf das Element selbst zu löschen.
RemoveAt-Methode wird verwendet, um ein Element zu löschen , nach Indexwert Löschen
RemoveRange wird verwendet, um einen Stapel von Elementen durch Angabe des Startindex und der Anzahl der Löschungen zu löschen
Insert wird verwendet, um ein Element an der angegebenen Position und die Elemente am Ende hinzuzufügen Die Liste wird der Reihe nach zurück verschoben.
InsertRange wird verwendet. Fügen Sie einen Stapel von Elementen ab der angegebenen Position hinzu, und die Elemente am Ende der Liste werden der Reihe nach rückwärts verschoben.

Darüber hinaus gibt es mehrere Ähnliche Methoden:

Die Methode „Clear“ wird verwendet, um alle vorhandenen Elemente zu löschen.

Die Methode „Contains“ wird verwendet, um herauszufinden, ob sich ein Objekt in der Liste befindet.

Ich werde nicht näher darauf eingehen andere nacheinander. Sie können MSDN überprüfen, wo es detaillierter erklärt wird


5) TrimSize-Methode

Diese Methode wird verwendet, um die ArrayList auf die Größe der tatsächlichen Elemente festzulegen Wenn festgestellt wird, dass die dynamischen Array-Elemente nicht mehr hinzugefügt werden, kann diese Methode aufgerufen werden, um den freien Speicher freizugeben.

6) ToArray-Methode

Diese Methode kopiert die Elemente von ArrayList in ein neues Array.

4. ArrayList und Array-Konvertierung

Beispiel 1:

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));

Beispiel 2:

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = new Int32[List.Count];
List.CopyTo(values);

Das Obige stellt zwei Methoden zum Konvertieren von ArrayList in Array vor

Beispiel 3:

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

ist nicht dasselbe wie Da es in ein Objektarray konvertiert werden kann, gibt es keinen Fehler beim Hinzufügen verschiedener Elementtypen zur ArrayList. Beim Aufruf der ArrayList-Methode müssen Sie jedoch entweder einen Typ übergeben, der für alle Elemente korrekt konvertiert werden kann ein Objekttyp, andernfalls werden Anomalien ausgelöst, die nicht transformiert werden können.

5. Beste Vorschläge für die Verwendung von ArrayList

In diesem Abschnitt werden wir den Unterschied zwischen ArrayList und Array sowie die Effizienz von ArrayList besprechen


1) ArrayList ist Array. Die komplexe Version von


ArrayList kapselt intern ein Array vom Typ Objekt. Im Allgemeinen gibt es keinen wesentlichen Unterschied zu einem Array, auch wenn

von der Größe abhängt Wenn festgestellt wird, dass die Elemente des dynamischen Arrays nicht mehr hinzugefügt werden, kann diese Methode aufgerufen werden, um den freien Speicher freizugeben.


6) ToArray-Methode

Diese Methode kopiert die Elemente von ArrayList in ein neues Array.

4. ArrayList und Array-Konvertierung

Beispiel 1:

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));

Beispiel 2:

ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = new Int32[List.Count];
List.CopyTo(values);

Zwei Methoden zum Konvertieren von ArrayList in Array werden oben vorgestellt

Beispiel 3:

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

和数组不一样,因为可以转换为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);

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

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