Recentemente, dediquei um tempo para analisar o método ASLIST da aula de ferramentas de Java Arrays, resolver informações relevantes on -line e a gravei, na esperança de ajudar os leitores!
A classe de ferramentas de matrizes fornece um método aslist, que usa esse método para converter um parâmetro ou matriz de comprimento variável em uma lista.
O código -fonte é o seguinte:
/*** Retorna uma lista de tamanho fixo apoiado pela matriz especificada. (Altera para * a lista retornada "gravar através" da matriz.) Este método age * como ponte entre as APIs baseadas em matrizes e a coleção, em * combinação com {@link collection#ToArray}. A lista retornada é * serializável e implementa {@link RandomAccess}. * * <p> Este método também fornece uma maneira conveniente de criar uma lista de tamanho fixo * inicializado para conter vários elementos: * <pre> * lista <String> stands = Arrays.aslist ("Larry", "Moe", "Curly"); * </pre> * * @param a a matriz pela qual a lista será apoiada * @return Uma lista de visualização da matriz especificada */ @safevarargs public static <t> list <t> aslist (t ... a) {retorna new ArrayList <> (a); }Descoberta de problemas
Com base na descrição do método acima, vamos primeiro escrever alguns exemplos:
/***@author wangmengjun**/public class ArrayExample {public static void main (string [] args) {/** Use parâmetros de comprimento variável*/list <string> Array1 = Arrays.asList ("Welcome System.out.println (Array1); / ** Use Array*/ List <String> Array2 = Arrays.asList (new String [] {"Welcome", "To", "Java", "World"}); System.out.println (Array2); }}Execute o programa acima e produza o seguinte conteúdo.
[Bem -vindo, para, java, mundo]
[Bem -vindo, para, java, mundo]
Por um capricho, de repente eu queria adicionar uma string "Cool ~~~" à lista criada e ir uma.
/ ** Use parâmetros de comprimento variável*/ list <string> Array1 = Arrays.asList ("Welcome", "To", "Java", "World"); Array1.add ("Cool ~~~");Como resultado, foi encontrada uma exceção não suportada da BetterException:
Exceção no thread "main" java.lang.unsupportEdOperationException em java.util.abstractList.add (fonte desconhecida) em java.util.abstractList.add (fonte desconhecida) em test.arrayexample.main (arrayexample.java:36)
Incrivelmente, a lista gerada pelo novo ArrayList <> (a) realmente encontrou um problema.
Pesquisa de razão
Então a questão é: o que exatamente aconteceu? Com perguntas, verifique como é a lista de Arraylist em Arrays.asList?
Acontece que a classe Arraylist usada pelo método ASList de matriz é uma classe definida internamente, não a classe java.util.arraylist.
O código -fonte é o seguinte:
/ ** * @Serial Incluir */ classe estática privada Arraylist <E> estende o abstrataList <e> implementa RandomAccess, java.io.Serializable {private estático final serialversionuid = -2764017481108945198l; private final e [] a; ArrayList (E [] Array) {if (Array == NULL) lança novo NullPointerException (); a = matriz; } public int size () {return A.Length; } public Object [] ToArray () {return A.Clone (); } public <T> t [] toArray (t [] a) {int size = size (); if (a.Length <size) Retornar Arrays.copyof (this.a, tamanho, (classe <? estende t []>) a.getclass ()); System.arraycopy (this.a, 0, a, 0, tamanho); if (a.Length> tamanho) a [size] = null; retornar a; } public e get (int index) {return a [index]; } public e set (int index, e elemento) {e OldValue = a [index]; a [índice] = elemento; retornar OldValue; } public int indexOf (objeto o) {if (o == null) {for (int i = 0; i <a.length; i ++) if (a [i] == null) return i; } else {for (int i = 0; i <A.Length; i ++) se (O.Equals (a [i])) retornar i; } retornar -1; } public boolean contém (objeto o) {return indexOf (o)! = -1; }}A partir da implementação deste ArrayList de classe interna, pode -se observar que herda a classe abstrata java.util.abstractList <E>, mas os métodos de adição e remoção não são substituídos e a implementação específica não é fornecida.
No entanto, por padrão, a classe java.util.abstractList lançará diretamente uma UnsupportEdOperationException nos métodos Adicionar e Remover. Alguns dos códigos de origem do AbstractList são os seguintes:
classe abstrata public abstractList <e> estende a lista de implementos abstrataCollection <E> <E> { /*** construtor único. (Para invocação por construtores de subclasse, tipicamente * implícito.) */ AbstractList protegido () {} public e set (int index, e elemento e elemento) {lança novo UnsupportDoperException (); } /** * {@Iritdoc} * * <p> Esta implementação sempre lança um * {@code unsupportedOperationException}. * * @THOWS UnsupportEDoPerationException {@IritDoc} * @Throws ClassCastException {@IritDoc} * @Throws nullPointerException {@IritDoc} * @THOWROWSCECRIMEXCIMEXCIMEXCIMEXCIMECTIMCCECTIONSCECCIMECTIMEXCEMCENTEXCIMECTIMEXCEMCENTEXCIMCECCENTEXCIMECTIONSCEMPCECCONTEXCIMECTIMEXCEMCENTEXCIMEX (@IritDoc} @} * elemento) {lança new UnsupportEDoperationException (); } /** * {@Iritdoc} * * <p> Esta implementação sempre lança um * {@code unsupportedOperationException}. * * @THOWS UnsupportEDoPerationException {@IritDoc} * @Throws IndexOutOfBoundSexception {@IritdDoc} */ public e Remover (int index) {lança novo UnsupportEDoperationException (); }}É precisamente porque a classe de classe interna da classe Java.util.Arrays não substitui os métodos Adicionar e Remover; portanto, quando chamamos seu método de adição, chamamos o método ADD da classe abstractList, e o resultado é que a não suportadaPoperException é lançada diretamente.
Da mesma forma, ao chamar o método Remover, ou chamar outros métodos associados aos métodos Adicionar e Remover (como Addall), você também encontrará a exceção não suportada de exceção da UMAPORTEDOPERATION.
Exemplo de Addall:
/***@author wangmengjun**/public class ArrayExample {public static void main (string [] args) {/** Use parâmetros de comprimento variável*/list <string> Array1 = Arrays.asList ("Welcome Array1.addall (Arrays.asList ("AAA", "BBB")); }}Exceção no thread "main" java.lang.unsupportEdOperationException em java.util.abstractList.add (fonte desconhecida) em java.util.abstractList.add (fonte desconhecida) em java.util.abstractcollection.addall (fonte desconhecida) em test.arrayxemple.
Exemplo de conjunto:
/***@author wangmengjun**/public class ArrayExample {public static void main (string [] args) {/** Use parâmetros de comprimento variável*/list <string> Array1 = Arrays.asList ("Welcome System.out.println (Array1); // Substitua Java por Hello Array1.set (2, "Hello"); System.out.println (Array1); }}É precisamente porque o ArrayList de classe interna da Arrays reescreve o método de conjunto, para que o programa acima possa ser executado normalmente e não lançará a exceção de UnsupportEdOperationException.
Os resultados são os seguintes:
[Bem -vindo, para, java, mundo]
[Bem -vindo, para, olá, mundo]
Use cenários
A julgar pelos exemplos acima e análises simples, a classe de ferramentas de matrizes fornece um método ASLIST, que pode converter um parâmetro ou matriz de comprimento variável em uma lista.
No entanto, a duração da lista gerada é fixa; Ele pode executar operações de modificação (como modificar elementos em uma determinada posição); Ele não pode executar operações que afetem o comprimento (como Adicionar, Remover, etc.). Uma exceção não suportada de exceção será lançada.
Arrays.asList é mais adequado para cenários em que já existem dados de matriz ou alguns elementos, mas é necessário criar rapidamente uma lista, que é usada apenas para operações de leitura e não executa operações de adição ou exclusão.
Se você deseja obter rapidamente uma lista de listas que podem ser adicionadas, excluídas, modificadas e verificadas com base nos dados conhecidos da matriz, um método relativamente simples é o seguinte:
Reutilize java.util.arraylist para embrulhar uma camada.
/***@author wangmengjun**/public class ArrayExample {public static void main (string [] args) {/** use parâmetros de comprimento variável*/list <string> Array1 = new ArrayList <> (Arrays.aslist ("Welcome", "To", "Java", "World"); System.out.println (Array1); Array1.add ("Cool ~~~"); System.out.println (Array1); }}Os resultados são os seguintes:
[Bem -vindo, para, java, mundo]
[Bem -vindo, para, java, mundo, legal ~~~]
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!