Java-Collections工具類
阿新 • • 發佈:2022-04-13
-
一個類如果想【支援排序】,那麼就必須實現介面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);