Arrays.sort用法

package test;

import java.util.Arrays;
import java.util.Comparator;

public  class ArraySortDemo {
/**
* 整数型数组排序
*/
public  void sortIntArray() {
    int[] arrayToSort =  new  int[] { 48, 5, 89, 80, 81, 23, 45, 16, 2 };
   System.out.println("整数型数组排序,排序前:");
    for ( int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]+",");
   }
    //  调用数组的静态排序方法sort
  Arrays.sort(arrayToSort);
   System.out.println();
   System.out.println("排序后:");
    for ( int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]+",");
   }
}

/**
* 字符型数组排序demo
*/
public  void sortStringArray() {
   String[] arrayToSort =  new String[] { "Oscar", "Charlie", "Ryan",
     "Adam", "David","aff","Aff" };
   System.out.println();
   System.out.println("字符型数组排序,排序前:");
    for ( int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]+",");
   }
   System.out.println();
   System.out.println("排序后:");
    //  调用数组的静态排序方法sort
   Arrays.sort(arrayToSort);

    for ( int i = 0; i < arrayToSort.length; i++){
    System.out.print(arrayToSort[i]+",");
   }
}

/**
* 对象数组排序demo
*/
public  void sortObjectArray() {
   Dog o1 =  new Dog("dog1", 1);
   Dog o2 =  new Dog("dog2", 4);
   Dog o3 =  new Dog("dog3", 5);
   Dog o4 =  new Dog("dog4", 2);
   Dog o5 =  new Dog("dog5", 3);
   Dog[] dogs =  new Dog[] { o1, o2, o3, o4, o5 };
   System.out.println();
   System.out.println("对象数组排序排序前:");
    for ( int i = 0; i < dogs.length; i++) {
    Dog dog = dogs[i];
    System.out.print(dog.getName()+"["+dog.getWeight()+"],");
   }
   Arrays.sort(dogs,  new ByWeightComparator());
   System.out.println();
   System.out.println("排序后:");
    for ( int i = 0; i < dogs.length; i++) {
    Dog dog = dogs[i];
    System.out.print(dog.getName()+"["+dog.getWeight()+"],");
   }
}

public  static  void main(String[] args) {
   ArraySortDemo t =  new ArraySortDemo();
   t.sortIntArray();
   t.sortStringArray();
   t.sortObjectArray();
}
}

/**
* 定义了一个Dog类
*/
class Dog {
private String name;
private  int weight;

public Dog(String name,  int weight) {
    this.setName(name);
    this.weight = weight;
}

public  int getWeight() {
    return weight;
}

public  void setWeight( int weight) {
    this.weight = weight;
}

public  void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}
}

/**
* 因为要对对象进行排序,所以要实现java.util.Comparator接口的compare(T o1, T o2)方法,在该方法中自定义排序算法。
*/
class ByWeightComparator  implements Comparator {
public  final  int compare(Object pFirst, Object pSecond) {
    int aFirstWeight = ((Dog) pFirst).getWeight();
    int aSecondWeight = ((Dog) pSecond).getWeight();
    int diff = aFirstWeight - aSecondWeight;
    if (diff > 0)
     return 1;
    if (diff < 0)
     return -1;
    else
     return 0;
}
}

运行结果:

整数型数组排序,排序前:
48,5,89,80,81,23,45,16,2,
排序后:
2,5,16,23,45,48,80,81,89,
字符型数组排序,排序前:
Oscar,Charlie,Ryan,Adam,David,aff,Aff,
排序后:
Adam,Aff,Charlie,David,Oscar,Ryan,aff,
对象数组排序排序前:
dog1[1],dog2[4],dog3[5],dog4[2],dog5[3],
排序后:
dog1[1],dog4[2],dog5[3],dog2[4],dog3[5],

地方

List list =  new ArrayList() ;
list.add("abcd") ;
list.add("abdc") ;
list.add("aadf") ;
list.add("aabf") ;
/* 将list转为数组 */
String[] strs =  new String[list.size()] ;
list.toArray(strs) ;
/* 排序,只排2<=索引<4之间的数据 */
Arrays.sort(strs,2,4) ;
for(String str : strs){
System.out.println(str) ;
}


转自(大漠驼铃)http://www.blogjava.net/nkjava/archive/2009/10/31/300519.html

 

### Arrays.sort 和 Collections.sort 的使用场景性能对比 #### 1. 数据结构适用性 当需要对 **数组** 进行排序时,`Arrays.sort()` 是更自然的选择。该方法支持基本数据类型的数组以及对象数组的排序[^3]。 对于 **集合** 类型(尤其是实现了 `List` 接口的对象),`Collections.sort()` 更加适合。它可以操作任何实现了 `List` 接口的集合,并提供灵活的自定义比较器功能[^4]。 #### 2. 底层实现差异 - 对于 `Arrays.sort()` 方法,在 JDK 1.7 及之后版本中,针对基本数据类型采用的是 **Dual-Pivot Quicksort (双轴快速排序)** 算法,这是一种改进版的快速排序算法,具有更好的平均时间复杂度 O(n log n)[^5]。 - 而 `Collections.sort()` 则基于 **TimSort** 算法实现。TimSort 结合了归并排序和插入排序的优点,特别适用于已部分有序的数据集,其最坏情况下的时间复杂度也是 O(n log n),但在实际应用中通常表现更好[^5]。 #### 3. 性能考量 - 当处理大量基础数据类型(如 int、double 等)时,由于不需要封装成对应的包装类实例(Integer 或 Double),因此 `Arrays.sort()` 在内存占用上会更加高效。 - 针对复杂的对象或者较大的列表而言,虽然两者的时间复杂度相同,但由于 TimSort 更擅长处理接近有序的情况,所以在某些特定条件下可能表现出略微的优势。 以下是两种方法的一个简单示例: ```java // 使用 Arrays.sort() int[] array = {9, 8, 7, 6}; Arrays.sort(array); // 默认升序排列 // 自定义 Comparator 示例 String[] stringsArray = {"banana", "apple", "orange"}; Arrays.sort(stringsArray, new Comparator<String>() { @Override public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); // 使用 Collections.sort() List<Integer> list = new ArrayList<>(Arrays.asList(9, 8, 7, 6)); Collections.sort(list); // 带有自定义 Comparator 的 List 排序 List<String> stringList = new ArrayList<>(Arrays.asList("banana", "apple", "orange")); Collections.sort(stringList, new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } }); ``` #### 4. 特殊注意事项 尽管两者的底层逻辑存在相似之处,但它们各自优化的方向不同——前者专注于原始数据类型的高速运算;后者则提供了更大的灵活性以适应多样化的业务需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值