1. 程式人生 > 其它 >Java-Collections工具類

Java-Collections工具類

1.Java中的內部、外部比較器

  • 一個類如果想【支援排序】,那麼就必須實現介面Comparable,該介面被稱為物件的內部比較器

    Comparable介面有一個方法:

  • 外部比較器Comparator,靈活為類定義多種比較器,此時類本身不需要實現Comparable介面;

    Comparator介面中有兩個方法:

2.Arrays實現物件陣列的排序

  • 兩個常用的物件陣列排序方法如下

static void sort(Object[] a) 方法描述
static void sort(Object[] a) 對陣列a進行排序,a中的元素必須實現Comparable介面
static void sort(T[] a,Comparator<? super T> c) 對陣列a進行排序,比較邏輯在外部比較器c中定義
  • 案例
    public class Product {
        private String name;
        private double price;
        public Product(String name, double price) {
            this.name = name;
            this.price = price;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        @Override
        public String toString() {
            return "Product{" +
                    "name='" + name + '\'' +
                    ", price=" + price +
                    '}';
        }
    }
    public class ProductComparator implements Comparator<Product> {
        @Override
        public int compare(Product o1, Product o2) {
            if (o1.getPrice() > o2.getPrice()) {
                return 1;
            } else if (o1.getPrice() < o2.getPrice()) {
                return -1;
            } else {
                return 0;
            }
        }
    }
    public class TestArrays {
        public static void main(String[] args) {
            Product p1 = new Product("巧克力", 30);
            Product p2 = new Product("蘋果", 20);
            Product p3 = new Product("車釐子", 40);
            //例項化陣列並初始化
            Product[] products = new Product[]{p1, p2, p3};
            System.out.println("================排序前遍歷=========================");
            for (Product product : products) {
                System.out.println(product);
            }
            //例項化一個外部比較比較器
            ProductComparator comparator = new ProductComparator();
            //Arrays.sort對陣列進行排序,排序規則使用 comparator
            Arrays.sort(products, comparator);
            //因為product沒有實現Comparable介面,所以會出拋異常
            //Arrays.sort(products);
            System.out.println("================排序後遍歷=========================");
            for (Product product : products) {
                System.out.println(product);
            }
        }
    }

3.使用集合型別的排序

  • Collections類也提供了sort()方法對集合內部中的元素按照元素的自然排序方式進行排序

  • 案例

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class CollectionSortTest {
        public static void main(String[] args) {
            List<Product> list = new ArrayList<>();
            Product p1 = new Product("蘋果", 20);
            Product p2 = new Product("香蕉", 30);
            Product p3 = new Product("櫻桃", 40);
            list.add(p1);
            list.add(p2);
            list.add(p3);
            System.out.println("==集合排序之前(List的順序是新增順序)遍歷==");
            for (Product product : list) {
                System.out.println(product);
            }
            //Collections.sort(list); //一定會使用內部比較器
            ProductComparator comparator = new ProductComparator();
            //當外部比較器和內部比較器都存在的情況下,使用外部比較器
            Collections.sort(list, comparator);
            System.out.println("==集合排序之後遍歷==");
            for (Product product : list) {
                System.out.println(product);
            }
        }
    }
    

4.執行緒安全的集合版本

  • 集合框架中的新工具大多是非同步的,如果在併發環境中直接訪問可能會導致各種問題,而Vector、Hashtable等老舊工具還繼續保留的主要原因是維持向下相容,因此我們希望能夠獲取新的集合工具的執行緒安全版本,而Collections工具類則為我們提供了這方面的支援

  • Collections獲取執行緒安全集合的重要方法:

  • 案例

    List<Product> products = new ArrayList<>();
    products.add(p1);
    products.add(p2);
    products.add(p3);
    products.add(p4);
    //ArrayList不是執行緒安全的,通過Collections把ArrayList執行緒安全的
    //synchronizedList是執行緒安全的
    List<Product> synchronizedProducts = Collections.synchronizedList(products);