ArrayList
基于动态数组的数据结构,对于随机访问get和set方法,会优于LinkedList。当查询业务比较多的时候用ArrayList会更加合适。
ArrayList实现是基于动态数据,但是在Add的时候也会导致数组下标越界。
当ArrayList的size为14的时候,一个线程1执行add()的方法,在执行ensureCapacityInternal( size + 1)时,发现还可以添加一个元素,故数组没有扩容,此时线程1被阻塞。线程2进入,由于线程1没有添加元素,所以Capacity还是15,此时线程2的数据add成功,size==15。然后线程1被释放,可以执行add操作,线程1就在尝试往index ==15存数据,而size就只有 == 15,就导致了越界的情况。
当然,如果在你get的时候传入了>=list.size()的数值也会导致数据下标越界。
LinkedList
基于链表的数据结构,随机访问较ArrayList慢,因为不能同数组一样直接获取下标数据,需要遍历指针。当时增删比较快,可以在需要频繁增删数据的情况下用LinkedList。尽可能不用get的方式获取数据,用迭代器或者foreach
1 | LinkedList<Integer> linkedList = new LinkedList<>(); |
效率比较
1 | // LinkedList用get获取元素 |
1 | public static void main(String[] args) { |