Java: Array primitiver Datentypen ist keine Autobox



4 Answers

Warum sollte char[] in Character[] eingerahmt werden? Arrays sind immer Referenztypen, daher ist kein Boxen erforderlich.

Darüber hinaus wäre es schrecklich teuer - es würde ein neues Array erstellen und dann jedes Char nacheinander einpacken. Huch!

Question

Ich habe eine Methode wie folgt:

public static <T> boolean isMemberOf(T item, T[] set)
{
    for (T t : set) {
        if (t.equals(item)) {
            return true;
        }
    }
    return false;
}

Jetzt versuche ich diese Methode mit einem char für T aufzurufen:

char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, chars);

Dies funktioniert nicht. Ich würde erwarten, dass char und char[] auf Character und Character[] autoboxiert werden, aber das scheint nicht zu passieren.

Irgendwelche Einsichten?




Zuerst würde ich versuchen, Arrays so gut wie möglich zu vermeiden, stattdessen Listen zu verwenden.

Es gibt keine Autobox für Arrays, aber für Varargs gibt es ein Autoboxing. Wenn Sie also Ihre Methode als (mit demselben Körper) deklarieren:

public static <T> boolean isMemberOf(T item, T ... set)

dann kannst du schreiben

isMemberOf('a', 'a', 'b', 'c');

Persönlich bevorzuge ich Googles Guave, wo Sie Dinge wie schreiben können

char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, Chars.asList(chars).toArray(new Character[0]));

Dein Code war wahrscheinlich nur ein Beispiel, aber wenn du wirklich die Mitgliedschaft testen wolltest, kannst du es so machen:

Chars.contains(chars, ch);

or

ImmutableSet.of('a', 'b', 'c').contains('a')



Korrekt, es gibt kein Autoboxing für Arrays (was in Fällen wie int[] ints; ...; Arrays.asList(ints) - asList gibt eine Liste zurück, die ein einzelnes Objekt enthält, das Array!)

Hier ist ein einfaches Dienstprogramm, um ein Array zu boxen.

public static Integer[] boxedArray(int[] array) {
    Integer[] result = new Integer[array.length];
    for (int i = 0; i < array.length; i++)
        result[i] = array[i];
    return result;
}

Sie benötigen natürlich für jeden primitiven Typ eine andere Version.




Ein einfacherer Weg, dies zu tun ist

char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;



Arrays sind eine Implementierungsart auf niedriger Ebene. char[] ist ein zusammenhängender Speicherbereich mit Zwei-Byte-Zeichen. Character[] wird ein zusammenhängender Speicherbereich mit vier oder acht Byte langen Referenzen sein. Sie können kein Character[] , um char [] zu umbrechen. Ein List<Character> könnte jedoch ein char[] .

Arrays von Referenzen sind normalerweise keine gute Idee, es sei denn, Sie schreiben Low-Level-Code. Sie könnten, wenn Sie möchten, ein Äquivalent von java.util.Arrays.asList schreiben oder erhalten.




Related