目录
一、使用方式
public static void compare() {
String a = "a";
String b = "b";
int result = a.compareTo(b);
// -1
System.out.println(result);
}
二、原理
查看string类型的源码,String这个类继承了Comparable这个类,同时实现了compareTo这个方法。所以可以使用这个方法,对于一些数值类型的字符串,或者时间类型的字符串,是可以直接拿去使用的。
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
源码里面,其实比较的就是相同位置的字符,每个字符都对应一个ascll码值。数字0对应48,9对应的是57、A对应65、a对应97。所以对于数字类型的字符串,可以不用转化为数值类型,再比较大小。
三、测试效率
public static int compare() {
// int 的最大值 Integer.MAX_VALUE(2147483647)
String a = "2147483647";
String b = "2147483646";
return a.compareTo(b);
}
public static int compareValue() {
int a = Integer.valueOf("2147483647");
int b = Integer.valueOf("2147483646");
return Integer.compare(a, b);
}
public static void main(String[] args) {
int times = 10000_00; // 循环次数
long start = System.currentTimeMillis();
int tmp = 0;
for (int i = 0; i < times; i++) {
tmp = compare();
}
System.out.println(" 直接比较耗时:" + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
tmp = compareValue();
}
System.out.println(" 转化后耗时:" + (System.currentTimeMillis() - start));
System.out.println(tmp);
}
执行结果:
直接比较耗时:14
转化后耗时:129