A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈云帆 中级黑马   /  2012-7-15 08:42  /  2322 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈云帆 于 2012-7-16 13:11 编辑

在毕老师的讲解String的compareTo时,

String s1="a1c";
String s2="aaa";

System.out.println(s1.compareTo(s2));
s1和s2比较,为什么只比较1和a,而不比较a和c、1和a??
我看API了很长时间,也在网上查了查,都没说到这个问题,
哪位高手能给小弟指点下!

谢谢!!

9 个回复

倒序浏览
本帖最后由 陆强强 于 2012-7-15 08:52 编辑

在不复写compareTo方法的情况下
s1.compareTo(s2)比较的顺序是先两个对象的第一个字符进行比较。
String s1="a1c";
String s2="aaa";
发现都是a,再比较第二个字符1和a,分出顺序了就不再往下比了

回复 使用道具 举报
因为第一个a和a相同不用比,到第二个因为不同,所以只要比较完了就出结果了
回复 使用道具 举报
要了解String的compareTo方法具体是怎么实现排序功能,必须要看API的源码,帮你找到了compareto的底层源码:
    public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
if (i == j) {
     int k = i;
     int lim = n + i;
     while (k < lim) {
  char c1 = v1[k];
  char c2 = v2[k];
  if (c1 != c2) {
      return c1 - c2;
  }
  k++;
     }
} else {
     while (n-- != 0) {
  char c1 = v1[i++];
  char c2 = v2[j++];
  if (c1 != c2) {
      return c1 - c2;
  }
     }
}
return len1 - len2;
    }
底层是通过把字符串转成字符数组,比较字符数组的元素来实现的,通俗说就是从首字母开始依次比较每个字母,相同就比较下个字母,直到有不同字母或者到短字符串结尾,返回字符个数差(len1 - len2)

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 包晗 于 2012-7-15 10:37 编辑

String 当中的compareTO方法是按字典顺序比较两个字符串的大小,
基于各个字符的unicode值来进行比较的
compareTo(T o):比较此对象与指定对象的顺序。
如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数

你的程序
String s1="a1c";
String s2="aaa";

System.out.println(s1.compareTo(s2));
s1和s2比较,为什么只比较1和a,而不比较a和c、1和a??

的运行结果是 -48  

这是因为在 "aaa"  减去"a1c"      
按自然顺序比较的   a比a   a比1  a比c;
按照 unicode里的数值运算而得到的
希望能对你有用  

1.jpg (2.56 KB, 下载次数: 30)

1.jpg

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
同意 包晗的看法,我觉得也是这样比较的
回复 使用道具 举报
String s1="a1c";
String s2="aaa";


为了方便说明,我把s2中的a标了颜色。
比较对应字符应该是
s1的a和s2的 红 a  比较。
s1的1和s2的 蓝a  比较。
s1的c和s2的 黄 a  比较。

但是例子中比到第二位1和 蓝 a时就不同了,所以停止比较并返回结果。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
彭超华 发表于 2012-7-15 10:22
要了解String的compareTo方法具体是怎么实现排序功能,必须要看API的源码,帮你找到了compareto的底层源码 ...

谢谢,有些懂了,源码规定这么比的,
回复 使用道具 举报
谢谢各位的回答,
回复 使用道具 举报
该比较是自然排序,只要某一位上的数据比较得到结果,就不需要再往下比较。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马