public static void main(String[] args){
List<String> strList = getStrList();
System.out.println("方法一开始时间:" + System.currentTimeMillis());
List<String> strList2 = strList.stream().sorted(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}).collect(Collectors.toList());
System.out.println("方法一结束时间:" + System.currentTimeMillis());
System.out.println("-----------------------------");
System.out.println("方法二开始时间:" + System.currentTimeMillis());
List<String> strList3 = strList.stream().sorted(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.hashCode() - o2.hashCode();
}
}).collect(Collectors.toList());
System.out.println("方法二结束时间:" + System.currentTimeMillis());
}
public static List<String> getStrList(){
List<String> resultStrList = new ArrayList<>();
for(int i = 0 ; i <= 100000; i ++){
resultStrList.add(System.currentTimeMillis() + "");
}
return resultStrList;
}
方法一排序是利用compareTo()方法,方法二是根据hash值来判断.俩者会存在效率问题.只能通过看源码来推测效率问题
string.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;
}
string.hashCode()源码
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
分析
compareTo()是根据string转char数字后的Unicode进行比较,只涉及加减,无乘法;hashCode()是遍历char数组转成hash值,有加法和乘法.从循环次数来看,compareTo()循环了 min(str1.length,str2.length),hashCode()循环了str1.length + str2.length;从比较次数来看,compareTo()比较了min(str1.length,str2.length),hashCode()比较了一次.
带着分析结果执行了上面排序代码
发现当数组集合小于100W(没有认真看是多少范围)的时候,hashCode()方法比compareTo()方法效率要稍微高一点,当数据大小超过500W(也可能是我电脑问题)的时候,hashCode()方法比compcompareTo()方法效率要稍微低.
以上就是string集合的俩种比较方式分析.有兴趣的同学可以自己尝试一下。