>  기사  >  Java  >  Java 개선 사항(35) -----Java 컬렉션 세부 정보(1): 컬렉션의 초기 용량을 지정하십시오.

Java 개선 사항(35) -----Java 컬렉션 세부 정보(1): 컬렉션의 초기 용량을 지정하십시오.

黄舟
黄舟원래의
2017-02-11 10:28:401647검색

세트는 Java 프로그래밍에서 매우 널리 사용됩니다. 이는 바다와 같아서 모든 강을 포용하고 모든 것을 담는 범용 컨테이너와 같습니다. 또한 이 바다와 범용 컨테이너는 조건이 허용되는 경우 무한히 커질 수 있습니다. . 이 바다나 컨테이너의 부피가 매우 커지면 바다를 파고 확장하는 데 많은 인력, 재료 및 재정 자원이 필요하기 때문에 초기 용량이 매우 중요해집니다. 마찬가지로 Collection의 초기 용량도 매우 중요합니다. 따라서 알려진 시나리오의 경우 컬렉션의 초기 용량을 지정하세요.

public static void main(String[] args) {
        StudentVO student = null;
        long begin1 = System.currentTimeMillis();
        List<StudentVO> list1 = new ArrayList<>();
        for(int i = 0 ; i < 1000000; i++){
            student = new StudentVO(i,"chenssy_"+i,i);
            list1.add(student);
        }
        long end1 = System.currentTimeMillis();
        System.out.println("list1 time:" + (end1 - begin1));
        
        long begin2 = System.currentTimeMillis();
        List<StudentVO> list2 = new ArrayList<>(1000000);
        for(int i = 0 ; i < 1000000; i++){
            student = new StudentVO(i,"chenssy_"+i,i);
            list2.add(student);
        }
        long end2 = System.currentTimeMillis();
        System.out.println("list2 time:" + (end2 - begin2));
    }

 위 코드의 두 목록은 모두 다음과 같습니다. 1,000,000개의 데이터를 삽입했는데, list1은 초기화 용량을 적용하지 않은 반면, list2는 초기화 용량이 1,000,000입니다. 실행 결과는 다음과 같습니다.

list1 time:1638
list2 time:921

위에서 확인할 수 있습니다. 실행 결과 list2 출력 속도는 list1 출력 속도의 약 2배입니다. LZ는 앞서 ArrayList의 확장 메커니즘이 상대적으로 리소스를 많이 소모한다고 언급했습니다. 먼저 ArrayList의 add 메소드를 살펴보겠습니다.

public boolean add(E e) {  
        ensureCapacity(size + 1);   
        elementData[size++] = e;  
        return true;  
    }  
    
    public void ensureCapacity(int minCapacity) {  
        modCount++;         //修改计数器
        int oldCapacity = elementData.length;    
        //当前需要的长度超过了数组长度,进行扩容处理
        if (minCapacity > oldCapacity) {  
            Object oldData[] = elementData;  
            //新的容量 = 旧容量 * 1.5 + 1
            int newCapacity = (oldCapacity * 3)/2 + 1;  
                if (newCapacity < minCapacity)  
                    newCapacity = minCapacity;  
          //数组拷贝,生成新的数组 
          elementData = Arrays.copyOf(elementData, newCapacity);  
        }  
    }

요소는 ArrayList의 현재 용량이 임계점에 도달했는지 여부를 감지합니다. .임계점에 도달하면 용량이 1.5배 확장됩니다. 그러나 ArrayList를 확장하고 배열을 복사하여 새 배열을 생성하는 작업은 리소스를 많이 사용합니다. 따라서 컬렉션의 사용 시나리오를 미리 알고 컬렉션의 대략적인 범위를 알고 있다면 초기화 용량을 지정하는 것이 좋습니다. 그러면 특히 대용량 데이터 볼륨을 전제로 하는 경우 리소스 활용도가 더 좋아질 것입니다. 효율성이 향상되고 자원 활용도가 더욱 높아질 것입니다.

위 내용은 Java의 내용, 컬렉션 내용, 초기 용량 등 기타 내용을 참고하시기 바랍니다. PHP 중국어 홈페이지(www.php.cn)로!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.