`

java 集合查找效率 List Set

阅读更多
public class TestListSet {

    private static String LABEL = "testlistset";

    public static void main(String[] args) {

        List<String> list = getList();
        Set<String> set = getSet();
        String tt = LABEL + 83445;
        long tt0 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            list.contains(tt);
        }
        long tt1 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            set.contains(tt);
        }
        long tt2 = System.currentTimeMillis();
        System.out.println(String.format("compare list(%d) vs set(%d) ", (tt1 - tt0), (tt2 - tt1)));
    }

    /**
     * @Title: getSet
     * @Description: TODO
     * @return
     */
    private static Set<String> getSet() {
        long t0 = System.currentTimeMillis();
        Set<String> set = new HashSet<>();
        for (int i = 0; i < 100000; i++) {
            set.add(LABEL + i);
        }
        long t1 = System.currentTimeMillis();
        System.out.println("init set 10W times = " + (t1 - t0));
        return set;
    }

    /**
     * @Title: getList
     * @Description: TODO
     * @return
     */
    private static List<String> getList() {
        long t0 = System.currentTimeMillis();
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            list.add(LABEL + i);
        }
        long t1 = System.currentTimeMillis();
        System.out.println("init list 10W times = " + (t1 - t0));
        return list;
    }

}

结果

init list 10W times = 23
init set 10W times = 50
compare list(70529) vs set(4)

说明
List中contains():调用indexOf(o)方法 遍历List中的每个元素,每个元素与比较对象进行equals()比较,只要有一个相同,就返回true 意思是说他就是会扫描整个List
Set中的contain():调用的是map.containKey(o),内部使用的是Hashtable
/**
     * Returns <tt>true</tt> if this map contains a mapping for the
     * specified key.
     *
     * @param   key   The key whose presence in this map is to be tested
     * @return <tt>true</tt> if this map contains a mapping for the specified
     * key.
     */
    public boolean containsKey(Object key) {
        return getNode(hash(key), key) != null;
    }


所以如果在大队列中嵌套循环中比较存在的话,请选用hashset,效率会大大提升。
分享到:
评论

相关推荐

    求2个集合的交集

    hash的另一个特点是查找效率为O(1),惊人的高! 对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。 HashSet类 HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集...

    Java容器

    Java容器 有两种容器:一个是Collection容器,存放对象的集合;...LinkedHashSet:具有HashSet查找效率,同时前后链维持数据的插入顺序。 TreeSet:基于红黑树实现,支持有序性操作。 List List集合看重的是有序,同

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    java 面试题 总结

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    超级有影响力霸气的Java面试题大全文档

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符...

    基于javatcpsocket通信的拆包和装包源码-all-in-one:知识点总结

    List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问,查找元素效率高,插入删除效率低。 Set集合是无序集合,集合中的元素不可以重复,检索效率低下,删除和插入效率高,访问集合...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。  系统预定义角色 预定义角色是在数据库安装后,系统自动创建的一些常用的角色。下面我们就简单介绍些系统角色:  CONNECT...

    net学习笔记及其他代码应用

    而Remoting可以利用TCP/IP,二进制传送提高效率。 31.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...

Global site tag (gtag.js) - Google Analytics