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()+"\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方法效率问题的更多相关文章
- Java ftp上传文件方法效率对比
Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...
- Java的clone方法效率问题
在Java中,经常会需要新建一个对象,很多情况下,需要这个新建的对象和现有的某个对象保持属性一致. 那么,就有两种方式来实现这个对象的构造: ①通过新建一个对象,为这个对象的属性根据原有对象的属性来进 ...
- 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法
今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...
- 无索引状态下比较DataTable的几种过滤方法效率
先构造一个DataTable: public DataTable GetDataTable() { DataTable dtTmp = new DataTable(); dtTmp.Columns.A ...
- 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题
#方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...
- String 类型equals方法和int == 方法效率比较
最近写了一个递归方法,在进行比较判断的时候,因为都是integer类型,而integer类型在大于127或者小于-128时会在新建一个,这是因为integer类型的拆装箱机制, 之前没有考虑过equa ...
- mybatis学习之路----批量更新数据两种方法效率对比
原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
- 【原创】展开二层嵌套列表(或pd.Series)的几种方法效率对比
转载请注明出处:https://www.cnblogs.com/oceanicstar/p/10248763.html ★二层嵌套列表(或以列表为元素的pd.Series)有以下几种展开方式 (1)列 ...
- python字符串连接方法效率比较
方法1:直接通过加号(+)操作符连接 1 website = 'python' + 'tab' + '.com' 方法2:join方法 1 2 listStr = ['python', 'tab', ...
随机推荐
- Java多线程实现
1.继承Thread类,由于Java单继承特性,此方法并不推荐. 2.实现Runnable接口,代码如下 class MyThread implements Runnable { private St ...
- MFC对话框Dialog控件处理程序handler因为public修饰符导致无法访问
比如说你的Dialog有一个Button名为Confirm,对应IDC_CONFIRM,处理程序handler为OnConfirm 那么OnConfirm必须是protected属性,如果是publi ...
- js离开或刷新页面检测(且兼容FF,IE,Chrome)
<!DOCTYPE html> <html> <head> <script> function closeIt() { return confirm(& ...
- J2EE sitemesh使用
maven包含sitemesh: <dependency> <groupId>opensymphony</groupId> <artifactId>si ...
- 证明 logX < X 对所有 X > 0 成立
题目取自:<数据结构与算法分析:C语言描述_原书第二版>——Mark Allen Weiss 练习1.5(a) 证明下列公式: logX < X 对所有 X > ...
- The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. 怎么解决
cd 文件 pod install --no-repo-update 就可以了
- 使用MJExtension中要注意的地方
MJExtension git地址 https://github.com/CoderMJLee/MJExtension#JSON_Model Model contains model-array[模 ...
- 3D照片放大展示窗口
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- List, Set, Map是否继承自Collection接口?
List, Set, Map是否继承自Collection接口? 答:List,Set是Map不是
- demo15 AlertDialog
Dialog dialog = new AlertDialog.Builder(this).setTitle("对话框").setMessage("this is msg ...