Java에서 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 형식입니다.
List가 이렇게 설계된 것은 자바 컴파일러가 우리 new 모델 그룹을 허용하지 않기 때문이다.즉, 당신은 하나의 그룹을 이렇게 정의할 수 없다.
T arr=new T[size];
그러나 당신은 T[]로 수조를 표시할 수 있고 수조를 T[]로 강제로 전환할 수 있다.예를 들어 List의 public
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);
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.