我正在尝试使用Locale.SIMPLIFIED_CHINESE来订购中文国家列表,这似乎是它使用拼音(拼音字母表,即根据他们的拉丁语对应组合从A到Z排序的字符).
但是我发现了一些订单不好的情况.例如:
正确的顺序应该是梵<中,而是以其他方式订购.
String[] characters = new String[] {"?", "?"};
List<String> list = Arrays.asList(characters);
System.out.println("Before sorting...");
System.out.println(list.toString());
Collator collator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE);
collator.setStrength(Collator.PRIMARY);
Collections.sort(list, collator);
System.out.println("After sorting...");
System.out.println(list.toString());
Run Code Online (Sandbox Code Playgroud)
这个片段的结果是:
Before sorting...
[?, ?]
After sorting...
[?, ?]
Run Code Online (Sandbox Code Playgroud)
更进一步,我发现Java适用于Locale.SIMPLIFIED_CHINESE的规则.您可以在下一张图片中找到: https://postimg.cc/image/4t915a7gp/full/(注意梵在中后)
我在用红色突出显示的<口<口<口<口之前意识到,所有字符都根据他们的拉丁记者组合从A到Z排序.但是,在<口<口<口<口<口之后符号,字符按字符的组成排序.例如,如果所有字符都具有相同的部分(通常是字符的左侧部分),则它们将组合在一起,而不是根据A到Z规则.
此外,<口<口<口<口<口之后的所有字符都是不常见的汉字.所以,梵是一个比中国更不常见的角色,所以它放在<口<口<口<口<口之后.
我想知道为什么这个决定,如果它是故意的.但它会导致错误的排序.我不知道如何找到解决方案.
我想知道下一个代码片段的内部Java行为是什么:
Long a = 123L;
long b = 123;
System.out.println("a equals b?: " + (a == b));
Run Code Online (Sandbox Code Playgroud)
结果是true虽然比较两个Long对象false(因为它比较了他们的参考).它是Java将Long对象转换为其原始值,因为检测==操作符对另一个原始对象?