为什么会出现集合类: 为了方便对多个对象进行操作,就用集合来存储对象
数组和集合类同是窗口,为什么不用数组?
因为数组的长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象
迭代器(Iterator)的定义:  用来取出元素的对象,为什么没有直接通过一个方法完成
因为取出这类事物,一个方法不足以来描述,至少要知道是否有元素,有可以进行取的动作
这些行为都进行了封装。
*重点在于每一个容器底层数据结构都有不同,所有实现的方式都不一样,但是都符合一个规则
语法:Iterator it=集合.iterator();
循环遍历的语法:while(it.hasNext()){
System.out.print(it.next()); 
}
for(Iterator it=集合.iterator();it.hasNext()){
system.out.print(it.Next())
}
Collection
层次结构中的根接口,Conlection表示一组对象。
Iterable
它是Collection接口的父接口,它只是实现了iterator(迭代器方法)它是在1.5后出现的为的是实现了以后的扩展。因为所有Collection集合都有迭代器方法。所有以后扩展时只需实现Iterable接口即可
所有的通用的collection实现类(通常是它子接口的间接实现),都应该提供两个构造方法:
1.无参构造,用于创建空Collection
2.带有类型参数的构造方法,创建一个具有与其参数相同的的新Collection
此接口上的方法:
add(E)增   addAll(Collection<? extends E> c)增加指定Collection所有元素
clear()删除所有   contains()包含  cotainsAll(c) 是否包含指定集合的所有元素
hashCode() 获取hash码  isEmpty()  iterator()返回在此collection的元素上进行迭代的迭代器
remove(o) 删除指定元素 removeAll(c) 删除指定元素包含的元素
retainAll(c) 仅保留此Collection中那些也包含在指定collection的元素
size() 元素个数  toArray()  返回包含此collection中所有元素的数组

list:有序的collection集合(存取顺序),可以存入重复元素。因为该集合中的元素都有角标

ArrayList:底层是数组数据结构。不同步的。ArrayList替代了Vector查询速度快。
 它的构造初始化容量是10,它增加时初始容量加初始容量一半来增长的
 它的增删查改都可以通过角标来操作。
 它特有的方法get(index);

Vector:  它的底层也是数组结构,类可以实现可增长的对象数组。不同步的.
 ArrayList替代了Vector

LinkedList:底层是链表数据结构的。增删速度非常快。
问题:为什么ArrayList会替代Vector?
因为他的效率低,它们的初始大小都为10个当Arraylist不够用时它会会把新建一个原数组大1.5倍的数组,然后把所有元素copy进去, 而Vector不够用时,他会创建一个比原数组大2倍的数组,从而导致资源浪费。

Set:  一个不包含重复元素的无序collection.它最多可以包含一个空元素。
HashSet:底层数据结构是哈希表。对于判断该集合元素是否重复,先会判断两个对象的HashCode值,
只有哈希值相同的情况下,才会判断equals方法。它不是同步的。
TreeSet:底层数据结构是二叉数,可以对Set集合中的元素进行排序(它是用的自然排序)
*String是个特例因为String类实现了comparable接口 
如果往TreeSet集合中存入元素并未实现Comparable接口,或者实现了Comparable
接口,但是其比较方式并不是我们所需要的,它的解决方案有两种:
1.让元素自身具备比较性,元素实现Comparable接口,覆盖comparTo方法
2.让TreeSet集合自身具备比较性。实现Compartor接口,自定义Compartor的子类接口,
 覆盖compare方法。将比较对象作为参数传递给TreeSet集合构造函数
*二叉数原理:着先添加第一个元素,然后再进来一个元素的时候就跟这个元素进行比较,如果大的就放到右边,
    如果小的话就放到左边

泛型
为什么要使用泛型?
1.它将运行时期出现的问题ClassCastException转移到了编译时期
2.避免了类型强转的麻烦
3.可以将要操作的引用类型作为参数传递到<>中

泛型类
什么时候需要使用泛型呢?
当类操作引用的数据类型不确定的时候,可以使用泛型类。
泛型方法
什么时候使用?
当方法操作的引用类型不确定。
而且每一个方法操作的类型有可能不一致。
泛型方法通常用在静态函数上。

Map
它集合没有父接口,也没有迭代器
以键值对的形式出现,一次存储一对对象,它不能包含有重复的键,每个键最多只能映射到一个值 
子类,HashMap基于哈希表   线程不安全的,替换了HashTable,可以存入null键和null值

      HashTable   线程安全的,效率比较低,不可以存入null键和null值 

      TreeMap基于二叉数  线程不安全,可以对键进行排序
map取出元素的原理,就是通过map的方法,将map集合转成为Set集合,再通过集合中的迭代器对 元素进行读取
取出Map集合中的元素:方式一
1.for(Map.Entry<String, String> entry:map.entrySet()){   
2.    System.out.println(entry.getKey()+"--->"+entry.getValue());   
3.}  
map.get(key)   可以单独取的map里的value
 还可以通可先获取它的key  Set<string> keyset=keyset.iterator();
 再通过key来获得值 Iterator<String> it=map.get(key)
取出map集合中的元素方式二
Set<Map.Entry<string,string>> entry=map.entrySet();
1.Set set = map.entrySet();        
2.Iterator i = set.iterator();        
3.while(i.hasNext()){     
4.    Map.Entry<String, String> entry1=(Map.Entry<String, String>)i.next();   
5.    System.out.println(entry1.getKey()+"=="+entry1.getValue());   
6.}  

数组变集合,需要注意
1.数组长度固定,变成集合后不可以对其进行增删
2.否则运行进出现不支持操作异常。
3.数组变集合最重要的是:用集合的思想来操作数组

技巧:
看到hash就要想到哈希表,就要想到hashCode和equals方法。
看到tree就要想要二叉树,就要想到排序,就要使用到两个接口Comparable,Comparator.