最近开始准备找实习了,第二次面试献给了百度,百度面的都是一些细致的知识点和基本的算法,看你的基本功是否扎实,才发现自己学的很不牢固。 #ArrayList的使用方法 面试百度的时候被问到了java中的常用的几种数据结构,我提到了ArrayList、hashset、hashmap、linkedlist。面试官提到了ArrayList内部实现的原理。当时答的是一直把ArrayList当作一个动态数组来使用,并不清楚其内部的实现原理。
这里总结一下ArrayList的内部实现原理 1、什么是ArrayList
ArrayList就是传说中的动态数组,它提供了如下一些好处:
1.动态的增加和减少元素
2.实现了ICollection和IList接口
3.灵活的设置数组的大小
#着重说一下ArrayList最佳使用建议 (1)ArrayList内部封装了一个Object类型的数组,对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作 (2)数组扩容 这是对ArrayList效率影响比较大的一个因素。 每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

     1:比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:
16*2*2*2*2 = 256
四次的扩容才会满足最终的要求,那么如果一开始就以:
ArrayList List = new ArrayList( 210 );
的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。

 2:预计有30个元素而创建了一个ArrayList
ArrayList List = new ArrayList(30);
在执行过程中,加入了31个元素,那么数组会扩充到60个元素的大小,
而这时候不会有新的元素再增加进来,而且有没有调用TrimSize方法,
那么就有1次扩容的操作,并且浪费了29个元素大小的空间。如果这时候,用:
ArrayList List = new ArrayList(40);
那么一切都解决了。
所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。