1. 作用:保存对象,虽然数组是保存一组对象的有效方式,但是数组具有固定的大小。容器类可以自动的调整自己的尺寸。
2.
LinkedList :其数据结构采用的是链表,此种结构的优势是删除和添加的效率很高,但随机访问元素时效率较ArrayList类低。
ArrayList:其数据结构采用的是线性表,此种结构的优势是访问和查询十分方便,但添加和删除的时候效率很低。
HashSet: Set类不允许其中存在重复的元素(集),无法添加一个重复的元素(Set中已经存在)。HashSet利用Hash函数进行了查询效率上的优化,其contain()方法经常被使用,以用于判断相关元素是否已经被添加过。
HashMap: 提供了key-value的键值对数据存储机制,可以十分方便的通过键值查找相应的元素,而且通过Hash散列机制,查找十分的方便。
3.Queue和List有两个区别:前者有“队头”的概念,取元素、移除元素、均为对“队头”的操作(通常但不总是FIFO,即先进先出),而后者只有在插入时需要保证在尾部进行;前者对元素的一些同一种操作提供了两种方法,在特定情况下抛异常/返回特殊值——add()/offer()、remove()/poll()、element()/peek()。不难想到,在所谓的两种方法中,抛异常的方法完全可以通过包装不抛异常的方法来实现,这也是AbstractQueue所做的。
4. Map底层实现:数组+链表
public class MyMap {
MyEntry[] arr = new MyEntry[100];
int size;
/**
* 采用hash算法实现map,(每个对象都有一个地址,
* 根据地址生成的一个hash码,由于每个对象的地址都不一样,所以
* 生成的hash码是唯一的)
* @param key
* @param value
*/
public void put(Object key, Object value){
MyEntry my = new MyEntry(key, value);
//相当于地址映射函数,但是会产生地址映射冲突
int a = (key.hashCode()%100);
//思路一:当地址冲突时,采用开放地址法处理冲突
while(arr[a].key != null){
a++;
}
arr[a] = my;
/*思路二:当地址冲突时,采用链表法处理冲突-->这也是Java采用的设计思想,
数组加链表(即每个数组元素里面放一个链表)*/
//第一步:申请一个每个元素是链表的数组
MapLinkedList[] map = new MapLinkedList[999];
//第二步:添加元素
if(map[a] == null){
MapLinkedList list = new MapLinkedList();
list.add(e);
map[a] = list;
}else{
map[a].add(e);
}
}
public Object get(Object key){
int a = (key.hashCode()%100);
return arr[a].value;
}
}
class MyEntry{
Object key;
Object value;
public MyEntry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
6. hashSet的底层实现为hashMap,对象相同则hashcode相同,所以hashset能保持唯一性
7. collection的功能方法
boolean add() ; boolean addAll(); Iterator iterator(); boolean remove(); int size(); Object[] toArray();