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

结论:

  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的区别的更多相关文章

  1. 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

    浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06  PM  13:41:46  1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...

  2. 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点

    浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...

  3. 浅谈C语言和C++中“类”的区别

    在C语言中,没有“类”的概念,但是可以由结构体struct构造出我们所需要的数据类型,struct可以组合不同的数据类型,可以看作是C语言中的“类”. 下面是C语言中的结构体的实例. #include ...

  4. Java语言中extend和implement的区别

    Java语言并不支持多重继承,而只能继承一个类,不过我们可以使用implements来实现多个接口. extends继承的父类:不能声明为final或者定义为abstract: implements实 ...

  5. 浅谈c语言和c++中struct的区别

    今天做二叉树的时候,发现利用结构体有点乱,不知道怎么回事,我之前知道c语言中声明一个结构体变量时需要通过 struct 结构体名 变量名,而在c++中,可以不要struct,由于可以利用typedef ...

  6. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  7. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  8. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  9. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

随机推荐

  1. 二、Tensorflow的作用域和图

    作用域主要用来不用重复定义变量,另外就是用与画图 import tensorflow as tf ''' 可视化 tf.summary.scalar 添加一个标量 tf.summary.audio 添 ...

  2. Hadoop记录-切换NN

    一.第一种方法 重启namenode(1.1.1.1 1.1.1.2)重启standby节点:1.1hadoop-daemon.sh stop zkfchadoop-daemon.sh stop na ...

  3. 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)

    一. EF简介 1. 定义 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对 ...

  4. Ext.net MessageBox提示

    Ext.MessageBox.confirm("选择全部", "确定选择?", function (btn) { if (btn !== "yes&q ...

  5. react图工具集成

    背景 调查了react下的图工具库, 并继承到项目中, 经过调研列出如下两个图工具库,可以同时使用. data-ui react-c3js 在一个工具中没有所需的图时候, 可以使用另一个替代. dat ...

  6. Java 集合系列03之 ArrayList详细介绍

    ArrayList做为List接口中最常用的实现类,必须掌握. 一.ArrayList简介 与Java中的数组相比ArrayList的容量可以动态增加.它继承与AbstractList,实现了List ...

  7. luogu P5322 [BJOI2019]排兵布阵

    传送门 普及dp 设\(f_{i,j}\)表示前\(i\)个城堡,用\(j\)人的最大价值,转移枚举一个对手,如果这个对手在\(i\)这个城堡人数是第\(k\)小的,那么用\(2a_i+1\)人可以得 ...

  8. 传输层--TCP和UDP的区别

    UDP(用户数据报协议):为调用它的应用程序提供了一种不可靠.无连接的服务. TCP(传输控制协议):为调用它的应用程序提供了一种可靠的.面向连接的服务. 当设计一个网络应用程序时,该应用程序的开发人 ...

  9. [系统集成] 基于telegraf, influxdb, grafana 建立 esxi 监控

    之前在 nagios 上建立了 esxi 监控,指标少.配置麻烦.视觉效果差.最近我把 esxi 监控迁移到了 influxdb+grafana 平台上,无论是监控指标.可操作性还是视觉效果都有了很大 ...

  10. Java基础 -- Java 抽象类 抽象方法

    总结: 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过.只有抽象类的非抽象子类可以创建对象. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类. ...