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

[面试原题]

[题目一]  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可以通过Map m = 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(new LinkedList(…));

[题目九]  数组(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。

转载于:https://my.oschina.net/u/2971691/blog/775810

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值