集合,是一种存储容器,我们需要了解集合的存取,以及他们的特性。
集合有List Set Map。
一 Collection
collection 有两个分支,一个是 List,一个是 Set;
collection 中常用的方法:add、clear、contain、remove、size、toArray
注:toArray 将集合转数组之后,数组的长度是不可变的。
迭代器
public interface Collection< E> extends Iterable< E>
Collection 的父类是 Iterable,所以 Collection 及子类都多了一个 iterator 的方法,此方法可用来遍历 Collection 的子类;
泛型
泛型在集合的类中是常见的,一对尖括号< E >;
泛型的作用就是声明集合的时候加上指定的类型,这样只有同类型的对象才能存进集合,保证了安全。因为如果不指定类型,会发生强转类型错误,例如 Interger can not case to String。
List
List 三大特性:有序,有索引,元素可以重复;
List 接口下有两个实现类,一个是 ArrayList,另一个是 LinkedList;都是线程不安全的;
ArrayList 是基于数组的数据结构实现的,所以查询快,增删慢;
LinkedList 是基于链表(单向)的数据结构实现的,所以查询慢,增删快;
List 集合子类的遍历方式有三种
普通的 for 循环遍历;
foreach 遍历;
Iterator 遍历;
ArrayList && Vector 区别
这两者是一样的,只是前者是线程不同步的,线程不同步就意味着运行效率快。
Set
Set 三大特性:无序,无索引,元素不可重复,但是可以存 NULL 值;
这个有序无序怎么理解呢?
有序:
怎么样的顺序存进去,取出来也是怎么样的顺序;
比如说存进去是 1 2 3 4 5,取出来也是 1 2 3 4 5;
无序:
取出来的顺序跟怎么样的顺序存进去无关;
比如说存进去是 1 2 3 4 5,取出来可能是 2 4 5 1 3 || 5 3 1 2 4
Set 集合下也有两大实现类,一个是 HashSet,一个是 LinkedHashSet。都是线程不安全的。
HashSet,底层是哈希表;
LinkedHashSet,底层是哈希表 + 双向链表,由于是链表,所以就变成了有序;
Set 集合的子类遍历的方式有两种:
foreach 遍历;
Iterator 遍历;
由于没有索引,所以不能操作普通的 for 循环遍历;
二 Map
集合容器除了上面讲的 Collection 及其子类之外,还有另外一种集合容器叫 Map。记住它不是 Collection 的实现类,是独立于 Collection 的。
Map 是一种键+值组合的集合;
键集合是 Set 集合,所以键的元素不可重复;值可以重复元素;
一个键映射到一个值,所以键值是成对出现的。
Map 集合下有两个实现类,一个是 HashMap,一个是LinkedHashMap。都是线程不安全的。
HashMap,底层是哈希表;
LinkedHashMap,底层是哈希表 + 双向链表;
Map 集合子类的遍历方式:
需要先调用 Map 下的 keySet 方法,通过遍历 keySet 集合获取到值;
遍历 keySet 方式有两种,foreach 和 Iterator;
HashMap && HashTable 的区别:
两者底层都是哈希表,只是后者是线程安全的;
HashTable 跟 Vector 的命运一样,在JDK 1.2被对应的取代了;
HashMap 是允许存 NULL 键和 NULL 值的,但是 HashTable 不允许;