Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa Iterator và Spliterator trong Java

Cả hai đều dùng để duyệt (iterate) các phần tử của Collection, nhưng Spliterator (Splitable Iterator – Java 8) được thiết kế cho song song hóa (parallelism).

Bảng so sánh

Tiêu chíIteratorSpliterator
Ra mắtJava 1.2Java 8
Mục đíchDuyệt tuần tự (sequential)Duyệt tuần tự VÀ song song (parallel)
Phương thức chínhhasNext(), next(), remove(), forEachRemaining()tryAdvance(), trySplit(), forEachRemaining(), estimateSize(), characteristics()
Chia tách (Split)Không hỗ trợtrySplit() trả về Spliterator mới覆盖 một phần elements
Duyệt bulkKhông (phải loop next())Có (forEachRemaining tối ưu)
Iterator typeExternal Iterator (client điều khiển loop)Internal Iterator (client cung cấp action, Spliterator điều khiển)
CharacteristicsKhông cóORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED – giúp Stream tối ưu
Stream integrationKhông trực tiếpNền tảng của Stream API (collection.spliterator() → Stream)

Phương thức then chốt của Spliterator

  • boolean tryAdvance(Consumer action): Thử xử lý 1 element. Trả về true nếu còn element. Tương đương hasNext + next.
  • Spliterator trySplit(): Pha chia (split) thành 2 Spliterator để xử lý song song. Trả về null nếu không chia được (quá ít element).
  • long estimateSize(): Ước lượng số element còn lại.
  • int characteristics(): Trả về bitmask đặc tính (ORDERED, SIZED...).

Ví dụ Spliterator cơ bản

import java.util.*;
import java.util.stream.*;

public class SpliteratorDemo {
    public static void main(String[] args) {
        List list = Arrays.asList(78, 10, 20, 30, 40, 50, 60, 70);
        
        Spliterator spliterator = list.spliterator();
        Spliterator split = spliterator.trySplit(); // Chia ~ nửa
        
        System.out.println("First half:");
        spliterator.forEachRemaining(System.out::println); // 40,50,60,70 (phần sau)
        
        System.out.println("Second half (split off):");
        split.forEachRemaining(System.out::println);       // 78,10,20,30 (phần trước)
        
        // Dùng với Stream (parallel tự động dùng trySplit)
        list.parallelStream()
            .filter(n -> n > 25)
            .forEach(System.out::println);
    }
}

Characteristics quan trọng

CharacteristicÝ nghĩaTác động Stream
ORDEREDPhần tử có thứ tự (List, array)Giữ thứ tự trong parallel stream (có overhead)
DISTINCTKhông trùng lặp (Set)Tối ưu distinct()
SORTEDĐã sắp xếpTối ưu sorted()
SIZEDestimateSize() chính xácChia đều workload
SUBSIZEDCác split cũng SIZEDChia đệ quy đều
NONNULLKhông có nullBỏ qua null check
IMMUTABLENguồn không đổiAn toàn parallel
CONCURRENTThread-safe (ConcurrentHashMap)Cho phép concurrent modification

Khi nào dùng Spliterator trực tiếp?

  • Viết custom Spliterator cho cấu trúc dữ liệu riêng (tree, graph, database cursor).
  • Cần kiểm soát chi tiết việc chia task cho parallel processing.
  • Tối ưu hiệu năng cho Stream pipeline phức tạp.

Trong 99% trường hợp ứng dụng, dùng collection.stream() hoặc collection.parallelStream() – Spliterator được quản lý ngầm.