二、容器
1. java 容器都有哪些?
List,Map,Set ,Collection ,List ,LinkedList ,ArrayList ,Vector ,Stack ,Set
Map ,Hashtable ,HashMap ,WeakHashMap
数据容器主要分为了两类:
Collection: 存放独立元素的序列。
Map:存放key-value型的元素对。(这对于需要利用key查找value的程序十分的重要!)
从类体系图中可以看出,Collection定义了Collection类型数据的最基本、最共性的功能接口,而List对该接口进行了拓展。
其中各个类的适用场景有很大的差别,在使用时,应该根据需要灵活的进行选择。此处介绍最为常用的四个容器:
LinkedList :其数据结构采用的是链表,此种结构的优势是删除和添加的效率很高,但随机访问元素时效率较ArrayList类低。
ArrayList:其数据结构采用的是线性表,此种结构的优势是访问和查询十分方便,但添加和删除的时候效率很低。
HashSet: Set类不允许其中存在重复的元素(集),无法添加一个重复的元素(Set中已经存在)。HashSet利用Hash函数进行了查询效率上的优化,其contain()方法经常被使用,以用于判断相关元素是否已经被添加过。
HashMap: 提供了key-value的键值对数据存储机制,可以十分方便的通过键值查找相应的元素,而且通过Hash散列机制,查找十分的方便。
2.Collection 和 Collections 有什么区别?
Collcetion是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。实现该接口的类主要有List和Set,该接口的设计目标是为各种具体的集合提供最大化的统一操作方式。
Collections是针对集合类的一个包装类,它提供了一系列的静态方法以实现对各种集合的搜索、排序、线程安全化等操作,其中大多数方法都是用来处理线性表。 Collections类不能实例化,如同一个工具类,服务于Collection
3.List、Set、Map 之间的区别是什么?
List的元素以线性的方式存储,可以存放重复的对象
Set的中的对象不按特定的方式排序,无序(实际上由HashCode决定),没有重复的对象
Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一个键对象和值对象
不能存放重复的对象
4.HashMap 和 Hashtable 有什么区别?
1,继承的父类不同
Hashtable继承的自dictionary类,而hashMap继承自abstractMap类。但是二者都实现了map接口。
2,线程安全性不同
Hashtable是线程安全的,它的每一个方法都加了一个Synchronize。
HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。
3.是否提供contains方法
hashMap把Hashtable中的contains方法去掉了,改成了containsValue和containsKey
Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同
4.key和value是否允许null值
hashMap和Hashtable中的对象,都不允许存在重复的key值,但是可以包含重复的value值
Hashtable中的,key和value都不允许出现null值,hashMap中,null值可以作为键,这一样的键
只允许有一个,可以有一个或多个键对应的是null值
5.如何决定使用 HashMap 还是 TreeMap?
HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)
HashMap:适用于在Map中插入、删除和定位元素。
TreeMap:适用于按自然顺序或自定义顺序遍历键(key)。
6.ArrayList 和 LinkedList 的区别是什么?
Array 的容量是固定的,ArrayList 的容量是根据需求自动扩展
ArrayList 提供了 添加、插入或移除 某一范围元素的方法
而 Array 中,只能一次获取或设置一个元素值
ArrayList 它的底层是一个数组,它的查询效率快
LinkedList底层是一个链表,所以增加,删除的效率快
7.如何实现数组和 List 之间的转换?
List转数组:toArray(arraylist.size())方法
数组转List:Arrays的asList(a)方法
8.ArrayList 和 Vector 的区别是什么?
- 同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 - 数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
9.Array 和 ArrayList 有何区别?
Array 的容量是固定的,ArrayList 的容量是根据需求自动扩展
ArrayList 提供了 添加、插入或移除 某一范围元素的方法
而 Array 中,只能一次获取或设置一个元素值
10.在 Queue 中 poll()和 remove()有什么区别?
Queue 中 remove() 和 poll()都是用来从队列头部删除一个元素。
在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,
新的poll() 方法只会返回 null。
11.哪些集合类是线程安全的?
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
12.Iterator 怎么使用?有什么特点?
Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素。
Iterator必须依附某个Collection对象而存在,Iterator本身不具有装载数据对象的功能。
Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象。
强调以下next()方法,该方法通过游标指向的形式返回Iterator下一个元素。
13.Iterator 和 ListIterator 有什么区别?
1. ListIterator有add()方法,可以向List中添加对象,而Iterator不能。
2. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator却不可以。
3. ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
4. 都可实现删除对象,但是ListIterator借助set()方法可以实现对象的修改。Iierator仅能遍历,不能修改。
因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。
org.apache.commons.collections.iterators.ArrayIterator就可以实现此功能。一般情况下,使用Iterator就可以了,如果需要进行记录的前后反复检索的话,就可以使用ListIterator来扩展功能,(有点象JDBC中的滚动结果集)。