Java-Collections工具类
-
一个类如果想【支持排序】,那么就必须实现接口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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话