请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

大公司喜欢问的Java集合类面试题

[复制链接]
查看: 43|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46392
发表于 2019-11-9 17:53 | 显示全部楼层 |阅读模式



  • Collection


  1. Collection是底子的聚集接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection答应类似的元素而另一些不成。一些能排序而另一些不成。Java SDK不供给间接继续自Collection的类,Java SDK供给的类都是继续自Collection的“子接口”如List和Set。全数实现Collection接口的类都必须供给两个标准的机关函数:无参数的机关函数用于建立一个空的Collection,有一个Collection参数的机关函数用于建立一个新的Collection,这个新的Collection与传入的Collection有类似的元素。后一个机关函数答利用户复制一个Collection。固然返回的是boolean,但不是表现增加乐成与否,这个返回值表现的意义是add()实行后,聚集的内容能否改变了(就是元素的数目、位置等有无变革)。类似的addAll,remove,removeAll,remainAll也是一样的。
复制代码
用Iterator形式实现遍历聚集
  1. Collection有一个垂危的方式:iterator(),返回一个Iterator(迭代器),用于遍历聚集的全数元素。Iterator形式可以把拜候逻辑从差此外聚集类中笼统出来,从而禁止向客户端袒露聚集的内部结构。典型的用法以下:Iterator it = collection.iterator(); // 获得一个迭代器while(it.hasNext()) {Object obj = it.next(); // 获得下一个元素}不需要保护遍历聚集的“指针”,全数的内部状态都由Iterator来保护,而这个Iterator由聚集类经过工场方式天生。每一种聚集类返回的Iterator具体典范大要不同,但它们都实现了Iterator接口,是以,我们不需要关心究竟是哪类Iterator,它只需要获得这个Iterator接口即可,这就是接口的优点,面向工具的能力。要确保遍历进程顺遂完成,必须保证遍历进程中不变动聚集的内容(Iterator的remove()方式除外),所以,确保遍历牢靠的原则是:只在一个线程中利用这个聚集,大要在多线程中对遍历代码举行同步。由Collection接口派生的两个接口是List和Set。
复制代码



  • List接口


  1. List是有序的Collection,利用此接口可以也许正确的控制每个元素插入的位置。用户可以也许利用索引(元素在List中的位置,类似于数组下标)来拜候List中的元素,这类似于Java的数组。和下面要提到的Set不同,List答应有类似的元素。除了具有Collection接口必备的iterator()方式外,List还供给一个listIterator()方式,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方式,答应增加,删除,设定元素,还能向前或向后遍历。实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
复制代码

  • LinkedList类
  1. LinkedList实现了List接口,答应null元素。此外LinkedList供给额外的get,remove,insert方式在LinkedList的首部或尾部。这些操纵使LinkedList可被用作仓库(stack),行列(queue)或双向行列(deque)。
复制代码
留意:LinkedList没有同步方式。假如多个线程同时拜候一个List,则必须自己实现拜候同步。一种治理方式是在建立List机会关一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));


  • ArrayList类
  1. ArrayList实现了可变巨细的数组。它答应全数元素,包含null。ArrayList没有同步。size,isEmpty,get,set方式运转时候为常数。可是add方式开销为分摊的常数,增加n个元素需要O(n)的时候。其他的方式运转时候为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的巨细。这个容量可随着不停增加新元素而自动增加,可是增加算法并没有界说。当需要插入大量元素时,在插入前可以挪用ensureCapacity方式来增加ArrayList的容量以进步插入服从。和LinkedList一样,ArrayList也黑白同步的(unsynchronized)。
复制代码

  • Vector类
  1. Vector很是类似ArrayList,可是Vector是同步的。由Vector建立的Iterator,固然和ArrayList建立的Iterator是同一接口,可是,由于Vector是同步的,当一个Iterator被建立而且正在被利用,另一个线程改变了Vector的状态(例如,增加或删除了一些元素),这时挪用Iterator的方式时将抛出ConcurrentModificationException,是以必须捕捉该很是。
复制代码

  • Stack 类
  1. Stack继续自Vector,实现一个落后先出的仓库。Stack供给5个额外的方式使得Vector得以被看成仓库利用。底子的push和pop方式,还有peek方式获得栈顶的元素,empty方式测试仓库能否为空,search方式检测一个元素在仓库中的位置。Stack刚建立后是空栈。
复制代码



  • Set接口


  1. Set是一种不包含反复的元素的Collection,即尽情的两个元素e1和e2都有e1.equals(e2)=false,Set多有一个null元素。很明显,Set的机关函数有一个约束条件,传入的Collection参数不能包含反复的元素。请留意:必须鉴戒操纵可变工具(Mutable Object)。假如一个Set中的可变元素改变了本身状态致使Object.equals(Object)=true将致使一些题目。
复制代码



  • Map接口


  1. 请留意,Map没有继续Collection接口,Map供给key到value的映照。一个Map中不能包含类似的key,每个key只能映照一个value。Map接口供给3种聚集的视图,Map的内容可以被看成一组key聚集,一组value聚集,大要一组key-value映照。
复制代码

  • Hashtable类
  1. Hashtable继续Map接口,实现一个key-value映照的哈希表。任何非空(non-null)的工具都可作为key大要value。增加数据利用put(key, value),取出数据利用get(key),这两个底子操纵的时候开销为常数。Hashtable经过initial capacity和load factor两个参数调解性能。凡是缺省的load factor 0.75较好地实现了时候和空间的平衡。增大load factor可以节省空间但响应的查找时候将增大,这会影响像get和put这样的操纵。利用Hashtable的简单示例以下,将1,2,3放到Hashtable中,他们的key别离是”one”,”two”,”three”:Hashtable numbers = new Hashtable();numbers.put(“one”, new Integer(1));numbers.put(“two”, new Integer(2));numbers.put(“three”, new Integer(3));要取出一个数,比如2,用响应的key:Integer n = (Integer)numbers.get(“two”);System.out.println(“two = ” + n);由于作为key的工具将经过盘算其散列函数来肯定与之对应的value的位置,是以任何作为key的工具都必须实现hashCode和equals方式。hashCode和equals方式继续自根类Object,假如你用自界说的类看成key的话,要相当鉴戒,依照散列函数的界说,假如两个工具类似,即obj1.equals(obj2)=true,则它们的hashCode必须类似,但假如两个工具不同,则它们的hashCode不愿定不同,假如两个不同工具的hashCode类似,这类现象称为辩说,辩说会致使操纵哈希表的时候开销增大,所以尽管界说好的hashCode()方式,能加速哈希表的操纵假如类似的工具有差此外hashCode,对哈希表的操纵会出现意想不到的结果(期待的get方式返回null),要禁止这类题目,只需要服膺一条:要同时复写equals方式和hashCode方式,而不要只写其中一个。Hashtable是同步的。
复制代码

  • HashMap类
  1. HashMap和Hashtable类似,不同之处在于HashMap黑白同步的,而且答应null,即null value和null key。,可是将HashMap视为Collection时(values()方式可返回Collection),其迭代器操纵时候开销和HashMap的容量成比例。是以,假如迭代操纵的性能相当垂危的话,不要将HashMap的初始化容量设得太高,大要load factor太低。
复制代码

  • WeakHashMap类
  1. WeakHashMap是一种改良的HashMap,它对key尝试“弱援用”,假如一个key不再被内部所援用,那末该key可以被GC采取。
复制代码
总结
  1. 假如触及到仓库,行列等操纵,应当考虑用List,对于需要快速插入,删除元素,应当利用LinkedList,假如需要快速随机拜候元素,应当利用ArrayList。假如步伐在单线程情况中,大要拜候仅仅在一个线程及第行,考虑非同步的类,其服从较高,假如多个线程大要同时操纵一个类,应当利用同步的类。要特别留意对哈希表的操纵,作为key的工具要切确复写equals和hashCode方式。尽管返回接口而非现实的典范,如返回List而非ArrayList,这样假如今后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对笼统编程。
复制代码
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表