关于ArrayList的5道面试题

我以面试官的身份参加过很多Java的面试,以下是五个比较有技巧的问题,我发现有些初级到中级的Java研发人员在这些问题上没有完全弄明白,似懂非懂。所以我写了一篇相关的文章,帮助初级Java研发人员弄清楚这些问题。文章列举了和Java ArrayList相关的5个比较具有迷惑性的问题,我相信如果面试者能够很好的回答出这些问题,那么在面试的时候你一定能够得到不错的分数。如果你同意我的看法,或者除了下面的问题,你还有其他比较好的问题,那么就请联系我吧。

1、ArrayList的大小是如何自动增加的?你能分享一下你的代码吗?

这是最有技巧性的的一个问题,大多数人都无法回答。事实上,当有人试图在arraylist中增加一个对象的时候,Java会去检查arraylist,以确保已存在的数组中有足够的容量来存储这个新的对象。如果没有足够容量的话,那么就会新建一个长度更长的数组,旧的数组就会使用Arrays.copyOf方法被复制到新的数组中去,现有的数组引用指向了新的数组。看如下的代码段(摘自GrepCode.com中的Java ArrayList Code):

//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;//每次扩容,增大50%
    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中去的几种技术:

  1. 使用clone()方法,比如ArrayList newArray = oldArray.clone();
  2. 使用ArrayList构造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
  3. 使用Collection的copy方法。

注意1和2是浅拷贝(shallow copy)。

5、在索引中ArrayList的增加或者删除某个对象的运行过程?效率很低吗?解释一下为什么?

在ArrayList中增加或者是删除元素,要调用System.arraycopy这种效率很低的操作,如果遇到了需要频繁插入或者是删除的时候,你可以选择其他的Java集合,比如LinkedList。看一下下面的代码:

在ArrayList的某个索引i处添加元素:

删除ArrayList的某个索引i处的元素:

原文链接: vitalflux 翻译: ImportNew.com kobekillerjun
译文链接: http://www.importnew.com/9928.html

 

时间: 2024-09-17 04:41:08

关于ArrayList的5道面试题的相关文章

c 面试题 面试-C 语言几道面试题,请教一下高手们

问题描述 C 语言几道面试题,请教一下高手们 判断题1.声明函数int fun(int a[10]);则a表示一维数组变量名. 判断题 2.char *p = "hello", char str[] = "hello";表示指针变量 p和str 都指向文字常量"hello". 问答题: 以下程序是否有误,如果无误,请写出执行次数(1 ). int x = -1; do{ x = x * x; }while(!x); 有点不确定,发上请教一下!!!

海量数据处理:十道面试题与十个海量数据处理方法总结

海量数据处理:十道面试题与十个海量数据处理方法总结 作者:July.youwang.yanxionglu. 时间:二零一一年三月二十六日 本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题.有任何问题,欢迎随时交流.指正. 出处:http://blog.csdn.net/v_JULY_v.   第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP.       首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位

想去机器学习初创公司做数据科学家?这里有最常问的40道面试题

导读   想去机器学习初创公司做数据科学家?这些问题值得你三思! 机器学习和数据科学被看作是下一次工业革命的驱动器.这也意味着有许许多多令人激动的初创公司正在起步成长.寻找专业人士和数据科学家.它们可能是未来的特斯拉.谷歌. 对于有职业抱负的你来说,看好一家好的创业公司团队后,如何能够脱颖而出,进入一家靠谱的创业团队呢? 想得到这样的工作并不容易.首先你要强烈认同那个公司的理念.团队和愿景.同时你可能会遇到一些很难的技术问题.而这些问题则取决于公司的业务.他们是咨询公司?他们是做机器学习产品的?

挑战4道Java试题_java

四道Java基础题,你能对几道? 一.==符的使用首先看一段比较有意思的代码 Integer a = 1000,b=1000; Integer c = 100,d=100; public void mRun(final String name){ new Runnable() { public void run() { System.out.println(name); } }; } System.out.println(a==b); System.out.println(c==d); 如果这道

戴尔的27道面试题

戴尔的面试从问有答案的问题,其内在的制胜文化只要求验证应聘者的回答是否说明他是一个适合戴尔的人. 文/张从忠,跨国公司高级培训师 戴尔公司有一条招聘经验:在新招来的员工中,5年后,大概只有30%的人能留下来:10年以后,大概只有10%的人能坚持到最后,被老板留下来成为核心员工.这些坚持下来的人,虽然不一定最优秀,但他们却一定是最能适应戴尔价值观的人:而且他们能为戴尔创造出最大的经济效益,节省出更多的成本:他们不但对戴尔的文化坚信不移,而且也是竞争对手无法用金钱挖走的. 因此,"人才不是越优秀越好

sql-一道面试题:关于SQL语句

问题描述 一道面试题:关于SQL语句 一个表中有多条字段其中有金额1,金额2字段.有多条数据,怎么求出每条数据中金额最大的记录呢?求各位大神帮忙! 解决方案 查询所有数据的金额,按照金额从大到小或者从小到大排序 反回一个集合,toarray转成数组,如果从大到小排序的话,取出第一个元素就行了,从小到大就取最后一个

string-一道面试题,求大神帮助

问题描述 一道面试题,求大神帮助 public class ceshi{ String str=new String("good"); public static void main(String[] args){ ceshi cs=new ceshi(); cs.change(cs.str); System.out.print(cs.str); } public void change(String str){ str="test ok"; } } 正确答案是输出

探讨Java中最常见的十道面试题

第一,谈谈final, finally, finalize的区别. final?修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定 初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行

几道面试题

面试者1:第一轮1. Implement a LinkedList that can add and delete nodes.第二轮2. Given a sorted integer array, remove duplicate items, return the count of distinct items.   面试者2:第一轮1.将一个整数转换成二进值数值后1的个数.例如0->00000000返回05->00000101返回22.压缩算法,将一个数组中重复的数字删除,并返回新数组的