原文: https://dzone.com/articles/to...
作者: Sonia Mathias
翻译: 祝坤荣
在Java中,集合是一种提供了存储与操作批量对象的框架。在JDK1.2中“集合框架”就被定义了,而且它提供了所有的集合类和接口。Java集合类中最主要的两个主要接口是Collection接口(java.util.Collection)和Map接口(java.util.Map)。Java集合框架提供的接口包括Set,List,Queue,Deque,提供类包括ArrayList,Vector,LinkedList,HashSet,PriorityQueue,TreeSet和LinkedHashSet。
需要一个分离的集合框架
如果我们不使用集合框架,标准的用于给Java对象分组的方法是Arrays,Vectors或者HashTable。他们都没有通用的接口。他们的实现都是被单独定义的且互相之间没有任何联系。因此,要去记住所有不同的方法,语法,和创建函数都很困难。
比如,如果要给Vector加一个元素我们会使用addElement()方法,而给Hashtable加一个元素则使用put()方法。
使用集合框架的好处
- 降低编程负担:一个开发者可以聚焦在集合的最佳使用方法上而不是聚焦在集合的设计上。这对实现抽象有好处。
- 提升编程速度:集合提供了一种数据结构的高性能实现,这可以提升速度。
- 由于Java已经是一种广泛使用的语言了,大大小小的组织都在使用它。为自己准备好基础的和高级的Java面试题可以对面试有好处。
让我们看看java面试中被问得最多的一些问题。
对初级开发者问的最多的问题
问题1:什么是Java中的框架?
答:框架是提供了脚手架功能的一组类和对象的集合。理想的面向对象设计都应该有一个框架提供了对于集合类的同类型任务提供同样的操作。
问题2:定义Java的集合框架。
答:Java的集合框架是一组接口和类的集合,提供了高效保存和处理数据的方法。Java集合框架提供的接口有Set,List,Queue,Deque,提供的类包括ArrayList,Vector,LinkedList,HashSet,PriorityQueue,TreeSet和LinkedHashSet。
问题3:Java集合框架中ArrayList与Vector的不同之处。
答:
ArrayList
- 不是synchronized的
- 它可以以其数组大小的50%来扩展其大小
- 它不是线程安全的
- 它不是遗留类
Vector: - 它是synchronized的
- 它可以增加自己双倍的大小
- 它是线程安全的
- 它是遗留类
- 问题4:Iterator与Enumeration的不同点。
答:
Iterator - 它可以遍历遗留类和非遗留类
- 它比Enumeration慢
- 它在遍历集合时可以执行remove操作
- 它是fail-fast的
Enumeration
- 它只能遍历遗留元素
- 它比Iterator快
- 它只能在集合上执行traverse
- 它不是fail-fast的
问题5:LinkedList与ArrayList的区别?
答:
ArrayList
- 这个类实现了list接口
- 这个类使用了动态数组来存储元素
- 插入与移除操作的最佳复杂度是O(1),而最差复杂度是O(n)。查询操作(如存储一个特定索引的元素)会需要O(1)的时间。
- ArrayList在存储和查询数据时能干的比较好。
LinkedList
- 这个类实现了list接口和deque接口。
- 这个类存储元素使用了双链列表。
- 插入与移除操作提供了O(1)的性能。查询操作(比如查询一个特定索引的元素)需要O(n)的时间。
- LinkedList在操作存储好的数据时性能更好。
- 问题6:解释一下Queue接口的poll()与remove()方法的不同。
答:两个方法都返回并移除队列头的内容。它们只有在队列为空时行为不一样;remove()会抛一个异常而poll()会返回null。
问题7:Comparable与Comparator的不同。
答:
Comparable
- 它提供了被排序元素使用的compareTo()方法
- 它属于java.lang包
- 排序逻辑必须要与我们想要排序的对象在同一个类中
- 它提供单独的排序序列。
- 实际类被改过了
Comparator
- 它提供排序元素用的compare()方法
- 它在java.util包中
- 排序逻辑必须要在不同的类中,以便根据不同对象的不同属性来编写排序方法
- 它提供多种排序序列
- 实际类没有被改动
问题8:计算机内存中Stack的定义是?
答:stack是计算机内存中一个特殊区域,用来存储函数创建的临时变量。在stack中,变量是在运行时被声明,存储和初始化的。
问题9:列出map接口的集合视图。
答:
集合视图(Collection view)方法可以让Map在以下
三种方式视为一个集合:
- 键集合视图:Map中保存的所有键的Set集合。
- 值集合视图:Map中保存的所有值的集合。这个集合不是一个Set,因为不同的主键key可以被映射到同一个值value。
- Entry集合视图:Map中键值对的集合Set。Map接口提供了一个小的内嵌接口Map.Entry,元素都存储在这个Set。
问题10:定义EnumSet。
答:它是可以使用enum枚举类型的Set实现。所有的元素都必须属于一个特定的enum类型。它不是synchronized。NULL key是不允许的。
问题11:什么方法能让集合变成线程安全的?
答:这些方法是:
- Collections.synchronizedList(list);
- Collections.synchronizedMap(map);
- Collections.synchronizedSet(set);
- 问题12:Queue与Deque的不同点
答:
Queue - 众所周知是单向队列
- 队列中的元素在填加或删除是都在同一端
- Less versatile
Deque - 是双端队列
- 队列中的元素可以从队尾填加或者从两端填加和删除。
- More versatile
问题13:hashmap与hashtable的不同
答:
Hashmap
- 不是synchronized,不是线程安全
- 继承了AbstractMap类
- 允许一个null key和多个null value。
- 可以被iterator遍历
Hashtable - Synchronized的,线程安全
- 继承了Dictionary类
- 不允许空key或者值
- 可以被enumerator和iterator遍历
问题14:定义Iterator。
答:Iterator()是一个提供了遍历集合方法的接口。它提供了一种普世的方式来遍历集合中的元素,并实现了iterator设计模式。
问题15:什么是navigable map?
答:NavigableMap接口,Java集合框架的成员,属于java.util包。它是SortedMap的子接口,提供了如lowerKey,floorKey,ceilingKey和higherKey这样方便的导航方法。它也提供了从现有map创建一个子map的方法。
问题16:什么是queue接口的peek()?
答:Peek()返回了队列的头。它不移除任何元素。当队列为空时返回null。
未完待续
本文来自祝坤荣(时序)的微信公众号「麦芽面包」,公众号id「darkjune_think」
开发者/科幻爱好者/硬核主机玩家/业余翻译
转载请注明。
微博:祝坤荣
B站: https://space.bilibili.com/23...
交流Email: [email protected]