Array List 와 배열 의 상호 전환

18310 단어 필기 하 다.
Collection 인터페이스의 하위 인터페이스 List 는 두 가지 실현 류 가 있 는데 Array List 와 LinkedList 가 있 고 배열 을 데이터 구조 로 하 는 집합 은 어느 것 입 니까?답 은 당연히 Array List 입 니 다. 이 편 에서 우리 가 문 제 를 토론 하 는 것 은 바로 Array List 와 배열 의 상호 전환 문제 입 니 다.1. 배열 집합.배열 을 조작 하 는 도구 류 Arrays 에서 정적 방법 은 다음 과 같 습 니 다.
Arrays.asList(T... a);

지정 한 배열 이 지원 하 는 고정 크기 의 목록 을 되 돌려 줍 니 다.코드 테스트 를 해 보 겠 습 니 다.
String[] array = new String[3];
array[0] = "zhangsan";
array[1] = "lisi";
array[2] = "wangwu";
//        
List<String> list = Arrays.asList(array);

와, 정말 간단 해 보인다. 그리고 왜 여러 가지 '미 친' 조작 을 시작 하 는 지,
//           
System.out.println(list.get(0));
//    
list.add(3,"zhaoliu");
//    
list.remove(1);
//        
System.out.println(list);

실행 해 보 세 요. 콘 솔 출력 이 생각 한 결 과 를 기대 합 니 다...
zhangsan
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at Test.main(Test.java:64)

what??? 내 가 코드 를 반복 해서 검사 하 는데 이렇게 간단 한 코드 를 다 틀 리 게 쓰 는 거 아니 야? 틀린 거 없 잖 아.도대체 어떻게 된 일 일 까요? 화가 나 서 asList 방법의 소스 코드 를 누 르 면 다음 과 같 습 니 다.
public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
}

Array List 로 돌아 가 는 거 아니에요?하지만 자세히 보면 자바 util. Array List 류 에 도 배열 의 구조 기 라 는 매개 변수 가 없 는 것 을 발견 할 수 있 을 것 입 니 다. 그리고 제 가 이 Array List 를 다시 눌 러 보 니 상상 을 초월 하 는 일 을 발 견 했 습 니 다.
private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        @Override
        public int size() {
            return a.length;
        }

        @Override
        public Object[] toArray() {
            return a.clone();
        }

        @Override
        @SuppressWarnings("unchecked")
        public <T> T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }

        @Override
        public E get(int index) {
            return a[index];
        }

        @Override
        public E set(int index, E element) {
            E oldValue = a[index];
            a[index] = element;
            return oldValue;
        }
    }

이 종 류 는 Arrays 류 의 정적 내부 류 라 는 것 을 알 수 있 습 니 다. 그 안에 우리 가 자바 util. Array List 류 에 있 는 add (), reove () 등 을 조작 하 는 방법 이 전혀 없습니다. get (), set () 등 방법 만 있 습 니 다. 약간 밝 은 느낌 이 들 지 않 습 니까? 알 리 바 바 바 가 낸 '효율 적 인 코드' 에서 유형 에 대한 표현 을 볼 수 있 습 니 다. 이 귀 는 더 이상 이미지 가 좋 지 않 습 니 다.이 ArrayList 는 다른 ArrayList 가 아 닙 니 다. 하하 하, 하지만 아직 잘 모 르 겠 습 니 다. 이 이상 Unsupported Operation Exception 은 어디서 던 져 야 합 니까? 이 "이 귀" 류 는 AbstractList 에서 계승 되 었 습 니 다.
public void add(int index, E element) {
        throw new UnsupportedOperationException();
}
public E remove(int index) {
        throw new UnsupportedOperationException();
    }

그 렇 군요. 함부로 하면 안 되 겠 네요!!하지만 너 는 이렇게 놀 수 있다.
List<String> lists = new ArrayList<>(Arrays.asList(array));
lists.add("heisi");
System.out.println(lists);

이렇게 하면 조작 할 수 있다.와, 안 치면 몰라, 두 드 리 면 깜짝 이 야.2. 집합 해서 배열 을 이렇게 돌리 면 됩 니 다.
String[] arr = new String[lists.size()];
arr = lists.toArray(arr);
System.out.println(arr.length);

좋은 웹페이지 즐겨찾기