1. 概览

java.util包中就包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式。

Java2的集合框架,抽其核心,主要有三种:List、Set和Map。

2. 问题

2.1 集合类特性(几个常用类的区别)

  • ArrayList: 元素单个,效率高,多用于查询
  • Vector: 元素单个,线程安全,多用于查询
  • LinkedList: 元素单个,多用于插入和删除
  • HashMap: 元素成对,元素可为空
  • HashTable: 元素成对,线程安全,元素不可为空
  • WeakHashMap: 是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收

2.2 什么是Iterator

一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。

2.3 Iterator与ListIterator有什么区别

  1. Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
  2. Iterator只能正向遍历集合,适用于获取移除元素。ListIerator继承Iterator,可以双向列表的遍历,同样支持元素的修改。比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

2.4 Collection 和 Collections的区别

  • Collection:是集合类的上级接口,继承与他的接口主要有Set 和List.
  • Collections(工具类):是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

2.5 List、Map、Set三个接口,存取元素时,各有什么特点

List 以特定次序来持有元素,可有重复元素;
Set 无法拥有重复元素,内部排序(无序);
Map 保存key-value值,value可多值。

2.6 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)来达到同步的效果。

2.7 ArrayList和Vector的区别

  1. 同步性:
    Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。

  2. 操作:
    由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。

  3. 数据增长:
    ArrayList和Vector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayList和Vector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。
    Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。
    Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。

2.8 LinkedList与ArrayList有什么区别

两者都实现的是List接口,不同之处在于:

  1. ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。
  2. get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端
  3. 对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据
  4. 注意: LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: List list = Collections.synchronizedList(new LinkedList(…));

2.9 数组(Array)和列表集合(ArrayList)有什么区别

下面列出了Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

2.10 Enumeration接口和Iterator接口的区别有哪些

  Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

2.11 HashSet和TreeSet有什么区别

HashSet有以下特点:

  • 无序(不能保证元素的排列顺序,顺序有可能发生变化)
  • 不同步
  • 允许空值(集合元素可以是null,可以放入多个null,但会自动覆盖) 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

TreeSet有以下特点:

  • 有序
  • 不同步
  • TreeSet是由一个树形的结构来实现的(数据结构是二叉树),它里面元素是有序的
  • TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态,支持两种排序方式,自然排序和定制排序。其中自然排序为 默认的排序方式;定制排序,TreeSet中的对象元素需要实Comparable接口
  • TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取
  • 不允许空值
  1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
  2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个有序性.
  3. TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取
  4. HashSet是基于hash算法实现的,性能优于TreeSet,通常使用 HashSet。在我们需要对其中元素排序的时候才使用TreeSet。

2.22 HashMap,LinkedMap,TreeMap的区别

  • HashMap,LinkedHashMap,TreeMap都属于Map。
  • LinkedHashMap是HashMap的子类。
  • Map主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复

3. 简单总结