Java에서 List와 배열 상호 변환 인스턴스 분석

3009 단어 JavaList수조
본고는 자바에서 List와 수조가 서로 변환되는 방법을 실례적으로 분석하였다.여러분에게 참고할 수 있도록 나누어 드리겠습니다.구체적으로 다음과 같습니다.
오늘 코드를 쓰는 데 이상한 문제가 생겼어요. 구체적인 코드는 붙이지 않고 간소화된 버전을 쓰세요.다음과 같습니다.

ArrayList<String> list=new ArrayList<String>();
String strings[]=(String [])list.toArray();

이렇게 코드를 쓰는 것은 개인적으로 아무런 문제가 없을 것 같고, 번역도 문제없을 것 같다.그러나 구체적으로 실행할 때 이상을 보고합니다. 다음과 같습니다. Exception inthread "main"java.lang.ClassCastException: [Ljava.lang.Object;
하지만 이렇게 쓰는 것은 문제없다.

ArrayList<String> list=new ArrayList<String>();
String strings[]=new String[list.size()];
for(int i=0,j=list.size();i<j;i++){
  strings[i]=list.get(i);
}

이 현상에 대해 우리는 이렇게 설명할 수 있다. 자바에서는 위와 아래로 전환할 수 있지만 이 전환이 성공했는지의 여부는 자바 가상 기기에서 이 대상의 유형에 따라 이루어진다.Java VM에는 각 객체 유형이 저장됩니다.수조도 대상이다.그룹 유형 [Ljava.lang.Object. [Ljava.lang.Object를[Ljava.lang.String은 분명히 불가능한 일이다. 여기는 아래로 전환하는 것이기 때문에 가상 컴퓨터는 Object의 수조만 저장하고 수조의 원소가 String이라는 것을 보장할 수 없기 때문에 이 전환은 성공할 수 없다. 수조 안의 원소는 원소의 인용일 뿐 저장된 구체적인 원소가 아니기 때문에 수조 중의 원소의 유형은 자바 가상 컴퓨터에 저장된다.
위의 설명에 의하면 우리는 이 문제를 아래의 이 모델로 귀납할 수 있다.

Object objs[]=new Object[10];
String strs[]=(String[])objs;

이 모양은 방금 위의 번역 오류와 같다.만약 우리가 이 코드를 수정한다면 다음과 같다.

String strs[]=new String[10];
Object objs[]=strs;

이렇게 하면 번역하여 통과할 수 있다.그래서 이 문제는 자바 전환 규칙의 문제로 귀결될 수 있다.다음은 Java 수조의 범주에 대한 지원 문제를 이야기합니다.
JDK5에는 이미 모델링에 대한 지원이 있어 집합과 맵에서의 데이터 형식의 안전을 보장할 수 있지만, 리스트의 To Array 방법이 Object []로 되돌아오는 것은 사람을 현혹시킨다.개인적인 느낌은 모델에 따라 그에 상응하는 T[]로 되돌아갈 수 있을 것이다.JDK의 원본을 자세히 보니 List가 array로 바뀌는 방법은 두 가지가 있습니다.
public Object[] toArray();
이 방법은 목록의 모든 요소를 같은 크기의 그룹으로 되돌려줍니다. 그룹의 모든 요소는 Object 형식입니다.
public T[] toArray(T[] a);
이 방법은 리스트의 모든 요소를 같은 크기의 그룹으로 되돌려줍니다. 그룹의 모든 요소는 T 형식입니다.
List가 이렇게 설계된 것은 자바 컴파일러가 우리 new 모델 그룹을 허용하지 않기 때문이다.즉, 당신은 하나의 그룹을 이렇게 정의할 수 없다.
T arr=new T[size];
그러나 당신은 T[]로 수조를 표시할 수 있고 수조를 T[]로 강제로 전환할 수 있다.예를 들어 List의 public T[] toArray (T[]a) 는 다음과 같습니다.

public <T> T[] toArray(T[] a) {
 if (a.length < size)
   a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
   System.arraycopy(elementData, 0, a, 0, size);
 if (a.length > size)
   a[size] = null;
 return a;
}

위 코드에서 볼 수 있습니다. 이 그룹의 유형을 모르기 때문에, 반사 메커니즘을 통해 이 그룹을 만들어야 합니다. (a.getClass ().getComponentType () 메서드는 배열 요소를 가져오는 유형입니다.
마지막으로, List를 Array로 변환하면 다음과 같은 작업을 수행할 수 있습니다.

ArrayList<String> list=new ArrayList<String>();
String[] strings = new String[list.size()];
list.toArray(strings);

반대로 그룹을 List로 바꾸려면 어떻게 해야 합니까?다음과 같습니다.

String[] s = {"a","b","c"};
List list = java.util.Arrays.asList(s);

본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기