java.util.Arrays.asList () ist kein Ersatz für neue ArrayList <> ()

Dieses Mal möchte ich die Geschichte erklären, dass "java.util.Arrays.asList ()" kein Ersatz für "neue ArrayList <> ()" ist. Plötzlich ist dies ein Beispiel.

before


List<String> fruts = new ArrayList<>();
fruts.add("apple");
fruts.add("orange");
fruts.add("strawberry");

Zu

after


List<String> fruts = Arrays.asList("apple", "orange", "strawberry");

** Es ist gefährlich für einen Prüfer, es zu reparieren, da es verkürzt wird. ** **.

Denken Sie, dass diese Schnittstelle für Sie funktioniert?


void show(List<String> fruts);

Es gibt kein Problem, wenn Sie als Sammlung arbeiten, aber es kann abhängig von der Implementierung der Schnittstelle einen Fehler verursachen.

** Wie Sie dem Instanztyp entnehmen können, ist die von java.util.Arrays.asList () erstellte Instanz nicht java.util.ArrayList, sondern java.util.Arrays $ ArrayList. ** **. Wenn etwas schief geht, geht es um diesen Unterschied. Lassen Sie uns mit der folgenden Demo-App überprüfen.

Demo-App


package com.example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo {

	public static void main(String[] args) {
		List<String> fruts1 = new ArrayList<>();
		fruts1.add("apple");
		fruts1.add("orange");
		fruts1.add("strawberry");
		show(fruts1);
		System.out.println("------------------------------------------------------------");
		List<String> fruts2 = Arrays.asList("apple", "orange", "strawberry");
		show(fruts2);
	}

	private static void show(List<String> fruts) {
		System.out.println(fruts + " is " + fruts.getClass().toString());
		if (java.util.ArrayList.class.isAssignableFrom(fruts.getClass())) {
			System.out.println("OK : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())");
		} else {
			System.out.println("NG : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())");
		}
		if (java.util.List.class.isAssignableFrom(fruts.getClass())) {
			System.out.println("OK : java.util.List.class.isAssignableFrom(fruts.getClass())");
		} else {
			System.out.println("NG : java.util.List.class.isAssignableFrom(fruts.getClass())");
		}
		if (java.util.ArrayList.class.isInstance(fruts)) {
			System.out.println("OK : java.util.ArrayList.class.isInstance(fruts)");
		} else {
			System.out.println("NG : java.util.ArrayList.class.isInstance(fruts)");
		}
		if (java.util.List.class.isInstance(fruts)) {
			System.out.println("OK : java.util.List.class.isInstance(fruts)");
		} else {
			System.out.println("NG : java.util.List.class.isInstance(fruts)");
		}
		if (fruts instanceof java.util.List) {
			System.out.println("OK : fruts instanceof java.util.List");
		} else {
			System.out.println("NG : fruts instanceof java.util.List");
		}
		if (fruts instanceof java.util.ArrayList) {
			System.out.println("OK : fruts instanceof java.util.ArrayList");
		} else {
			System.out.println("NG : fruts instanceof java.util.ArrayList");
		}
		try {
			List<String> castObj = (List<String>) fruts;
			System.out.println("OK : List<String> castObj = (List<String>) fruts;");
		} catch(Exception e) {
			e.printStackTrace();
		}
		try {
			List<String> castObj = (ArrayList<String>) fruts;
			System.out.println("OK : List<String> castObj = (ArrayList<String>) fruts");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

Betriebsergebnis


[apple, orange, strawberry] is class java.util.ArrayList
OK : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())
OK : java.util.List.class.isAssignableFrom(fruts.getClass())
OK : java.util.ArrayList.class.isInstance(fruts)
OK : java.util.List.class.isInstance(fruts)
OK : fruts instanceof java.util.List
OK : fruts instanceof java.util.ArrayList
OK : List<String> castObj = (List<String>) fruts;
OK : List<String> castObj = (ArrayList<String>) fruts
------------------------------------------------------------
[apple, orange, strawberry] is class java.util.Arrays$ArrayList
NG : java.util.ArrayList.class.isAssignableFrom(fruts.getClass())
OK : java.util.List.class.isAssignableFrom(fruts.getClass())
NG : java.util.ArrayList.class.isInstance(fruts)
OK : java.util.List.class.isInstance(fruts)
OK : fruts instanceof java.util.List
NG : fruts instanceof java.util.ArrayList
OK : List<String> castObj = (List<String>) fruts;
java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
	at com.example.Demo.show(Demo.java:59)
	at com.example.Demo.main(Demo.java:17)

Da es von der Schnittstelle ausgeblendet wird, ist es besser, die Erkennung zu ändern, dass es immer funktioniert, auch wenn Sie es durch "Arrays.asList" ersetzen.

** Obwohl es ein grundlegendes Problem bei der Implementierung gibt, ... ** Der Autor stieß auf " java.lang.ClassCastException: java.util.Arrays $ ArrayList kann nicht in java.util.ArrayList umgewandelt werden ", daher habe ich beschlossen, diesen Artikel zu schreiben. An der Benutzeroberfläche war nichts auszusetzen, sodass ich sie erst zur Laufzeit als Fehler empfand.

** Der Titel dieses Mal ist auch korrekt: "Wenn Sie" neue ArrayList <> () "durch" java.util.Arrays.asList () "ersetzen, tritt je nach Implementierung ein Fehler auf." ** **.

(Hinzugefügt am 24.11.2018)

Antworten Sie, wenn Sie die Liste wirklich in einer Zeile definieren und initialisieren möchten

(Methode 1) Arrays.asList()Auf den Konstruktor von ArrayList setzen


List<String> fruts = new ArrayList<>(Arrays.asList("apple", "orange", "strawberry"));

Wenn Sie darauf hinweisen, dass Sie "Arrays.asList ()" verwenden können, sollten Sie es zusammen mit dem Konstruktor verwenden.

(Methode 2) Rufen Sie beim Erstellen einer Instanz eine Methode auf


List<String> fruts = new ArrayList<String>() {
    {
        add("apple");
        add("orange");
        add("strawberry");
    }
};

(Methode 2) hat eine leicht eindeutige Beschreibungsmethode, die jedoch auch grammatikalisch korrekt ist.

Recommended Posts

java.util.Arrays.asList () ist kein Ersatz für neue ArrayList <> ()
Java Calendar ist kein Singleton.
[Für Programmieranfänger] Was ist eine Methode?
Ein Memo für mich, dass Objektorientierung etwas ist
Schienen neuer App-Name nicht erstellt
Der öffentliche Schlüssel für jenkins-2.249.1-1.1.noarch.rpm ist nicht installiert