1.Java中的内部、外部比较器
一个类如果想【支持排序】,那么就必须实现接口Comparable,该接口被称为对象的内部比较器
Comparable接口有一个方法
外部比较器Comparator,灵活为类定义多种比较器,此时类本身不需要实现Comparable接口;
Comparator接口中有两个方法:
2.Arrays实现对象数组的排序
两个常用的对象数组排序方法如下
案例:
package collection;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ArraysortTest {
public static void main(String[] args) {
Prodeuct p1=new Prodeuct("苹果",20);
Prodeuct p2=new Prodeuct("香蕉",30);
Prodeuct p3=new Prodeuct("车厘子",40);
Prodeuct[] prodeucts=new Prodeuct[]{p1,p2,p3};
System.out.println("-------------------排序前遍历");
for (Prodeuct prodeuct:prodeucts){
System.out.println(prodeuct);
}
//创建外部比较器
// ProductComparator comparator=new ProductComparator();
// //Array.sort给数组进行排序
// Arrays.sort(prodeucts,comparator);
// 创建内部比较器
Arrays.sort(prodeucts);
System.out.println("-------------------排序后遍历");
for (Prodeuct prodeuct:prodeucts){
System.out.println(prodeuct);
}
}
}
package collection;
public class Prodeuct implements Comparable<Prodeuct>{
private String name;
private double price;
public Prodeuct(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 "Prodeuct{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
//内部比较器
@Override
public int compareTo(Prodeuct o) {
if (this.getPrice()>o.getPrice()){
return -1;
}else if(this.getPrice()<o.getPrice()){
return 1;
}else{
return 0;
}
}
}
3.使用集合类型的排序
Collections类也提供了sort()方法对集合内部中的元素按照元素的自然排序方式进行排序
案例:
package collection;
import java.util.*;
public class CollectionSortTest {
public static void main(String[] args) {
List<Prodeuct> list=new ArrayList<>();
Prodeuct p1=new Prodeuct("苹果",20);
Prodeuct p2=new Prodeuct("香蕉",30);
Prodeuct p3=new Prodeuct("车厘子",40);
list.add(p1);
list.add(p2);
list.add(p3);
System.out.println("---------------------排序之前顺序");
Iterator <Prodeuct> empty=list.iterator();
while (empty.hasNext()) {
Prodeuct next = empty.next();
System.out.println(next);
}
ProductComparator comparator=new ProductComparator();
//当外部比较器和内部比较器都存在,会优先使用外部
//Collections.sort(list)
Collections.sort(list,comparator);
System.out.println("---------------------排序之后顺序");
Iterator <Prodeuct> empty1=list.iterator();
while (empty1.hasNext()) {
Prodeuct next = empty1.next();
System.out.println(next);
}
}
}
package collection;
public class Prodeuct implements Comparable<Prodeuct>{
private String name;
private double price;
public Prodeuct(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 "Prodeuct{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
//内部比较器
@Override
public int compareTo(Prodeuct o) {
if (this.getPrice()>o.getPrice()){
return -1;
}else if(this.getPrice()<o.getPrice()){
return 1;
}else{
return 0;
}
}
}
package collection;
import java.util.Comparator;
public class ProductComparator implements Comparator<Prodeuct> {
@Override
public int compare(Prodeuct o1, Prodeuct o2) {
if(o1.getPrice()>o2.getPrice()){
return -1;
}else if(o1.getPrice()<o2.getPrice()){
return 1;
}else {
return 0;
}
}
}
4.线程安全的集合版本
-
集合框架中的新工具大多是非同步的,如果在并发环境中直接访问可能会导致各种问题,而Vector、Hashtable等老旧工具还继续保留的主要原因是维持向下兼容,因此我们希望能够获取新的集合工具的线程安全版本,而Collections工具类则为我们提供了这方面的支持
-
Collections获取线程安全集合的重要方法:
package collection;
import java.util.*;
public class SychronizedCollectionTest {
public static void main(String[] args) {
List<String> strList=new ArrayList<>();
strList.add("jack");
strList.add("jim");
strList.add("laowang");
//strList对象转换成线程安全的集合对象
List<String> synchronizeStrList= Collections.synchronizedList(strList);
for (String s:synchronizeStrList){
System.out.println(s);
}
}
}