[面试原题]
[题目一] Java集合框架是什么?说出一些集合框架的优点?
[正确答案]
每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
(3)通过使用JDK附带的集合类,可以降低代码维护成本。
(4)复用性和可操作性。
[题目二] 集合框架中引用泛型有什么优点?
[正确答案]
Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。
[题目三] Java集合框架的基础接口有哪些请叙述一下?
[正确答案]
Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。
Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。
Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。
[题目四] Iterator 是什么?
[正确答案]
一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。
[题目五] Iterator与ListIterator有什么区别?
[正确答案]
1. Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
2. Iterator只能正向遍历集合,适用于获取移除元素。ListIerator继承Iterator,可以双向列表的遍历,同样支持元素的修改。比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
[题目六] HashMap和Hashtable的区别?
[正确答案]
都属于Map接口的类,实现了将惟一键映射到特定的值上。
1.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
2.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
3.值:
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。
4.效率:
Hashtable 比HashMap 慢,因为它是同步的。
怎样使HashMap同步
HashMap可以通过Mapm = Collections.synchronizedMap(hashMap)来达到同步的效果。
[题目七] ArrayList和Vector的区别?
[正确答案]
博为峰小博老师:
ArrayList与Vector主要从二方面来说.
1.同步性:
Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
2.操作:
由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。
3.数据增长:
ArrayList和Vector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayList和Vector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。
Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。
Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。
[题目八] LinkedList与ArrayList有什么区别?
[正确答案]
博为峰小博老师:
两者都实现的是List接口,不同之处在于:
(1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。
(2)、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端
(3)、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据
附加:
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(newLinkedList(…));
[题目九] 数组(Array)和列表集合(ArrayList)有什么区别?
[正确答案]
博为峰小博老师:
下面列出了Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
[题目十] HashSet和TreeSet有什么区别?
[正确答案]
博为峰小博老师:
HashSet有以下特点:
A. 无序(不能保证元素的排列顺序,顺序有可能发生变化)
B. 不同步
C. 允许空值(集合元素可以是null,可以放入多个null,但会自动覆盖)
当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。
TreeSet有以下特点:
A. 有序
1. TreeSet是由一个树形的结构来实现的(数据结构是二叉树),它里面元素是有序的
2.TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态,支持两种排序方式,自然排序和定制排序。其中自然排序为默认的排序方式;定制排序,TreeSet中的对象元素需要实Comparable接口TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取。
B. 不允许空值
1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个有序性.
3.TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取
4. HashSet是基于hash算法实现的,性能优于TreeSet,通常使用HashSet。在我们需要对其中元素排序的时候才使用TreeSet。