浅谈Java语言中ArrayList和HashSet的区别
Java语言中ArrayList和HashSet的区别
2019-04-10 13:22:49
一、基本区别
首先一起看个实例,其代码如下:
package com.MrZ_baby.com;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class test_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList();
list.add("Test_4_1");
list.add("Test_4_1");
list.add("Test_4_1");
list.add("Test_4_1");
Set set = new HashSet();
set.add("Test_4_1");
set.add("Test_4_1");
set.add("Test_4_1");
set.add("Test_4_1");
System.out.println("List中数据大小为:"+list.size()+"\nSet中数据大小为:"+set.size());
}
}
运行结果为:
List中数据大小为:4
Set中数据大小为:1
结论:
- HashSet
1) HashSet不能够存储相同的元素,元素是否相同的判断:重写元素的equals方法。equals方法和hashCode方法必须兼容,如:equals方法判断的是用户的名字name,那么hashCode的返回的hashcode必须是name。hashcode();
2) HashSet存储是无序的,保存的顺序与添加的顺序是不一致的,它不是线性结构,而是散列结构,(通过散列表:散列单元指向链表)。因此,HashSet的查询效率相对比较高。
3) HashSet不是线程安全的,不是线程同步的。这需要自己实现线程同步:Collections.synchronizedCollection(),方法实现。
2.ArrayList
1) ArrayList中存放顺序和添加顺序是一致的。并且可重复元素。
2) 不是线程安全的,不是线程同步的。
3) ArrayList是通过可变大小的数组实现的,允许null在内的所有元素。
4) ArrayList适合通过位子来读取元素。
二、性能比较区别
首先一起看个实例,其代码如下:
package com.MrZ_baby.com;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class Test4_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Integer> set = new HashSet<>();
List<Integer> list = new ArrayList<>();
Long time_1 = System.currentTimeMillis();
for(int i = 0; i < 100000; i ++)
{
set.add(i);
}
Long time_2 = System.currentTimeMillis();
for(int i = 0; i < 100000; i ++){
list.add(i);
}
Long time_3 = System.currentTimeMillis();
System.out.println("往HashSet里面添加100000条数据花费时间为:" + ( time_2 - time_1 ));
System.out.println("往ArrayList里面添加100000条数据花费时间为:" + ( time_3 - time_2 ));
Long time_4 = System.currentTimeMillis();
for(Integer i : set){
}
Long time_5 = System.currentTimeMillis();
Iterator<Integer> item = set.iterator();
while (item.hasNext()) {
Integer str = item.next();
}
Long time_6 = System.currentTimeMillis();
for(Integer i : list){
}
Long time_7 = System.currentTimeMillis();
System.out.println("HashSet重复迭代(foreach) 100000次花费时间为:" + ( time_5 - time_4 ));
System.out.println("HashSet重复迭代(iterator) 100000次花费时间为:" + ( time_6 - time_5 ));
System.out.println("ArrayList重复迭代(foreach) 100000次花费时间为:" + ( time_7 - time_6 ));
}
}
运行结果为:



结论:
1) ArrayList始终比HashSet性能要高
2) HashSet每次添加总要判断hashcode导致效率低
3) HashSet两种循环中iterator 方式不稳定,不过总是比foreach要快一点
浅谈Java语言中ArrayList和HashSet的区别的更多相关文章
- 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题
浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06 PM 13:41:46 1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...
- 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点
浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...
- 浅谈C语言和C++中“类”的区别
在C语言中,没有“类”的概念,但是可以由结构体struct构造出我们所需要的数据类型,struct可以组合不同的数据类型,可以看作是C语言中的“类”. 下面是C语言中的结构体的实例. #include ...
- Java语言中extend和implement的区别
Java语言并不支持多重继承,而只能继承一个类,不过我们可以使用implements来实现多个接口. extends继承的父类:不能声明为final或者定义为abstract: implements实 ...
- 浅谈c语言和c++中struct的区别
今天做二叉树的时候,发现利用结构体有点乱,不知道怎么回事,我之前知道c语言中声明一个结构体变量时需要通过 struct 结构体名 变量名,而在c++中,可以不要struct,由于可以利用typedef ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
随机推荐
- 基于Redis的分布式锁真的安全吗?
说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...
- thinkphp5 去除缓存
array_map('unlink', glob(TEMP_PATH . '/*.php')); rmdir(TEMP_PATH);
- 我的python中级班学习之路(全程笔记第一模块) (第一章)(第2部分:如何设置python中的字体颜色,猜年龄练习题解答,while else语句,pycharm的使用)
第一章: python 基础语法 第 2 部分: 一.猜年龄练习题解答 直接上代码 >>> age = 26 >>> count = 0 >>&g ...
- windows10安装docker,运行jhipster-registry
1.官网下载windows版docker 2.设置bios 3.CMD进入到某个jhipster的工程目录,执行"docker-compose -f src/main/docker/jhip ...
- BootstrapTable-导出数据
要导出的数据:https://examples.bootstrap-table.com/json/data1.json?order=asc 使用的插件(注意插件版本依赖):tableExport.jq ...
- js关于“call方法”百度,阿里超难面试题
面试题:function fn(a,b){ console.log(this); console.log(a); console.log(a+b);}fn.call(1);fn.ca ...
- ASP.NET-SHA256加密方法
/// <summary> /// SHA256加密 /// </summary> /// <param name="strData">< ...
- 第十六节,OpenCV(学习五)边缘检测
边缘检测 边缘检测的目的是标识数字图像中亮度变化明显的点,边缘检测是特征提取的重要领域. 1.检测方法 边缘检测的方法大致分为两类:基于搜索和基于零交叉 基于搜索的边缘检测方法首先计算边缘强度,通常用 ...
- django 模型models
1. django 模型models 常用字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一 ...
- Beta 冲刺(7/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(7/7) 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 还剩下哪些 ...