0.前言

ThreeSet的底层实现是红黑树,它在创建set的过程中实现排序。Collections.sort是在对整个集合进行排序,按道理来说使用TreeSet插入集合元素直至建立整个TreeSet过程中实现排序在时间方面要比Collections.sort对整个集合进行排序效率要高很多,因为它在每次搜索要插入的位置时耗费的时间为log(n),n代表的是当前集合的长度,但实验表明使用Collections.sort对集合进行排序时间耗费要少些。

返回类型为int型

        Collections.sort(appIds, new Comparator<AfaApplication>() {
@Override
public int compare(AfaApplication app1, AfaApplication app2) {
if(StringUtils.isNotNullAndBlank(app1.getAppId())&&StringUtils.isNotNullAndBlank(app2.getAppId())){
return Integer.parseInt(app1.getAppId())-Integer.parseInt(app2.getAppId());
}else{
return ;
}
}
});

有时候会报错

java.lang.NumberFormatException: For input string: "006006003002"

有几种可能,有可能字段转换值超了,有可能获取的字段为空或者为null无法转为数据,这时候就要判断为空或者null

值超了和null的情况处理:

        Collections.sort(appMenuTreeList, new Comparator<AppMenuTree>() {
@Override
public int compare(AppMenuTree tree1, AppMenuTree tree2) {
if(StringUtils.isNotNullAndBlank(tree1.getTreeId())&&StringUtils.isNotNullAndBlank(tree2.getTreeId())){
return Long.parseLong(tree1.getTreeId())>Long.parseLong(tree2.getTreeId())?:-;
}else{
return ;
}
}
});

有时候会报错

Comparison method violates its general contract
      Collections.sort(appMenuTreeList, new Comparator<AppMenuTree>() {
@Override
public int compare(AppMenuTree tree1, AppMenuTree tree2) {
if(StringUtils.isNotNullAndBlank(tree1.getTreeId())&&StringUtils.isNotNullAndBlank(tree2.getTreeId())){
             if(Long.parseLong(tree1.getTreeId())==Long.parseLong(tree2.getTreeId())){
               return ;
             }else{
return Long.parseLong(tree1.getTreeId())>Long.parseLong(tree2.getTreeId())?:-;
              }
}else{
return ;
}
}
});
        Collections.sort(roleList, new Comparator<AfaRole>() {
@Override
public int compare(AfaRole tree1, AfaRole tree2) {
if(StringUtils.isNotNullAndBlank(tree1.getRoleCode())&&StringUtils.isNotNullAndBlank(tree1.getRoleCode())){
return tree1.getRoleCode().compareToIgnoreCase(tree2.getRoleCode());
}else{
return ;
}
}
});

1.性能比较

 
数据规模 循环次数 Collections.sort耗时(微妙) TreeSet耗时(微妙)
1000000 10 339332微秒 1215165微秒
100000 10 24547微秒 49862微秒
10000 10 3246微秒 3884微秒
1000 10 752微秒 1097微秒

测试机器:windows、2.2GHz、Core i5、8G

2.测试代码

package com.google.common.base;

import com.google.common.collect.Lists;
import com.google.common.primitives.Ints;
import org.junit.Test; import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet; public class SortTest {
public static final int DEFAULT_ARRAY_LENGTH = * * ; private List<Integer> createList(int arrLength) {
List<Integer> numbers = Lists.newArrayList();
for(int i = ; i < DEFAULT_ARRAY_LENGTH; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
return numbers;
}
public long testCollectionsSort(List<Integer> numbers) {
Ticker ticker = Ticker.systemTicker();
long startTime = ticker.read();
Collections.sort(numbers, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return Ints.compare(o2, o1);
}
});
//long endTime = ticker.read();
//System.out.println("[testCollectionsSort]" + (endTime - startTime) / 1000);
//System.out.println("[testCollectionsSort]" + numbers.toString());
return (ticker.read() - startTime) / ;
} public long testSortedMap(List<Integer> numbers) {
Ticker ticker = Ticker.systemTicker();
long startTime = ticker.read();
TreeSet<Integer> sortedNumberSet = new TreeSet<Integer>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return Ints.compare(o2, o1);
}
});
sortedNumberSet.addAll(numbers);
//long endTime = ticker.read();
//System.out.println("[testSortedMap]" + (endTime - startTime) / 1000);
//List<Integer> newNumbers = Lists.newArrayList(sortedNumberSet);
//System.out.println("[testSortedMap]" + newNumbers.toString());
return (ticker.read() - startTime) / ;
} @Test
public void testSortMethodCompare() {
int loopCount = ;
long collectionsSortTimeTotalCount = ;
long sortedMapTimeTotalCount = ;
List<Integer> numbers = createList(DEFAULT_ARRAY_LENGTH);
for(int i = ; i < loopCount; i ++) {
List<Integer> tempNumbers = Lists.newArrayList(numbers);//每次循环使用同样数据
sortedMapTimeTotalCount += testSortedMap(tempNumbers);//不会改变tempNumbers
collectionsSortTimeTotalCount += testCollectionsSort(tempNumbers);
}
long collectionsSortTimeCount = collectionsSortTimeTotalCount / loopCount;
long sortedMapTimeCount = sortedMapTimeTotalCount / loopCount;
System.out.println("[testSortMethodCompare] loopCount = " + loopCount
+ ",listSize = " + DEFAULT_ARRAY_LENGTH);
System.out.println("[CollectinSort]" + collectionsSortTimeCount + "微秒");
System.out.println("[SortedMapSort]" + sortedMapTimeCount + "微秒");
}
}

3.性能差异分析

a.TreeSet每次搜索要插入的位置时耗费的时间为log(n),n代表的是当前集合的长度,n从1增加至排序的数据集合list的list.size(),这个相比Collections.sort直接对整个数据集合进行排序具有优势。

b.TreeSet一个明显的劣势排序的过程是插入新节点的过程,创建新节点,插入新节点应该也会耗费一定的时间。

c.TreeSet另一个明显的劣势为由于其底层实现为红黑树,所以每次插入后需要对原有的集合进行修改以使得新集合底层仍然是红黑树。

以上是TreeSet实现排序的优势和劣势,由性能比较数据可以看出,相比TreeSet实现排序的优势,其劣势更明显。

Collections排序的更多相关文章

  1. 集合框架工具类--Collections排序

    package ToolCollectionsDemo; import java.util.ArrayList; import java.util.Collections; import java.u ...

  2. Collections -集合排序compareTo方法重写,shuffle,addall

    package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...

  3. java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合

    Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...

  4. Java基础之常用类

    1.Collections类: (1)此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. (2)静态方法摘要: static <T> boolea ...

  5. Java 集合补充

    集合大致可以分List,Set,Queue,Map四种体系. 集合和数组不一样,数组元素可以是基本类型的值,也可以是对象(的引用变量),集合里只能保存对象(的引用变量). 访问:如果访问List集合中 ...

  6. JAVA学习基础知识总结(原创)

    (未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...

  7. Java 基础总结大全

    Java 基础总结大全 一.基础知识 1.JVM.JRE和JDK的区别 JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jv ...

  8. Java基础总结大全

    一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. J ...

  9. java基础-容器

    已经写了一段时间JAVA代码了,但仔细想来,却发现对JAVA的很多方面还是一片迷茫. 利用周末补一下基础知识吧. 大致列一下这个周末需要学习的内容 1 容器 (本节内容) 2 线程 3 流 目录 1 ...

随机推荐

  1. ReactNative之Android打包APK方法(趟坑过程)

    欢迎大家加群讨论 点击链接加入群[ReactNative-解决问题交流群] :644124441 点击链接加入群[ReactNative技术交流群2] :687663534 多余的不解释了.直接上车吧 ...

  2. shell script语法高亮和自动缩进的配置

    编辑/etc/profile文件,在文件末尾加一下内容: export TERM=xterm-color 接着让其变为全局变量 source /etc/profile 编辑/etc/vimrc文件,在 ...

  3. Android 相关重难点知识整理

    [原文] 集合 对 HashMap 进行排序: HashMap 本身无序,但其子类 LinkedHashMap 使用链表结构,实现了有序.通过 HashMap#entrySet() 方法可以将 Map ...

  4. java 类的加载、连接和初始化

    JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区. ...

  5. Spring mvc使用不了jstl 或者 Spring mvc不解析jstl

    最近我搭了一个maven的springMVC的项目发现前端怎么也识别不了我的jstl,我查询了很多方法,导致这种情况的原因有很多 1.jar引用不对,maven中的正确导入可用的jar <dep ...

  6. phalcon: 独立的映射,字段名名别名

    class ProductsController extends \Phalcon\Mvc\Controller { public function saveAction() { //Obtain t ...

  7. NLP(二)_汉语言分词技术-最大匹配法

    前述 词是自然语言中最小的有意义的构成单位.汉语文本是基于单字的文本,汉语的书面表达方式以汉字作为最小单元,词与词之间没有明显的界限标志,因此,分词是汉语文本分析处理中首先要解决的问题之一. 分词可能 ...

  8. lightoj1370欧拉函数/素数筛

    这题有两种解法,1是根据欧拉函数性质:素数的欧拉函数值=素数-1(可根据欧拉定义看出)欧拉函数定义:小于x且与x互质的数的个数 #include<map> #include<set& ...

  9. Openstack Mitaka 负载均衡 LoadBalancerv2

    ​ 最近研究了一下Openstack负载均衡,yum源和源码级别的安装都尝试成功了.网上有很多文章都是LoadBalancerv1,这个已经被放弃了.所以写一下自己是如何使用LoadBalancerv ...

  10. iRed邮箱使用情况

    iRedAdmin-Pro 在域名的用户列表里直接显示了邮箱使用情况的百分比,并有一个细小的进度条以不同颜色标示百分比情况.用户的邮箱限额定义在 mailbox.quota,当前使用情况定义在 use ...