List与Set的contains方法效率问题

时间:2021-03-20 23:51:59

今天看到网上一篇文章说: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()+"\n共耗费时间:"+(end-start)+ "毫秒");

使用ArrayList查询结果结果:List与Set的contains方法效率问题

使用HashSet查询结果:List与Set的contains方法效率问题

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

查询靠后的对象:

代码:

        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()+"\n共耗费时间:"+(end-start)+ "毫秒");

使用ArrayList查询结果结果:List与Set的contains方法效率问题

使用HashSet查询结果:List与Set的contains方法效率问题

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个对象 \n共耗费时间:"+(end-start)+ "毫秒");

使用ArrayList查询结果结果:List与Set的contains方法效率问题;使用HashSet查询结果:List与Set的contains方法效率问题

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

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

List与Set的contains方法效率问题的更多相关文章

  1. Java ftp上传文件方法效率对比

    Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...

  2. Java的clone方法效率问题

    在Java中,经常会需要新建一个对象,很多情况下,需要这个新建的对象和现有的某个对象保持属性一致. 那么,就有两种方式来实现这个对象的构造: ①通过新建一个对象,为这个对象的属性根据原有对象的属性来进 ...

  3. 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法

    今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...

  4. 无索引状态下比较DataTable的几种过滤方法效率

    先构造一个DataTable: public DataTable GetDataTable() { DataTable dtTmp = new DataTable(); dtTmp.Columns.A ...

  5. 【C&num;】判断字符串中是否包含指定字符串&comma;contains与indexof方法效率问题

    #方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...

  6. String 类型equals方法和int &equals;&equals; 方法效率比较

    最近写了一个递归方法,在进行比较判断的时候,因为都是integer类型,而integer类型在大于127或者小于-128时会在新建一个,这是因为integer类型的拆装箱机制, 之前没有考虑过equa ...

  7. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  8. 【原创】展开二层嵌套列表&lpar;或pd&period;Series&rpar;的几种方法效率对比

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/10248763.html ★二层嵌套列表(或以列表为元素的pd.Series)有以下几种展开方式 (1)列 ...

  9. python字符串连接方法效率比较

    方法1:直接通过加号(+)操作符连接 1 website = 'python' + 'tab' + '.com' 方法2:join方法 1 2 listStr = ['python', 'tab',  ...

随机推荐

  1. Html5文件

    HTML5 file api 读取文件MD5码 http://www.zhuwenlong.com/blog/52d6769f93dcae3050000003

  2. Android Handler处理机制 &lpar; 一 &rpar;(图&plus;源码分析)——Handler&comma;Message&comma;Looper&comma;MessageQueue

    android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习 google大牛们的设计思想. ...

  3. Xamarin Anroid开发教程之验证环境配置是否正确

    Xamarin Anroid开发教程之验证环境配置是否正确 经过前面几节的内容已经把所有的编程环境设置完成了,但是如何才能确定所有的一切都处理争取并且没有任何错误呢?这就需要使用相应的实例来验证,本节 ...

  4. C&num; 之 服务端获取远程资源

    获取指定网页的远程资源可使用 WebClient.WebRequest.HttpWebRequest 三种方式来实现.当然也可使用webBrowse,webBrowse不做介绍. 通过 System. ...

  5. underscorejs-groupBy学习

    2.18 groupBy 2.18.1 语法 _.groupBy(list, iteratee, [context]) 2.18.2 说明 把list分为多个集合,iterator为分组的依据,返回值 ...

  6. fragment低版本

    http://bbs.csdn.net/topics/390271980 Fragment框架开发东西确实很方便,但是恼人的是从4.0才开始支持.以前的版本必须用兼容模式开发,本人在网上找了大量资料, ...

  7. 第一章:selenium &plus; java 环境安装

    1. 首先安装的是 jdk ,推荐安装的是   JDK 版本是 1.7 2.  安装 JDK 步骤: 第一步: 第二步: 第三步: 配置 JDK 环境变量,点击 我的电脑-右键-高级-环境变量. 第五 ...

  8. DirectX:在graph自己主动连线中增加自己定义filter&lpar;graph中遍历filter&rpar;

    为客户提供的视频播放的filter的測试程序中,採用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791).因为不同的视频压缩 ...

  9. MySQL&lowbar;执行计划详细说明

          1 简要说明 id 表格查询的顺序编号. 降序查看,id相同的从上到下查查看. id可以为null ,当table为( union ,m,n )类型的时候,id为null,这个时候,id的 ...

  10. &lbrack;物理学与PDEs&rsqb;第1章习题10 *电磁场在 Lorentz 规范变换下可使标势为零

    在*电磁场的情况, 证明: 在保持 Lorentz 条件下的规范变换下, 可使标势恒为零. 证明: 取 $\psi$ 满足 $\cfrac{\p \psi}{\p t}=\phi$ 且 $\cfra ...