浅谈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();

扫描二维码关注公众号,回复: 5835624 查看本文章

        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 ));

}

}

运行结果为:

以500为例

以100000为例

以5000000为例

 

 

结论:

1)   ArrayList始终比HashSet性能要高

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

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

猜你喜欢

转载自www.cnblogs.com/MrZhangxd/p/10682876.html