Collection 框架的层次结构。java.util包包含Collection 框架的所有类和接口。Java 集合框架的核心元素——接口、实现、聚合操作和算法。
Java的集合类定义在java.util
包中,支持泛型,主要提供了3种集合类,包括List
,Set
和Map
。Java集合使用统一的Iterator
遍历,尽量不要使用遗留接口。
List是最基础的一种集合:它是一种有序列表。在实际应用中,需要增删元素的有序列表,我们使用最多的是ArrayList
。
Map这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)。
如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。
队列(Queue
)是一种经常使用的集合。Queue
实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。
把这种通过Iterator对象遍历集合的模式称为迭代器。使用迭代器的好处在于,调用方总是以统一的方式遍历各种集合类型,而不必关系它们内部的存储结构。
如果我们自己编写了一个集合类,想要使用for each循环,只需满足以下条件:
(1)集合类实现Iterable接口,该接口要求返回一个Iterator对象;
(2)用Iterator对象迭代集合内部数据。
用Properties
读取配置文件非常简单。Java默认配置文件以.properties
为扩展名,每行以key=value
表示,以#
课开头的是注释。以下是一个典型的配置文件:
# setting.properties
last_open_file=/data/hello.txt
auto_save_interval=60
Properties内部本质上是一个Hashtable。
可以从文件读取,也可以从ar包中读取。
Collections
是JDK提供的工具类,同样位于java.util
包中。它提供了一系列静态方法,能更方便地操作各种集合。
创建空集合;
创建单元素集合;
创建不可变集合;
排序/洗牌等操作。
把线程不安全的集合变为线程安全的集合
1、问:你知道那些遗留类和接口?
答: 遗留类:Hashtable、Vector、Stack;不应该继续使用。
遗留接口:Enumeration
2、问:Set 和 Map 有什么区别?
答: Set 仅包含值,而 Map 包含键和值。
Set 包含唯一值,而 Map 可以包含具有重复值的唯一键。
Set 包含单个空值,而 Map 可以包含单个空键和 n 个空值。
3、问:List, Set, Map 是否继承自 Collection 接口?
答: List,Set 是,Map 不是
4、问:数组和集合之间的主要区别是什么?
答:(1)数组始终是固定大小的,即用户不能根据自己的需要或在运行时增加或减少数组的长度,但在 Collection 中,大小可以根据需要动态更改。
(2)数组只能存储同种或相似类型的对象,但在Collection中可以存储异构对象。
(3)数组不提供现成的如排序、搜索方法等,但 Collection 包括现成的使用方法。
5、问:Iterator 和 ListIterator 有什么区别?
答:Iterator 仅向前遍历元素,而 ListIterator 向前和向后遍历元素。
6、问:ConcurrentHashMap、HashMap、HashTable有什么区别?
答:(1)包不同java.util.HashMap; java.util.concurrent.ConcurrentHashMap;
(2)ConcurrentHashMap实现了 ConcurrentMap 以及 Serializable 接口。此类是线程安全的HashMap。
(3)Hashtable 继承自 Dictionary 类,底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化。
7、问:Set 里的元素是不能重复的,是怎么保证不重复的?
答:Set 里的元素是不能重复的,在put的时候,会进行hash和值的比较,如果hash不存在,则允许存入。如果hash码值相同,且equles判断相等,说明元素已经存在,不存;如果hash码值相同,且equles判断不相等,说明元素不存在,存;
8、问:ArrayList 和 LinkedList 有什么区别?
答:(1)ArrayList 使用动态数组;LinkedList 使用双向链表。
(2)ArrayList 更适合存储,读取更快;LinkedList 操作更快。
(3)ArrayList 提供随机访问;LinkedList 不提供随机访问。
9、问:HashMap 和 TreeMap 有什么区别?
答:HashMap 保持无序,而 TreeMap 保持升序。
HashMap 是通过哈希表实现的,而 TreeMap 是通过 Tree 结构实现的。
HashMap 可以按 Key 或 value 排序,而 TreeMap 可以按 Key 排序。
HashMap 可能包含具有多个空值的空键,而 TreeMap 不能包含空键但可以具有多个空值。
10、问:如何同步ArrayList?
答:(1)Collections.synchronizedList
(2)使用CopyOnWriteArrayList,CopyOnWriteArrayList就是线程安全版本的ArrayList。
import java.util.*;
public class SyncronizeArrayList {
public static void main(String args[]) {
// Non Synchronized ArrayList
List fruitList = new ArrayList();
fruitList.add("Mango");
fruitList.add("Banana");
fruitList.add("Apple");
fruitList.add("Strawberry");
fruitList.add("Pineapple");
// 同步 ArrayList
furitList = Collections.synchronizedList(fruitList);
// 使用同步块来避免非确定性行为
synchronized (fruitList) {
Iterator itr = fruitList.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
}
11、问:如何使Java ArrayList 只读?
答:通过调用 Collections.unmodifiableCollection() 方法获取 java ArrayList Read-only。当我们将 ArrayList 定义为只读时,我们无法通过 add()、remove() 或 set() 方法对集合进行任何修改。
12、问:以下哪个说法错误?
(A)java.util.List可用来存放一组按索引位置存放的有序的元素。
(B)java.util.Set集合中允许存放Java对象以及基本类型的数据。
(C)当一个线程执行Thread类的sleep()方法开始睡眠时,不会释放所占有的对象锁。
(D)当Java虚拟机初始化一个类时,如果它的父类还没有初始化,那么会先初始化它的父类。
答:B;java.util.Set集合中只允许存放Java对象,不允许存放Java基本类型的数据。