• 浅谈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要快一点

    非宁静无以致远,非淡泊无以明志。
  • 相关阅读:
    Java BEAN与EJB的区别
    Java设计模式(22)命令模式(Command模式)
    Java设计模式(21)访问模式(Visitor者模式)
    Java设计模式(20)观察者模式(Observer模式)
    Java设计模式(19)状态模式(State模式)
    Java设计模式(18)策略模式(Strategy模式)
    Java设计模式(17)解释器模式(Interpreter模式)
    Java设计模式(16)中介模式(Mediator模式)
    Java设计模式(15)备忘录模式(Memento模式)
    C# SignalR 即时通讯 聊天室
  • 原文地址:https://www.cnblogs.com/MrZhangxd/p/10682876.html
Copyright © 2020-2023  润新知