博为峰Java面试题-Java集合类1

时间:2022-09-03 00:27:03

[面试原题]


[题目一] Java集合框架是什么?说出一些集合框架的优点?


[正确答案]

博为峰Java面试题-Java集合类1

博为峰小博老师:

每种编程语言中都有集合,最初的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。