# 提高整理绩效

> 原文： [https://docs.oracle.com/javase/tutorial/i18n/text/perform.html](https://docs.oracle.com/javase/tutorial/i18n/text/perform.html)

对长字符串列表进行排序通常很耗时。如果排序算法重复比较字符串，则可以使用`CollationKey`类加速该过程。

[`CollationKey`](https://docs.oracle.com/javase/8/docs/api/java/text/CollationKey.html) 对象表示给定`String`和`Collator`的排序键。比较两个`CollationKey`对象涉及排序键的按位比较，并且比将`String`对象与`Collator.compare`方法进行比较要快。但是，生成`CollationKey`对象需要时间。因此，如果仅将`String`进行一次比较，`Collator.compare`可提供更好的性能。

下面的示例使用`CollationKey`对象对单词数组进行排序。此示例的源代码位于 [`KeysDemo.java`](examples/KeysDemo.java) 中。

`KeysDemo`程序在`main`方法中创建`CollationKey`对象数组。要创建`CollationKey`，可以在`Collator`对象上调用`getCollationKey`方法。您无法比较两个`CollationKey`对象，除非它们来自相同的`Collator`。 `main`方法如下：

```
static public void main(String[] args) {
    Collator enUSCollator = Collator.getInstance(new Locale("en","US"));
    String [] words = {
        "peach",
        "apricot",
        "grape",
        "lemon"
    };

    CollationKey[] keys = new CollationKey[words.length];

    for (int k = 0; k < keys.length; k ++) {
        keys[k] = enUSCollator. getCollationKey(words[k]);
    }

    sortArray(keys);
    printArray(keys);
}

```

`sortArray`方法调用`CollationKey.compareTo`方法。如果`keys[i]`对象小于，等于或大于`keys[j]`对象，则`compareTo`方法返回小于，等于或大于零的整数。请注意，程序比较`CollationKey`对象，而不是原始单词数组中的`String`对象。这是`sortArray`方法的代码：

```
public static void sortArray(CollationKey[] keys) {
    CollationKey tmp;

    for (int i = 0; i < keys.length; i++) {
        for (int j = i + 1; j < keys.length; j++) {
            if (keys[i].compareTo(keys[j]) > 0) {
                tmp = keys[i];
                keys[i] = keys[j];
                keys[j] = tmp; 
            }
        }
    }
}

```

`KeysDemo`程序对`CollationKey`对象的数组进行排序，但最初的目标是对`String`对象的数组进行排序。要检索每个`CollationKey`的`String`表示，程序将在`displayWords`方法中调用`getSourceString`，如下所示：

```
static void displayWords(CollationKey[] keys) {
    for (int i = 0; i < keys.length; i++) {
        System.out.println(keys[i].getSourceString());
    }
}

```

`displayWords`方法打印以下行：

```
apricot
grape
lemon
peach

```