今天看到网上一篇文章说: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查询结果结果:

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

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

耗时前者是后者的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#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题

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

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

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

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

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

  8. 【原创】展开二层嵌套列表(或pd.Series)的几种方法效率对比

    转载请注明出处: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. Silverlight/WPF绘制统计图Visifire.dll文件

    官网:http://www.visifire.com/ 一直没找到好的中文文档,希望有的这个的可以发个我! 效果图: 前台代码: <UserControl x:Class="Text_ ...

  2. play项目部署

    首先对于现场的数据库,一定要谨慎谨慎再谨慎,特别是保存有重要数据的. 使用expdp命令导入数据库: 事前准备: 1.确保linux服务器上已经正确安装oracle (10g以上版本) 2.有Xshe ...

  3. 线段树 Interval Tree

    一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...

  4. SQLSERVER:sqlserver2008r2安装好后,自动提示功能不可以使用

    刚安装好的sqlserver2008r2x64,写一些sql时,自动提示功能失效了. 解决排查一: 找到tools->options->Text Editor->Transact-S ...

  5. JAVA线程基础

    一.线程状态 由于参考的维度不一样,线程状态划分也不一样,我这里简单的分为5大类,并且会说明状态变迁的详细过程:

  6. Leetcode: Count Numbers with Unique Digits

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  7. Leetcode: Palindrome Numbers

    Determine whether an integer is a palindrome. Do this without extra space. 尝试用两头分别比较的方法,结果发现无法解决1000 ...

  8. SpringMVC注解@RequestParam全面解析

    在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取.这里主要 ...

  9. int和long long有符号整形 负数比正数多一个

    int的负数比正数多一个,则有一个负数在int范围内没有对应的正数 最大正整数用十六进制,很容易表示:0x7f ff ff ff int num = 0x7fffffff; num = -num; p ...

  10. introcuding less css with less.js, using webcompiler ext

    1.html [watch out for the !js load sequence and the attribute of !rel stylesheet/less!] <!DOCTYPE ...