Java基础知识(容器)

说明:其中内容摘自:《Java程序员面试宝典》,这里仅供学习使用。(P133)

 1. Java Collections框架是什么?

Java collection框架中提供了List,Queue,Set,Stack和Map等数据结构。其中List,Queue,Set和Stack都继承Collection接口。

  • Set表示数学意义上的集合。主要特点为元素不能重复,因此存入Set的每个元素都必须定义equals方法来确保对象的唯一性。它有两个实现类,HashSetTreeSet,其中TreeSet实现了SortedSet接口,因此它是有序的。
  • List称为列表有序),它按照对象进入的顺序保存对象,所以它能对列表中的每个元素的插入和删除位置进行精确的控制。同时可以保存重复对象LinkedListArrayListVector都实现了该接口。
  • Map提供一种键值对的映射。保存键值对时,值可以重复,但key不能。实现它的类有HashMapTreeMapLinkedHashMapWeakHashMapIdentifyHashMap等。但他们的效率不一样,HashMap是基于散列表实现了,采用对象的HashCode可以快速的查询,LinkedHashMap采用列表维护内部的顺序,TreeMap基于红黑树实现,内部元素按需排列。

2. 什么是迭代器?

迭代器(Iterator)是一个对象,他可以在不了解容器底层结构的基础上,对容器实现遍历和选择,由于创建迭代器的代价小,因此迭代器通常被称为轻量级的容器

使用迭代器的注意事项:

  • 容器的iterator()方法返回一个Iterator,然后通过Iterator的next()方法返回第一个元素。
  • 使用Iterator的hasNext()方法判断容器中是否还有元素,如果有,可以使用next()方法获取下一个元素。
  • 可以使用remove()方法删除迭代器返回的元素。

关于ConcurrentModificationException异常,这是由于在使用Iterator遍历容器的同时又对容器做增加和删除操作导致的,或者是由于多线程操作导致的,当一个线程使用迭代器遍历容器的同时,另外的线程对这个容器进行增加和删除操作。

出现ConcurrentModificationException异常的原因是,当容器调用iterator方法返回一个Iterator对象时,把容器包含对象的个数赋值给一个变量expectedModCount,在调用next方法时,会比较该变量和容器中实际的对象个数,如果不相等则会抛出这个异常。

  • 如果是单线程导致的这个异常:如果要在遍历集合的同时删除对象,则可以将要删除的对象先放到另一个集合中,遍历结束之后,调用removeAll方法进行删除。
  • 如果是多线程导致了这个异常:使用ConcurrentHashMap和CopyOnWriteArrayList等线程安全的容器。使用synchronized代码块,但有可能会影响性能。

Iterator和ListIterator有什么区别?

Iterator只能正向遍历集合,适用于获取移除元素。ListIterator继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改。

3. ArrayList,Vector,LinkedList有什么区别?

ArrayListVectorLinkedList都是可动态伸缩的数组。

  • ArrayListVector都是基于Object[] array实现的,他们在内存中开辟一块连续的空间来存储,由于数据是连续的,因此可以使用序号或者下标来访问这些元素,同时索引数据的速度很快。但在插入元素时需要移动之后的所有元素,所以执行比较慢
  • 同时,ArrayList和Vector都有一个初始化的容量大小,当需要扩充时,vector默认扩充为原来的2倍(可以设置),ArrayList默认扩充为原来的1.5倍(不能设置)。
  • ArrayList和Vector之间最大的区别就是synchronization的使用,ArrayList不支持同步,线程不安全Vector线程安全。因此Vector的效率要低于ArrayList。
  • LinkedList是采用双向列表实现的,对数据的索引需要从列表头开始遍历,因此随机访问的效率较低,但插入元素时不需要移动元素,因此插入效率较高。他也是线程不安全的容器。

使用总结:

  • 对数据主要是索引或者在集合末端增加,删除元素时,使用ArrayList或Vector。
  • 对数据主要是在指定的位置插入或删除操作时,使用LinkedList。
  • 当多线程环境时,选用Vector线程安全。

4. HashMap,HashTable,TreeMap和WeakHashMap的区别?

HashMap根据key的HashCode存储数据,根据key可以直接获取对应的值。HashMap和HashTable都采用了hash法进行索引,因此二者具有很多相似之处,但具有如下区别:

  • HashMap线程不安全,HashTable线程安全,因此HashMap的效率高于HashTable。
  • HashMap允许null的key,但最多只允许一条,HashTable则不允许null的key
  • HashTable继承自Dictionary类,而HashMap是Map接口的实现类。
  • HashTable遍历使用Enumeration,HashMap使用Iterator。
  • HashMap和HashTable使用的hash/rehash算法几乎一模一样,性能上没有太大差异。
  • HashTable中,hash的数组默认大小是11,增加的方式为oldx2 + 1。HashMap中hash数组的默认大小为16,一定是2的倍数。

HashMap中是数据没有顺序TreeMap中的元素是经过排序后的顺序LinkedHashMap有顺序,输出的顺序和输入的顺序相同。

WeakHashMap使用的是弱引用模式,只要当WeakHashMap中的key不在被外部引用,它就可以被GC回收。而HashMap使用的强引用模式,当HashMap中的key没有被外部引用,且被HashMap删除之后,才能被GC回收。

如何实现HashMap的同步?

使用Map m = Collections.synchronizedMap(new HashMap()),来实现。

5. 使用自定义对象作为HashMap或HashTable中的元素时,需要注意哪些方面?

  • 如果需要根据对象的相关属性在自定义对象是否相等的逻辑,此时需要重写equals方法,同时重写hashCode方法。
  • 当自定义类的多项作为HashMap、HashTable的key时,最好将其定义为不可变类。

6. Collection和Collections有什么区别?

  • Collection是一个集合,它提供了对集合基本操作的通用接口方法。
  • Collections为一个操作集合的帮助类,提供一系列静态的方法实现对集合的搜索、排序、线程安全化等操作。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值