arrayList和hashSet遍历谁更快?

面试时候遇见的一个问题。我人傻了,想了半天,没想明白谁更快。
所以谁更快呢?
我现在都没想明白

从数据结构上来说,这两个都会很快,但是由于hashset遍历的时候多一个操作,可能会慢一丢丢,实测在1000w个数据量下两者的用时情况:虽然ArrayList用时是HashSet的将近三分之一,但是两者都没有超过100ms,这里的差距其实可以忽略了。

img

肯定是Arraylist,因为Arraylist底层是个数组,寻找下一个元素按照地址+1就行了,但是hashset的底层是hashmap的key,理由hashmap的key保证它的唯一性,而hashmap底层是数组链表红黑树,还涉及key值的计算,遍历的效率肯定不如ArrayList

遍历的时候都一样快呀,只是用的时候速度不一样而已

遍历都一样
添加数据list快一点 因为list是直接添加 set需要检查是否有重复项
直接取数据也是list快一点 list直接通过角标可以获取 类似有索引 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适合通过位子来读取元素。

1)ArrayyList始终比HashSet性能要高

  1. HashSet每次添加总要判断hashcode导致效率低

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

建议你看下这篇博客ArrayList 与 HashSet 互相转换?