Java集合概述及相关面试问题总结

简述

Java提供了数种持有对象的方式,包括语言内置的Array,还是就是utilities中提供的容器类(container classes),又称群集类(collection classes)。集合在Java中非常重要,在讨论之前,先来看看几个面试中的经典问题。

经典集合面试问题

1、Collection和Collections的区别?

2、List、Set、Map是否继承自Collection接口?

3、ArrayList和Vector的区别?

4、HashMap和Hashtable?

5、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?

关于以上问题片尾有答案,我们先开始Java集合概述正文。

正文

集合Collection接口

Collection是任何对象组,元素各自独立,通常拥有相同的套用规则。Set、List由它派生。

基本操作:增加元素add(Object obj); addAll(Collection c);
删除元素:remove(Object obj); removeAll(Collection c);
求交集:retainAll(Collection c);
访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)

public interface Iterator {
	Boolean hasNext();
	Object next();
	void remove();
}

集Set

没有重复项目的集合

有三种特定类型的集可用
1、HashSet - 基于散列表的集,加进散列表的元素要实现hashCode()方法。
2、LinkedHashSet - 对集迭代时,按增加顺序返回元素。
3、TreeSet - 基于(平衡)树的数据结构。

清单List

位置性集合。加进清单的元素可以加在清单中特定位置或加到末尾

有两个特定版本
1、ArrayList(数组表) - 类似于Vector,都用于缩放数组维护集合。
区别:
(1)同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的。
(2)数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半。
2、LinkedList(链表) - 是双向链表,每个节点都有两个指针指向上一节点和下一节点。
用在FIFO,用addList()加入元素,removeFirst()删除元素。
用在FILO,用addFirst()加入元素,removeLast()删除元素。
ListIterator提供双向遍历next()、previous(),可删除、替换、增加元素。

映射表Map

用于关键字/数值对(键-值对),像个Dictionary

处理Map的三种集合
(1)关键字集KeySet()
(2)数值集value()
(3)项目集enrySet()
Map的四个具体版本
1、HashMap - 散列表的通用映射表。
2、LinkedHashMap - 扩展HashMap,对返回集合迭代时,维护插入顺序。
3、WeakHashMap - 基于弱引用散列表的映射表,如果步保持映射表外的关键字的引用,则内存回收程序会回收它。
4、TreeMap - 基于平衡树的映射表。
4.1 Collections类,用于同步集合,还能改变集合只读方式。

Map mp = new HashMap();
mp = Collections.synchronizedMap(mp);		//生成线程安全的映射表
mp = Collections.unmodifiableMap(mp);		//生成只读映射表

Comparable - 自然顺序的排序类
Comparator - 面向树的集合排序类
容器分类学(Container taxonomy)
集合接口:Collection、List、Set、Map、Iterator、ListIterator
抽象类:AbstractCollection、AbstractList、AbstractSet、AbstractMap、AbstractSequentiaList

更早版本JDK中的集合类型

Vector类

Vector - 就是向量。一种异构的混合体,可以动态增加容量。

对它的操作简要如下:
比如我们有一个Vector

int length = 10;
Vector myVec = new Vector(length);
myVec.size();		//取得Vector的长度
//myVec.set(int position, Object obj); myVec.setElementAt(Object obj, int position);		//赋值
//myVec.add(Object obj); myVec.addElement(Object obj);     //在Vector末尾加入对象
//myVec.get(int position); myVec.getElement(int position);     //取出元素

Stack类

是Vector的子类。就是数据结构里讲烂了的堆栈(这个词可简称栈,不要混淆于heap-堆)。后进先出的存取方式。

Stack() - 构造空栈
empty() - 判空
search() - 检查堆栈是否有元素
peek() - 取得栈顶元素
pop() - 弹栈
push() - 入栈

Dictionary抽象类

字典。关键字/数值(键-值)方式存取数据,如果映射没有此关键字,取回null。

Hashtable类

是Dictionary结构的具体实现。

经典集合面试问题答案

1、Collection和Collections的区别?

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
Collection是集合类的上级接口,即是java.util下的接口,它是各种集合结构的父接口。继承于它的接口主要有Set和List。

2、List、Set、Map是否继承自Collection接口?

List、Set是,Map不是。

3、ArrayList和Vector的区别?

(1)同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的。
(2)数据增长:当需要增长时,Vector默认增长为原来的一倍,而ArrayList却是原来的一半。

4、HashMap和Hashtable的区别?

(1)历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
(2)同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不是同步的。
(3)值:只有HashMap可以让你将空值作为一个表的条目的key或value。

5、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用双等还是equals()?它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()方法和双等决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

发布了107 篇原创文章 · 获赞 291 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/zlbdmm/article/details/103598171