关于ArrayList的5道面试题
2015-09-25 14:20
435 查看
1、ArrayList
的大小是如何自动增加的?
在ArrayList中增加一个对象的时候,Java会去检查
ArrayList,以确保已存在的数组中有足够的容量来存储这个新的对象。如果没有足够的容量,那么就会新建一个长度更长的数组,旧的数组会被使用
Arrays.copyOf方法被复制到新的数组中去,现有的数组引用指向了新的数组。
//ArrayList Add方法: public boolean add(E e){ ensureCapacity(size+1); //Increment modCount!! elementData[size++] = e; return true; }
//ensureCapacity方法:处理ArrayList的大小 public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
新建了一个数组;旧数组的对象被复制到了新的数组中,并且现有的数组指向新的数组。
2、什么情况下你会使用ArrayList
?什么时候你会选择LinkedList
?
当你遇到访问元素比插入或者是删除元素更加频繁的时候,你应该使用ArrayList。另一方面,当你在某个特别的索引中,插入或者是删除元素更加频繁,或者你压根就不需要访问元素的时候,你会选择
LinkedList。主要原因是,在
ArrayList中访问元素的最糟糕的时间复杂度是”1″,而在
LinkedList中可能就是”n”了。在
ArrayList中增加或者删除某个元素,通常会调用
System.arraycopy方法,这是一种极为消耗资源的操作,因此,在频繁的插入或者是删除元素的情况下,
LinkedList的性能会更加好一点。
3、当传递ArrayList
到某个方法中,或者某个方法返回ArrayList
,什么时候要考虑安全隐患?如何修复安全违规这个问题呢?
当array被当做参数传递到某个方法中,如果array在没有被复制的情况下直接被分配给了成员变量,那么就可能发生这种情况,即当原始的数组被调用的方法改变的时候,传递到这个方法中的数组也会改变。下面的这段代码展示的就是安全违规以及如何修复这个问题。ArrayList被直接赋给成员变量——安全隐患:
修复这个安全隐患:
4、如何复制某个ArrayList
到另一个ArrayList
中去?写出你的代码?
下面就是把某个ArrayList复制到另一个
ArrayList中去的几种技术:
使用
clone()方法,比如
ArrayList newArray = oldArray.clone();
使用
ArrayList构造方法,比如:
ArrayList myObject = new ArrayList(myTempObject);
使用Collection的copy方法。
注意1和2是浅拷贝(shallow copy)。
5、在索引中ArrayList
的增加或者删除某个对象的运行过程?效率很低吗?解释一下为什么?
在ArrayList中增加或者是删除元素,要调用
System.arraycopy这种效率很低的操作,如果遇到了需要频繁插入或者是删除的时候,你可以选择其他的Java集合,比如
LinkedList。看一下下面的代码:
在ArrayList的某个索引i处添加元素:
删除ArrayList的某个索引i处的元素:
相关文章推荐
- 黑马程序员—java技术blog—第七篇集合整体基础框架概述
- 黑马程序员---java基础----String类
- 【.Net码农】List<T> 类
- [.Net码农].Net中的json操作类
- 黑马程序员---java高新技术----反射技术
- 黑马程序员—java技术blog—第六篇面向对象_多态概述及基础应用
- 程序员必备技能与习惯
- LeetCode解题报告--Generate Parentheses
- 黑马程序员---java基础---网易编程
- 黑马程序员————java实现快速排序
- 黑马程序员—java技术blog—第五篇面向对象_继承概述及基础应用
- android常见面试题与我自己的回答 (三)
- 黑马程序员_JAVA获取网页源代码
- 黑马程序员————java实现冒泡排序
- 10个C#程序员经常用到的实用代码片段
- 黑马程序员---java基础---多线程
- 面试---指针和引用的区别
- 黑马程序员---java基础---IO流总结
- 程序员必备技能与习惯
- Java基础知识强化81:Math类random()方法之获取任意范围的随机数案例(面试题)