非常愚蠢的问题,我没有得到。比较java中的数字字符串时,为什么“01”小于“1”?
阿什利
答案 0 :(得分:3)
因为"0"
小于"1"
。字典比较是每个字符的字符,以不同的第一个字符停止。
这是词典排序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,这两个字符串是两个字符串的有效索引,或者它们的长度不同,或两者都有。如果它们在一个或多个索引位置具有不同的字符,则让 k 成为最小的索引;然后是位于 k 的字符具有较小值的字符串,通过使用
<
运算符确定,按字典顺序排在另一个字符串之前。在这种情况下,compareTo
返回两个字符串中位置 k 处两个字符值的差异 - 即值:this.charAt(k)-anotherString.charAt(k)
如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。在这种情况下,
compareTo
返回字符串长度的差异 - 即值:this.length()-anotherString.length()
答案 1 :(得分:2)
因为字符串比较(Comparable
实现)依赖于比较String
的每个字符unicode值的lexicographical比较。
并且"1"
(U+0031
unicode)位于"0"
(U+0030
unicode)之后
unicode表。
它的工作方式与字典相同,不像数字比较
您比较了一些String
s,而不是一些Number
s。
"azerty"
出现在"zip"
之前,因为"a"
在"z"
之前
"1"
和"01"
也是如此
"0"
出现在"1"
之前。所以"01"
&lt; "1"
。
您可以参考String.compareTo()
javadoc来更好地理解方法的合同。
答案 2 :(得分:1)
假设您要比较两个字符串的数值,它们是整数:
Integer.parseInt("0") < Integer.parseInt("01")
答案 3 :(得分:1)
由Locale决定如何比较字符串。对于westeren语言,你有一个简单的字符排序,你从左边开始。这里最左边的字符分别是“0”和“1”,而“0”的unicode值比“1”低,后者立即决定以“0”开头的字符串在以“1”开头的字符串之前。
这些字符串在意外上与其他字符串相似(如逐个字符的整数)与此机制无关。如果它与您需要解决的任务相关,则需要编写代码来考虑这一点。