Java-Collections工具类

1.Java中的内部、外部比较器

  • 一个类如果想【支持排序】,那么就必须实现接口Comparable,该接口被称为对象的内部比较器

    Comparable接口有一个方法:

  • 外部比较器Comparator,灵活为类定义多种比较器,此时类本身不需要实现Comparable接口;

    Comparator接口中有两个方法:

  • compare()方法,o1是待比较的参数,o2是与其比较的参数,即已经排序好的数组或集合的最后一个元素

  

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);
posted @   carat9588  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示