zoukankan      html  css  js  c++  java
  • List与Set的contains方法效率问题

    今天看到网上一篇文章说:Set检索元素效率低下,删除和插入效率高;List查找元素效率高,插入删除元素效率低。于是想到List虽然用get(index)方法查询效率高,但是若用contains方法查询对象元素,Set集合应该比List效率要高,下面是实验证明操作过程。

    实体类:

    package mytest.testListAndSet;
    
    public class Student {
    
        private Integer id;
        private String name;
        private String addr;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAddr() {
            return addr;
        }
        public void setAddr(String addr) {
            this.addr = addr;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((addr == null) ? 0 : addr.hashCode());
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Student other = (Student) obj;
            if (addr == null) {
                if (other.addr != null)
                    return false;
            } else if (!addr.equals(other.addr))
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
        public Student() {
            super();
        }
        public Student(String name, String addr) {
            super();
            this.name = name;
            this.addr = addr;
        }
        @Override
        public String toString() {
            return "Student [name=" + name + ", addr=" + addr + "]";
        }
        
        
    }
    Student

    准备数据代码:

    List<Student> list = new ArrayList<Student>();
            Set<Student> set = new HashSet<Student>();
            Student s = null;
            for(int i = 0; i <= 100000; i++){
                s = new Student("name"+i,"addr"+i);
                list.add(s);
                set.add(s);
            }

    查询第一个对象:

     代码:

    long start = System.currentTimeMillis();
            Student stu = new Student("name0","addr0");
            System.out.println(list.contains(stu));
    //        System.out.println(set.contains(stu));
            long end = System.currentTimeMillis();
            System.out.println("查询对象 "+stu.toString()+"
    共耗费时间:"+(end-start)+ "毫秒");

    使用ArrayList查询结果结果:

    使用HashSet查询结果:

    查询第一个对象太简单了,它们都几乎不用花时间...

    查询靠后的对象:

    代码:

            long start = System.currentTimeMillis();
            Student stu = new Student("name100000","addr100000");
    //        System.out.println(list.contains(stu));
            System.out.println(set.contains(stu));
            long end = System.currentTimeMillis();
            System.out.println("查询对象 "+stu.toString()+"
    共耗费时间:"+(end-start)+ "毫秒");

    使用ArrayList查询结果结果:

    使用HashSet查询结果:

     HashSet快一些。。。

    通过多次调用contains方法分别查询开头到结尾所有对象:

    代码:

    long start = System.currentTimeMillis();
            for(int i = 0; i<= 100000; i++){
                s = new Student("name"+i,"addr"+i);
                System.out.println(i+"__"+list.contains(s));
    //        System.out.println(i+"__"+set.contains(s));
            }
            
            long end = System.currentTimeMillis();
            System.out.println("查询10000个对象 
    共耗费时间:"+(end-start)+ "毫秒");

    使用ArrayList查询结果结果:;使用HashSet查询结果:

    耗时前者是后者的167.46倍(打印代码中把100000写成10000了,但是不影响结果)

     总结:使用contains方法查询元素是否存在HashSet要比ArrayList快的多。

  • 相关阅读:
    spring data jpa 不更新 null 值,
    Android 生命周期
    Java相对路径/绝对路径总结
    android 系统广播
    ADB 设置远程调试
    adb server is out of date ADB server didn't ACK * failed to start daemon *一种解决方式
    Windows 8.1 Enterprise Preview
    反编译CMD命令
    判断运营商
    ADT安装
  • 原文地址:https://www.cnblogs.com/GoQC/p/5821294.html
Copyright © 2011-2022 走看看