우연히 객체 초기화 방법을 봤습니다:
// 新建一个列表,并赋值 "Harry","Tony","Tom" ArrayList<String> friends = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); }};
물론 Map 컬렉션에도 동일한 초기화 방법이 사용됩니다:
// 新建一个Map,并赋值 Map<String, Object> cat = new HashMap<String, Object>() {{ put("name", "Tom"); put("age", 10); }};
여기에서는 내부 클래스 구문이 먼저 객체를 새로 만든 다음 추가하는 것보다 낫습니다. 훨씬 더 편리하고 간결해졌습니다. 이 방법을 "이중 중괄호 초기화"(이중 중괄호 초기화)라고 합니다.
ArrayList의 초기화를 예로 들어 보겠습니다. 중괄호의 첫 번째 레이어는 먼저 ArrayList에서 상속된 익명의 내부 클래스를 정의합니다.
ArrayList<String> friends = new ArrayList<String>() { // 这里什么操作都没有,全部继承自父类(ArrayList) };
두 번째 레이어는 사용자 정의 객체 구성 블록입니다. 정적 초기화 블록)
new ArrayList<String>() { // 这里什么操作都没有,全部继承自父类(ArrayList) };
new를 통해 ArrayList의 하위 클래스 인스턴스화를 얻은 다음 이를 ArrayList에 대한 참조로 업캐스트합니다
ArrayList<String> friends = new ArrayList<String>() {{}};
우리가 얻은 친구는 실제로 ArrayList의 하위 클래스에 대한 참조입니다. 기능 변경
일반 표준 초기화 방법보다 훨씬 간단합니다(단, 코드 가독성이 상대적으로 떨어집니다)
이중 중괄호를 사용하여 효율성에서 컬렉션을 초기화할 수 있습니다. 관점 표준 컬렉션 초기화 단계만큼 좋지 않습니다. 그 이유는 초기화를 위해 이중 중괄호를 사용하면 내부 클래스 파일이 생성되고, 이 과정이 코드의 실행 효율성에 영향을 미치기 때문입니다.
먼저 다양한 초기화 방법으로 생성된 .class 파일을 확인하세요
예를 들어 다음 코드는
public class Test1 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list2 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list3 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list4 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list5 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; …… …snip… …… ArrayList<String> list1000 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; System.out.println(System.currentTimeMillis()); } }
Test1 컴파일 후 생성된 .class 목록은 다음과 같습니다.
Test1$1.class
Test1$2.class
Test1$3 .class
Test1 $4.class
Test1$5.class
……
…snip…
……
Test1$1000.class
Test1.class
1001개의 .class 파일 생성
public class Test2 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<>(); list1.add("Harry"); list1.add("Tony"); list1.add("Tom"); list1.add("Jerry"); ArrayList<String> list2 = new ArrayList<>(); list2.add("Harry"); list2.add("Tony"); list2.add("Tom"); list2.add("Jerry"); ArrayList<String> list3 = new ArrayList<>(); list3.add("Harry"); list3.add("Tony"); list3.add("Tom"); list3.add("Jerry"); ArrayList<String> list4 = new ArrayList<>(); list4.add("Harry"); list4.add("Tony"); list4.add("Tom"); list4.add("Jerry"); ArrayList<String> list5 = new ArrayList<>(); list5.add("Harry"); list5.add("Tony"); list5.add("Tom"); list5.add("Jerry"); …… …snip… …… ArrayList<String> list1000 = new ArrayList<>(); list1000.add("Harry"); list1000.add("Tony"); list1000.add("Tom"); list1000.add("Jerry"); System.out.println(System.currentTimeMillis()); } }
Test2 생성 이후 컴파일 .class 목록은 다음과 같습니다.
Test2.class
1개의 .class 파일만 생성됩니다.
Running time
첫 번째 코드 Test1 실행 결과:
1508379452224
1508379452784
실행 시간: 560밀리초
두 번째 코드 Test2 실행 결과:
1508379671505
1508379671507
실행 시간: 2ms
이 시간 간격은 컴퓨터 성능 및 작동 상태에 따라 달라지지만, 이중 전공을 설명할 수도 있습니다. 대괄호 초기화 방법은 기존 방법보다 오래 걸립니다
요약하자면, (테스트 초기화 데이터가 적은 경우(목록이 자동 증가 임계점에 도달하지 않은 경우)) 이중 중괄호 초기화 방법은 기존 방법보다 효율성이 떨어집니다.
1. Double 괄호 초기화 방법은 기존 방법보다 .class 파일을 더 많이 생성합니다
2. 이중 괄호 초기화 방법은 기존 방법보다 실행 시간이 더 오래 걸립니다
위 내용은 Java에서 이중 중괄호 초기화를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!