Vergleich der Vor- und Nachteile von drei Methoden zum Konvertieren von Arrays in List in Java

Vorwort

Dieser Artikel beschreibt den Vergleich der Vor- und Nachteile der drei Fälle der Konvertierung eines Arrays in eine Liste in Java sowie den Vergleich von Anwendungsszenarien und die Analyse der Ursachen für Typkonvertierungsfehler, die Programmierer häufig machen.


1. Der gebräuchlichste Weg (nicht unbedingt der beste) ist
der Weg von Arrays.asList (strArray). Nachdem das Array in die Liste konvertiert wurde, kann die Liste nicht hinzugefügt oder gelöscht werden, sondern die Liste kann nur überprüft und geändert werden. Andernfalls wird eine Ausnahme ausgelöst.

Schlüsselcode: List list = Arrays.asList (strArray);

private void testArrayCastToListError() {
    
    
		String[] strArray = new String[2];
		List list = Arrays.asList(strArray);
		//对转换后的list插入一条数据
		list.add("1");
		System.out.println(list);
	}

Ergebnisse der:

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19)
	at com.darwin.junit.Calculator.main(Calculator.java:44)

Ursachenanalyse: Der Rückgabewert von Arrays.asList (strArray) ist eine private statische interne Klasse java.util.Arrays.ArrayList in der Klasse java.util.Arrays, die nicht die Klasse java.util.ArrayList ist. Die Klasse java.util.Arrays.ArrayList hat set (), get (), enthält () und andere Methoden, jedoch nicht die Methode add () oder remove (). Wenn Sie also die Methode add () aufrufen, wird eine gemeldet Error.

Verwendungsszenario: Die Methode Arrays.asList (strArray) kann nur verwendet werden, nachdem das Array in eine Liste konvertiert wurde. Die darin enthaltenen Werte müssen nicht hinzugefügt oder gelöscht werden. Sie werden nur als Datenquelle zum Lesen verwendet.


2. Nachdem das Array in eine Liste konvertiert wurde, wird die Methode zum Hinzufügen, Löschen, Ändern und Überprüfen unterstützt

Über den ArrayList-Konstruktor wird der Rückgabewert von Arrays.asList (strArray) von java.util.Arrays.ArrayList in java.util.ArrayList konvertiert.

L 代码 : ArrayList list = neue ArrayList (Arrays.asList (strArray));

private void testArrayCastToListRight() {
    
    
		String[] strArray = new String[2];
		ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ;
		list.add("1");
		System.out.println(list);
	}

Ausführungsergebnis: Ein Element "1" wurde erfolgreich hinzugefügt.

[null, null, 1]

Anwendungsszenario: Sie müssen die Liste hinzufügen, löschen, ändern und überprüfen, nachdem Sie das Array in eine Liste konvertiert haben. Sie kann verwendet werden, wenn die Datenmenge in der Liste nicht groß ist.


3. Durch die Sammlungswerkzeugklasse Collections.addAll () -Methode (die effizienteste)

Erstellen Sie mit der Methode collection.addAll (arrayList, strArray) eine Liste mit der gleichen Länge entsprechend der Länge des Arrays. Verwenden Sie dann die Methode Collections.addAll (), um die Elemente im Array in binär zu konvertieren, und fügen Sie sie hinzu Dies ist die effizienteste Methode.

Schlüsselcode:

ArrayList< String> arrayList = new ArrayList<String>(strArray.length);
Collections.addAll(arrayList, strArray);

Prüfung:

private void testArrayCastToListEfficient(){
    
    
		String[] strArray = new String[2];
		ArrayList< String> arrayList = new ArrayList<String>(strArray.length);
		Collections.addAll(arrayList, strArray);
		arrayList.add("1");
		System.out.println(arrayList);
	}

Ausführungsergebnis: Außerdem wurde erfolgreich ein Element "1" hinzugefügt.

[null, null, 1]

Verwendungsszenario: Sie müssen die Liste hinzufügen, löschen, ändern und überprüfen, nachdem Sie das Array in eine Liste konvertiert haben. Wenn die Datenmenge in der Liste sehr groß ist, verwenden Sie sie zuerst, um die Betriebsgeschwindigkeit zu verbessern.

Hinweis: Der Quellcode der Collections.addAll () -Methode ist angehängt:

public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    
    
        boolean result = false;
        for (T element : elements)
            result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给result
        return result;
    }

Viertens: Java8 kann drei grundlegende Arten von Arrays über einen Stream in List konvertieren

Wenn die JDK-Version über 1.8 liegt, können Sie mithilfe von Stream die folgenden drei Arten von Arrays schnell in List konvertieren: int [], long [], double [] und andere Datentypen wie short [], byte [ ], char [], wird derzeit in JDK1.8 nicht unterstützt. Da dies nur eine Kapselung einer gängigen Methode ist, ist eine neue Methode zur Konvertierung von Arrays in Listen nicht mehr enthalten. Derzeit handelt es sich um eine gängige Werkzeugmethode, die Java an uns überträgt.

Das Beispiel für den Konvertierungscode lautet wie folgt:

List<Integer> intList= Arrays.stream(new int[] {
    
     1, 2, 3, }).boxed().collect(Collectors.toList());
List<Long> longList= Arrays.stream(new long[] {
    
     1, 2, 3 }).boxed().collect(Collectors.toList());
List<Double> doubleList= Arrays.stream(new double[] {
    
     1, 2, 3 }).boxed().collect(Collectors.toList());

Wenn es sich um ein Array vom Typ String oder Referenztyp (Ganzzahl oder Objekt usw.) handelt, können Sie Stream auch verwenden, um Folgendes zu konvertieren:

String[] arrays = {
    
    "tom", "jack", "kate"};
List<String> stringList= Stream.of(arrays).collect(Collectors.toList());

zusätzlich

Verwenden Sie beim Deklarieren eines Arrays int [] oder Integer []. Welche Art der Deklaration kann korrekt in List konvertiert werden?

Antwort: Sie können Integer [] nur zum Konvertieren in List verwenden, dh Sie können nur den Verpackungstyp des Basisdatentyps zum direkten Konvertieren in List verwenden.

Die Gründe sind folgende:

Schauen wir uns die Definition von List im Java-Quellcode an (haben Sie keine Angst, den Quellcode nicht zu verstehen, er ist meiner Analyse nach leicht zu verstehen):

öffentliche Schnittstelle Liste erweitert Sammlung {weggelassen ...}
Sehen Sie sich die Definition von Arrays.asList () im Java-Quellcode an:

 public static <T> List<T> asList(T... a) {
    
    
        return new ArrayList<>(a);
    }

Wie aus dem obigen Quellcode ersichtlich ist, muss beim Deklarieren von List ein generischer Typ als formaler Parameter übergeben werden, und der Parametertyp von asList () ist auch ein Platzhaltertyp in generischen. Alle generischen Typen in Java müssen Referenztypen sein.

Was ist ein Referenztyp? Ganzzahl ist ein Referenztyp. Welcher Typ ist int? Int ist ein Basisdatentyp, kein Referenztyp. Aus diesem Grund gibt es in Java keine Liste, sondern nur eine Liste.

Schliessen Sie auf andere Dinge: Die anderen acht Basisdatentypen Byte, Short, Int, Long, Float, Double und Char sind keine Referenztypen, sodass keiner der acht Basisdatentypen als formale Parameter von List verwendet werden kann. String, Array, Klasse und Schnittstelle sind jedoch Referenztypen, die alle als formale Parameter von List verwendet werden können. Daher gibt es eine Sammlung von List-Schnittstellentypen, eine Sammlung von List <int []> -Array-Typen und eine Sammlung von Listenklassen. Es gibt jedoch keine grundlegenden Arten von Sammlungen wie Listen und Listen.

Lassen Sie uns mit den oben genannten Grundkenntnissen sehen, warum die zweite Zeile der folgenden zwei Codezeilen kompiliert und übergeben werden kann, die dritte Zeile jedoch einen Fehler kompiliert.

int[] intArray1 = new int[1]; 
Arrays.asList(intArray1);//编译不报错
List<Integer> list1 = Arrays.asList( intArray1);//编译报错

Antworten:

In der zweiten Codezeile ist der Eingabeparameter der Methode Arrays.asList () ein Referenztyp int [], dann muss der Rückgabewerttyp List <int []> sein und der vollständige Code lautet: List <int [ ]> intsArray = Arrays. asList (intArray1);, damit die Kompilierung erfolgreich ist, kein Problem.

In der dritten Zeile wird ein Fehler gemeldet, da die Typen auf beiden Seiten des Gleichheitszeichens links inkonsistent sind: Liste, rechts Liste <int []>, sodass beim Kompilieren ein Fehler gemeldet wird.

Ich denke du magst

Origin blog.csdn.net/qq_36551991/article/details/110007218
Empfohlen
Rangfolge