최근에, 나는 Java Arrays Tool 클래스의 Aslist 메소드를 분석하고 관련 정보를 온라인으로 정리하고 독자들을 돕기 위해 녹음하는 데 시간이 걸렸습니다!
배열 도구 클래스는이 메소드를 사용하여 가변 길이 매개 변수 또는 배열을 목록으로 변환하는 메소드 ASLIST를 제공합니다 .
소스 코드는 다음과 같습니다.
/*** 지정된 배열에서 뒷받침 된 고정 크기 목록을 반환합니다. ( * 반환 된 목록으로 변경 된 목록으로 변경됩니다.)이 방법은 {@link collection#toArray}와 함께 배열 기반과 컬렉션 기반 API 사이의 브리지로 작동합니다. 반환 된 목록은 * 직렬화 가능하며 {@link randomaccess}를 구현합니다. * * <p>이 방법은 여러 요소를 포함하도록 초기화 된 고정 크기 * 목록을 작성하는 편리한 방법을 제공합니다. * </ pre> * * @param a 목록이 뒷받침되는 배열 * @return 지정된 배열의 목록보기 */ @safevarargs public static <t> list <t> aslist (t ... a) {return new arraylist <> (a); }문제 발견
위의 방법에 대한 설명을 바탕으로 먼저 몇 가지 예를 작성해 봅시다.
/***@author wangmengjun**/public class arrayexample {public static void main (String [] args) {/** 변수 길이 매개 변수*/list <string> array1 = arrays.aslist ( "welcome", "to", "java", "world"); System.out.println (Array1); / ** 배열 사용*/ list <string> array2 = arrays.aslist (new String [] { "환영", "to", "java", "world"}); System.out.println (Array2); }}위의 프로그램을 실행하고 다음 내용을 출력하십시오.
[오신 것을 환영합니다, Java, World]
[오신 것을 환영합니다, Java, World]
변덕스럽게, 나는 갑자기 생성 된 목록에 "cool ~~~"문자열을 추가하고 하나를 가고 싶었다.
/ ** 가변 길이 매개 변수 사용*/ list <string> array1 = arrays.aslist ( "환영", "to", "java", "world"); Array1.add ( "cool ~~~");
결과적으로, 지원되지 않은 지출이 발생했습니다.
Test.arrayexample.Main (arrayexample.java:36)에서 java.util.abstractlist.add (알 수없는 소스)의 java.util.abstractlist.add (알 수없는 소스)의 스레드 "main"java.lang.unsupportedoperationexception의 예외
놀랍게도 New Arraylist <> (a)에 의해 생성 된 목록은 실제로 문제가 발생했습니다.
이유 검색
그래서 문제는 정확히 무슨 일이 일어 났습니까? 질문이 있으면 Arrays.Aslist에서 사용 된 Arraylist가 어떻게 생겼는지 확인하십시오.
Aslist Arrays에서 사용하는 Arraylist 클래스는 java.util.arraylist 클래스가 아닌 내부적으로 정의 된 클래스입니다.
소스 코드는 다음과 같습니다.
/ ** * @serial 포함 */ private static class arraylist <e> 확장 actractList <e> emplices randomAccess, java.io.serializable {private static final long serialversionuid = -2764017481108945198L; 개인 최종 E [] a; ArrayList (e [] array) {if (array == null) 새 nullpointerexception (); a = 배열; } 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) return array.copyof (this.a, size, (class <? extends t []>) a.getclass ()); System.arrayCopy (this.a, 0, a, 0, size); if (a.length> size) a [size] = null; 반환 a; } public e get (int index) {return a [index]; } public e set (int index, e element) {e OldValue = a [index]; [색인] = 요소; OldValue를 반환하십시오. } public int indexof (object o) {if (o == null) {for (int i = 0; i <a.length; i ++) if (a [i] == null) 반환 i; } else {for (int i = 0; i <a.length; i ++) if (o.equals (a [i])) 반환 i; } 반환 -1; } public boolean은 (Object O) {return indexof (o)! = -1; }}이 내부 클래스 Arraylist의 구현에서 추상 클래스 java.util.abstractlist <e>를 상속하지만 추가 및 제거 메소드는 재정의되지 않으며 특정 구현은 제공되지 않습니다.
그러나 기본적으로 java.util.abstractlist 클래스는 추가, 설정 및 제거 메소드에서 직접 지원되지 않은 정보를 제공합니다. AbstractList의 소스 코드 중 일부는 다음과 같습니다.
공개 초록 클래스 AbstractList <e>는 AbstractCollection <e>를 확장합니다. (서브 클래스 생성자에 의한 호출의 경우, 일반적으로 * 묵시적.) */ protected acpractList () {} public e set (int index, e element) {trash new unsupportedOperationException (); } /** * {@inheritDoc} * * <p>이 구현은 항상 * {@code UnsupportedOperationException}을 던집니다. * * @Throws UnSupportedOperationException {@InheritDoc} * @throws classcastException {@inheritDoc} * @throws nullpointerexception {@inheritdoc} * @throws 불법적 인 {@inheritdoc} * @Throws indexoutofboundofboundof} add (int index, e element) {새로운 UnsupportedOperationException (); } /** * {@inheritDoc} * * <p>이 구현은 항상 * {@code UnsupportedOperationException}을 던집니다. * * @Throws UnSupportedOperationException {@InheritDoc} * @Throws IndexOutOfBoundSexception {@InheritDoc} */ public e remove (int index) {새 new UnsupportedOperationException (); }}java.util.arrays 클래스의 내부 클래스 배열 목록이 추가 및 제거 메소드를 무시하지 않기 때문에 ADD 메소드를 호출 할 때 실제로 AbstractList 클래스의 추가 메소드를 호출하고 결과는 직접 UnsupportEdOperationException이 직접 발생하기 때문입니다.
마찬가지로, 제거 메소드를 호출하거나 추가 및 제거 메소드 (예 : Addall)와 관련된 다른 메소드를 호출 할 때는 지원하지 않은 정보 예외도 발생합니다.
Addall의 예 :
/***@author wangmengjun**/public class arrayexample {public static void main (String [] args) {/** 변수 길이 매개 변수*/list <string> array1 = arrays.aslist ( "welcome", "to", "java", "world"); Array1.addall (arrays.aslist ( "aaa", "bbb")); }}java.util.abstractlist.add (java.util.abstractlist.add)의 java.util.Add (Unknown Source)의 스레드 "Main"Java.lang.unsupportedOperationException의 예외는 java.util.AbstractCollection.Addall (Unkendractedoperation.add (알 수없는 출처) (Arayexample.MARAYEXALLE.MARAYEXALLE.MARAYEXALLE)
세트의 예 :
/***@author wangmengjun**/public class arrayexample {public static void main (String [] args) {/** 변수 길이 매개 변수*/list <string> array1 = arrays.aslist ( "welcome", "to", "java", "world"); System.out.println (Array1); // java를 hello array1.set (2, "hello")로 바꾸십시오. System.out.println (Array1); }}배열의 내부 클래스 배열리스트는 세트 메소드를 다시 작성하므로 위의 프로그램은 정상적으로 실행될 수 있으며 지원되지 않은 정보 예외를 던지지 않습니다.
결과는 다음과 같습니다.
[오신 것을 환영합니다, Java, World]
[오신 것을 환영합니다, 안녕하세요, 세계]
시나리오를 사용하십시오
위의 예제 및 간단한 분석에서 판단하여 배열 도구 클래스는 변수 길이 매개 변수 또는 배열을 목록으로 변환 할 수있는 메소드 ASLIST를 제공합니다.
그러나 생성 된 목록의 길이는 고정되어 있습니다. 수정 작업 (특정 위치에서 요소 수정 등)을 수행 할 수 있습니다. 길이에 영향을 미치는 작업 (예 : 추가, 제거 등)을 수행 할 수 없습니다. 지원되지 않은 외과 예외 예외가 발생합니다.
Array.Aslist는 이미 배열 데이터 또는 일부 요소가있는 시나리오에 더 적합하지만 읽기 작업에만 사용되는 목록을 신속하게 작성해야하며 추가 또는 삭제 작업을 수행하지 않습니다.
알려진 배열 데이터를 기반으로 추가, 삭제, 수정 및 확인할 수있는 목록 목록을 빠르게 얻으려면 비교적 간단한 방법은 다음과 같습니다.
java.util.arraylist를 재사용하여 레이어를 감싸십시오.
/***@author wangmengjun**/public class arrayexample {public static void main (string [] args) {/** 변수 길이 매개 변수 사용*/list <string> array1 = new arraylist <> (arrays.aslist ( "welcome", "java", "world"); System.out.println (Array1); Array1.add ( "cool ~~~"); System.out.println (Array1); }}결과는 다음과 같습니다.
[오신 것을 환영합니다, Java, World]
[오신 것을 환영합니다, Java, World, Cool ~~~]
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!