02-java集合面经必威体育精装版面试题.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
集合 你了解java集合吗? 集合分为单列集合(collection)和双列集合(map)。单列集合又包括List(可重复)和Set(不可重复),List分为ArrayList和LinkedList,Set分为HashSet和TreeSet。双列集合Map分为TreeMap和HashMap。 单列集合是实现Iterable接口产成的对象,支持迭代器和增强for。 1.2、你了解迭代器吗?说说迭代器。 从两方面来说,从底层原理上来说是大同小异的,底层通过hasnext()方法判断当前当前指向是否有元素,而指针一开始就会指向第一个元素。如果有,就会再执行next()方法,取出当前游标,并向后移一位;如果hasnext()方法返回为null,就说明不存在下一个元素,就会迭代结束。针对不同集合,会有一些细节不同,(比如HashMap就要考虑到红黑树里的取出顺序)。再底层则是采用C语言的指针原理。 在应用层面上,迭代器就是用来遍历的。所有的单列集合都可以使用迭代器,因为他们都继承了Iterable接口,这个接口里的Iterator方法可以返回一个Iterator对象,这个Iterator对象就是迭代器对象,底层针对不同类型的集合都写了不同的实现类,所以集合可以直接使用迭代器进行遍历查询。这种只需要提供一种方法(iterator方法)访问一个容器对象中各个元素,而又不暴露该对象的内部细节的方式就是迭代器设计模式。 但要注意的是,如果用的是直接使用增强for和用迭代器方式(iterator)是不一样的,后者可以直接修改、删除原数据,但增强for是引用了一个第三方变量进行遍历,只适合单纯遍历。 1.3、但是iterator是自动取下一个,如果需要倒着遍历怎么办? List集合可以使用迭代器倒着遍历,ListIterator有previous()方法和hasprevious()方法,可以自动指向并取出上一个元素。Set集合不能用迭代器倒着遍历,但可以根据它的大小顺序倒着取出。 1.4、使用foreach、iterator、for在有什么区别?效率上哪个更高? 区别上: 普通for循环一般用来处理比较简单的有序的,可预知大小的集合或数组. foreach可用于遍历任何集合或数组,而且操作简单易懂,唯一的不好就是需要了解集合内部类型,它的底层有函数式编程注解?@FunctionalInterface,也就是说它可以进行Lamda形式简写。 iterator是最强大的,他可以随时修改或者删除集合内部的元素,并且是在不需要知道元素和集合的类 型的情况下进行的,当你需要对不同的容器实现同样的遍历方式时,迭代器是最好的选择! 至于增强for和iterator其实是一样的,增强for编译后的.class文件中,就是iterator,所以二者除了写法是用第三方参数来表示,效率上没有任何区别。 效率上: 这个需要多方考虑,比如普通for循环用在数组是遍历最快的,它是直接获取数据,但普通for不能用在不知道长度的集合中,这就需要用iterator或者foreach,相对来说,iterator效率会高于foreach,因为foreach在访问过程中产生一个额外的Enumerator对象,这个对象会进行版本检查处理,所以它是线安全的。 对于ArrayList来说,它是通过一个数组实现的,可以随机存取;但是LinkedList是通过链表实现的,当要遍历依个取出时,for循环时要取的每个元素都必须从头开始遍历,而iterator遍历则从头开始,边遍历边取,取完只需要一次遍历,所以for循环需要的时间远远超过for循环。? 对于数组来说,for和foreach循环效率差不多,但是对于链表来说,for循环效率明显比foreach低。 你了解ArrayList和LinkedList的底层原理吗? 首先,List集合是有序集合,即存取有序,List集合的特点是存取顺序一致,存储元素可重复,都有索引。 ArrayList的底层是数组,一个索引对应一个元素,所以查询速度快;但是在增删时,需要调整整组数据的移动,所以增删较慢。 而LinkedList的底层是双向链表,每次查询时都要从两头开始查询(离头近就从头查,离尾近就从尾查),所以查询较慢;但是增删时,只需要将链表头结点和尾结点指向新插入的结点即可,所以增删速度较快。 但如果是新增的数据量较大的情况下,ArrayList的新增效率反面比LinkedList的效率更高。因为ArrayListr底层数组的扩容是1.5倍,数据量越大,扩容的速度就越快,而链表仍需一个个断开链接和重续新链接。 最后,jdk8版还对ArrayList做了懒加载优化,在之前是构造ArrayList时就默认开辟10个空间,jdk8之后变成了只有放入第1个元素时,才

文档评论(0)

188****0747 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档