我有以下代码,但由于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
答案 0 :(得分:1)
我无法理解输出,因为树集如何产生以下输出。可以解释一下TreeSet如何在内部存储对象。
根据its docs,TreeSet
将其元素存储在TreeMap
中(作为键)。就TreeMap
stores its elements in a red-black tree而言,这是两个类的名称的基础。如果您不知道,则红黑树是二进制搜索树的一种形式。
对于输出,有两点要理解:
TreeSet
是排序的集。如果用Comparator
初始化一个,则定义排序顺序。否则,就像您的情况一样,它使用元素的自然顺序。该集合的迭代器按排序顺序返回元素。
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
的自然顺序。