/** LinkedList:双向链表,有头有尾,没有索引,但是我们有模拟出来的也能用
 *  适合做各种新增和删除,高频率
 *
 *  ArrayList(线程异步,不安全,效率高):适合做高频率的查找,遍历
 *  vector(线程同步,安全,效率低,底层代码加了synchronized,基本淘汰):其他和ArrayList几乎一模一样
 *
 *  Collection接口:
 *  List:有顺序,元素可以重复,顺序指的是添加的先后顺序
 *  Set:没顺序(实际上是没有规范的顺序,无序不等于随机,底层有做排序),元素不可以重复(想重复必须重写hashCode方法),顺序指的是添加的先后顺序
 *      set只有删除和新增,二叉树
 *
 *  HashSet:遍历可以用迭代器或增强for循环
 *
 *  TreeSet:排序规则是排序的对象的类必须实现Comparable接口(前提),添加数据,在打印输出时从小到大排序(中间会用compareTo比较大小),引用数据类型按ASC码
 *  LinkedHashset(链表):有序,添加数据的同时会维护数据的添加顺序(先后),效率比HashSet(链表+二叉树)略低
 *
 *  比较接口:
 *  Comparable(只有一个方法,compareTo()):自然排序,排序顺序是固定
 *  Comparator:临时排序
 *
 *  list.sort():排序
 *
 *  Map(最常用的集合)接口:
 *  存储对值,K-V
 *  key不能重复,value是可以重复的
 *  根据key值取value
 *
 *
 *  Hashtable(唯一没有满足大驼峰式命名的)和HashMap几乎没有区别:
 *  1.HashMap是线程异步,线程不安全的,Hashtable是线程同步,线程安全
 *                                         (Hashtable的子类有properties(属性),用来操作属性文件,用法单一)
 *  2.HashMap的key是可以为null的,Hashtable的key是不可以为null(空指针)
 *
 *  LinkHashMap:双向链表
 *
 *  Map的遍历:
 *  增强for循环
 *  Entry是hashmap的一个内部类
 *  每一组键值对就是一个Entry对象  如map.("1001","小法")
 *  map.entrySet()+enter(回车)
 *  HashMap(entry是它的一个内部类)内部存储结构:
 *  jdk1.7前: 链表+二叉树
 *  jdk1.7及之后: 链表+数组+红黑树
 *
 *  迭代器功能最好,不会出问题
 *
 *  其他集合:
 *  1.LinkedHashMap,在HashMap的基础上维护了一个双向链表
 *  2.TreeMap:天然支持排序
 *
 *  Collections:一个工具类
 *
 *  线程安全问题:
 *  增强for循环在循环中添加元素或删除时,由于它的底层是迭代器,
 *  迭代器依赖于集合存在的,在判断成功之后,集合中新增了元素,
 *  迭代器不知道,所以会报错
 *
 *  解决方案:
 *  迭代器遍历元素,迭代器删除元素
学习心得:迭代器功能完整,没有缺陷,Map和List是最重要的,用得最多的两个集合,这两个是今天学习内容的重点