Java集合面试

最近,想换个工作,可是我把找工作想的太简单了,主要原因还是自己基础知识不到位,而且毫无准备的去面试,结果自信心收到打击。
想先准备半月之后再去面试。
今天准备集合类的知识:

//集合类之间的关系:
Collection
|---list
|       |--LinkedList
|       |--ArrayList
|       |--Vector
|             |-Stack
|---Set
|---Queue

Map
|--Hashtable
|    |---Properties
|--HasMap
|    |---LinkedHashMap  
|--WeakHashMap  
|--EnumMap
|--IdenttityHashMap
|--StoredMap
|    |---TreeMap

Linked 、Array、Hash的区别
Linked 修改快、查询慢
Array 修改慢、查询快
Hash 两者之间

《Collection 》:中set接口是无序、不允许重复,list接口,有序,可以有重复元素。
set 和List的区别:
set:检索元素效率低下,删除和插入效率高,因为删除和插入不会影响其他元素位置的改变。
list:和数组类似,list可以动态增长,查找元素效率高,插入和删除元素效率第,应为删除和插入会引起其他元素位置的变化。
1>set接口继承了Collection接口,而且在集合中不允许有重复项存在,所有的原始方法都是现成的,没有引入新的方法,具体的set实现类依赖添加的对象的equals的方法来检查等同性。
集合框架支持Set接口两种普通的实现,HashSet和Treeset。
1、通常用Hashset来存储重复自由的集合,可以实现去重的效果,考虑到效率,添加到Hashset的对象需要采用恰单的分配散列码的方式,来实现HashCode的方法,所以当要创建要添加到Hashset集合的类是,必须覆盖HashCode的方法。。
2、当需要从集合中有序的方式抽取元素时,用Treeset会很好用,所以放到Treeset集合中的元素必须是可以排序的,离去TreeSet set = New TreeSet();add(9),add(‘a’),add(4),add(3),println(set)时。会抛出java.lang.Integer cannot be cast to java.lang.String的异常。
2>list接口继承了Collection接口以定义一个允许重复的有序集合,该接口不但可以对列表的一部分进行处理,还添加了面向位置的操作。list接口还提供了特殊的迭代器,称为ListItertator,除了允许Iterrator接口的正向操作外,该迭代器还允许元素的插入和替换,以及双向访问,还提供了指定列中指定位置开始的类表迭代器。
注意:Collections是集合类。
set和List的对比,set的检索效率低,删除和插入元素的效率高。而list则是与数组类似,可以动态增长元,查找元素的效率高,删除和插入的效率第低,应为会引起其他元素额位置的变化。
set和list的具体实现类,
set–>HashSet:以哈希表的形式存放元素,插入和删除的速度比较快。
list–>ArrayList动态数据组,–>LinkList:链表、队列、堆栈。
Array和java.utill.Vector的区别:Vector是一种老的动态数组,是线程同步的,但是效率比较低,一般不建议使用。

《Map》
Map接口不是Collection接口的继承。而是自己维护键-值关联的接口层次入手。按定义,该接口描述了从不重复的键到值得映射关系。
我们可以这样理解:接Map接口分为三部分,改变、查询、和提供可选视图。
其中改变操作:允许你从映射中添加或者删除键-值对,键和值都可以为NULL,当时不允许把Map作为键或值添加给自身。
public set keySet():因为在映射中键的集合必须是唯一的,用set支持。
public Collection value():因为在映射中值得集合可能不唯一,用collection支持,
public Set entrySet() 方法返回一个实现Map.Entry接口的元素
sSet
Map.entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键-值对。通过迭代Map.Entry,可以获得Map中每一个条目的将或值,并对值进行修改。但是如果底层Map在Map.Entry接口的setValue()方法外部被修改,,词条目集就会变得无效。便导致迭代器的行为未定义。

HashMap和TreeMap
“集合框架”提供了两种Map的实现,HashMap和TreeMap和其他所有的具体实现一样,具体用哪个实现,得根据实际情况而定。
如果想要在Map中插入、删除和定位元素,则HashMap是最好的选择。
如果要顺序遍历键,则使用TreeMap更好。
面试中常被问到的问题:
1、什么事Java集合的API
java集合的框架API是用来表示和操作集合的统一的框架,它包含接口、实现类、以及帮助程序员完成一系列编程的算法。总之,API在上层完成的事情:
《1》编程更加省力,提高编程的速度和代码质量。
《2》非关联API提高互操作性能。
《3》节省学习使用新API成本。
《4》节省设计新API的时间。
《5》鼓励、促进软件的重用。
2、什么是Iterator
一些集合类提供遍历集合内容的功能。通过java.util.Iterator接口允许遍历对象的集合,一次操作每个元素对象。在获得Iterator时候包含了一个集合的快照,所以遍历集合时候一般不建议修改集合本身。
3、Iterator和ListIterator的区别
Iterrator只能正向遍历集合,并对集合进行适用于获取移除元素。而LListIterator继承与Iterator,可以双向遍历列表,并同样支持元素的修改。
4、HashMap和Map的区别
Map是接口,是java集合中的一部分用于存储键值对,而HashMap是Map借口的一个实现,是哟个哈希算法来实现的一个Map类
5、HashMap和HashTable的区别
tam两者都是key-value的方式来获取数据,HashTable是是原始的集合类之一(也成为遗留类),而HashMap是新集合框架的一部分,从java2的1.2版本中才加入的。他们之间有以下的区别:
O、HashMap和HashTable大致相同除了同步和非空值,HashMap允许NULL作为Key和Value值,二HashTable不允许。HashMap不是同步的,而HashTanle是同步的
O、HashMap有个子类LinkedHashMap,如果想预知顺序迭代(默认为按照插入顺序),HashMap可以很轻松的置换为HashMap,而HashTable则没有那么简单。
O、HashMap采用时快速失败机制。HashTable则不是。
6、HashTable上下文同步是什么意思:
HasnTable是线程安全的,意味着在某个时间点,只能有一个线程去修改哈希表,任何线程在修改哈希表之前都要获取到对象所,其他线程将等待所得释放。
7、什么叫做快速失败特性
从高级别层次来说,快速失败特性是系统设计或者软件对其故障做出的响应。一个快速失败系统的设计是用来及时报告可能会导致失败的任何故障情况,它通常会停止正操的操作,而不是继续尝试有可能有缺陷的工作。当有问题发生时,开速失败系统会及时的发出错误警告。在Java中,快速失败系统与Iterator有关。如果一个Iterator在集合对象上创建了,其他线程想“结构化”的修改该集合对象,会发生修改异常。
8如何实现HashMap的线程同步
用Collections工具类。Map map =Collections.synchronizedMap(HashMap)可以到到同步的效果。
9、什么时候用HashMap和HashTable
有多线程访问相同实例的的可能时,用HashTable,反之则用HashMap,非线程安全的数据结构有更好的系统性能。若有需求需要顺序获取键值对的方案是,用HashMap是一个不错的选择。因为很方便的可以把LinkedHashMap替换成HashMap,而HashTable就没那么简单,如果有多线程访问同一个对象,可以用Collections.SynchronizedMap()来实现线程安全,总之用HashMap更为灵活。
10、为什么Vector未被认为是废弃后或者是非官方的不推荐使用?
或者收我们以一直用ArrayList而不用Vector。
应为大多数默认情况下是非同步访问,而Vector同步了每一个方法。可以使用Collections。SynchronizedList来实现List的同步。Vector还有一些遗留的方法在枚举和元素的获取方法上和List有一些不同。尽管枚举的速度很快,但是他们不能检查集合在迭代是被修改了,这将会导致问题。尽管有问题,但是Oracle还是没有废弃他。

你可能感兴趣的:(Java集合面试)