zoukankan      html  css  js  c++  java
  • 浅谈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()+" Set中数据大小为:"+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 ));

    }

    }

    运行结果为:

    以500为例

    以100000为例

    以5000000为例

     

     

    结论:

    1)   ArrayList始终比HashSet性能要高

    2)   HashSet每次添加总要判断hashcode导致效率低

    3)   HashSet两种循环中iterator 方式不稳定,不过总是比foreach要快一点

    非宁静无以致远,非淡泊无以明志。
  • 相关阅读:
    读书笔记——吴军《态度》
    JZYZOJ1237 教授的测试 dfs
    NOI1999 JZYZOJ1289 棋盘分割 dp 方差的数学结论
    [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度
    POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数
    POJ2157 Check the difficulty of problems 概率DP
    HDU3853 LOOPS 期望DP 简单
    Codeforces 148D. Bag of mice 概率dp
    POJ3071 Football 概率DP 简单
    HDU4405 Aeroplane chess 飞行棋 期望dp 简单
  • 原文地址:https://www.cnblogs.com/MrZhangxd/p/10682876.html
Copyright © 2011-2022 走看看