树集内部处理字符串

时间:2018-09-08 19:18:51

标签: java treeset

我有以下代码,但由于TreeSet如何产生以下输出,所以我无法理解输出。 TreeSet如何在内部存储对象?

import java.util.*;

class TreeSetDemo{

    public static void main(String args[]){

        TreeSet<String> treeset = new TreeSet<String>(); 

        treeset.add("Geeks");
        treeset.add("for");
        treeset.add("GeeksforGeeks");
        treeset.add("a");
        treeset.add("d");
        treeset.add("c");
        treeset.add("b");

        for(String temp:treeset)
            System.out.printf(temp+ " ");
        System.out.println("\n");
    }
}

输出:

Geeks GeeksforGeeks a b c d for

1 个答案:

答案 0 :(得分:1)

  

我无法理解输出,因为树集如何产生以下输出。可以解释一下TreeSet如何在内部存储对象。

根据its docsTreeSet将其元素存储在TreeMap中(作为键)。就TreeMap stores its elements in a red-black tree而言,这是两个类的名称的基础。如果您不知道,则红黑树是二进制搜索树的一种形式。

对于输出,有两点要理解:

  1. TreeSet排序的集。如果用Comparator初始化一个,则定义排序顺序。否则,就像您的情况一样,它使用元素的自然顺序。该集合的迭代器按排序顺序返回元素。

  2. Class String's natural order是字典式的,基于每个char的{​​{1}}元素的数值。

您没有解释所获得的输出与期望的输出有何不同,但是我想它必须与字符串的顺序有关。也许您希望将它们以添加到集合中的顺序进行迭代,但是我已经介绍了为什么这不是一个合理的期望。

或者您可能会惊讶于大写字母'G'在所有小写字母(包括小写字母'a')之前排序。 Java String的数字值表示Unicode的UTF-16编码,与代码点0-127的ASCII一致。Web上有许多ASCII码图表,以及Unicode图表。这些中的任何一个都会告诉您,“ G”的Unicode代码点为71(十进制),而“ a”的Unicode代码点为97,因此,以“ G”开头的(子)字符串确实排在了以“ a”开头的字符串之前。 char的自然顺序。