一、list相关集合
    ArrayList
  基于动态数组实现,数组默认大小为10.当数组容量不够用是,会自动进行扩容,扩容的大小为原来的1.5倍
        线程不安全
        创建
            ArrayList<变量类型> 变量名称 = new ArrayList<>();
API
插入数据
                .add()
在指定下标插入数据 [0~size]
                .add(index,数据)
一次添加一个集合进去
                .addAll(ArrayList)
                .addAll(Arrays.asList("a","b"))     Arrays.asList("a","b")将数组转换为list类型
            获取数据
                .get(index)  index[0,size)
是否包含某个对象
                .contains("a");
返回数据在集合中的下标位置不存在则为-1
                .indexOf("a")
是否为空
                .isEmpty()
删除对象
                删除对应的对象 删除第一个
                .remove("1")
根据下标位置删除
                list1.remove(index)
修改对应下标位置的值
                list1.set(index,"b")

排序
                调用list.sort()参数为比较器(需要自己创建一个对应类并继承Comparator接口)
                    StringComparator stringComparator = new StringComparator();
                    list1.sort(stringComparator);
使用集合工具类进行排序
                    Collections.shuffle(list1);     .shuffle(集合对象)  打乱集合顺序
                    Collections.sort(list1);
匿名内部类       (若创建类只需自己调用则可使用匿名内部类进行创建)
                            Collections.sort(list2, new Comparator<Student>() {
                                @Override
                                public int compare(Student o1, Student o2) {
                                    return o1.getName().length()-o2.getName().length();
                                }
                            });

遍历
                通过for循环遍历
                    for (int i = 0; i < list1.size(); i++) {
                        String s2 = list1.get(i);
                    }
加强for循环   不能在遍历时删除数据
                    for (String s2 : list1) {
                        System.out.println(s2);
                    }


迭代器
                    Iterator<String> iterator = list1.iterator();
                    while (iterator.hasNext()){
                        System.out.println(iterator.hasNext());
                    }

LinkedList
基于双向链表来实现的只能够顺序访问(从前到后,从后到前)数据的添加删除效率高,数据的查询效率低
        线程不安全
        创建
            LinkedList<String> linkedList = new LinkedList<>();
        API
获取元素
                获取第一个元素
                    .element();
获取元素  原集合不变
                    .peek();
                    .peekLast() 最后一个
                取出并移出
                    .poll()
                    .pollLast()
添加元素
                .offer("X") 将元素添加到末尾
                .offerFirst("M")    将元素添加到最前
            遍历
                同ArrayList
vector  线程安全的list集合实现与ArrayList类似,都通过动态数组来实现,因为线程安全效率较低基本不使用
            扩容机制    扩容为原来两倍
        代替方法
            CopyOnWriteArrayList:线程安全,读写分离集合,读的性能比较高。适合用于读多写少的场景
            使用Collections的工具类,将ArrayList转换为线程安全的
            List syncList=Collections.synchronizedList(list)
二、Map的相关集合
 HashMap
创建
            HashMap<String, String> map = new HashMap<>()
同一key值存储多个元素可以将value设置成集合
        添加
            .put(key,value)
取值
            根据key值取value值 若get不存在的key返回null
                get(key)
是否包含某个key值,通常在添加之前做判断,以防止覆盖。多次put同一个key会将原来的key值覆盖
            containsKey(key)
删除map中的内容 返回key对应的value值
            remove(key)
替换map中的内容
            replace(key,value)
取map中所有的value
        .values()
获取map中所有的key值
            .keySet()
        map的遍历
            获取所有的key根据key获取value
            for (String key : map.keySet()) {
                System.out.println(key+"\t"+map.get(key));
            }
获取keyvalue的键值对然后遍历(推荐)
            for (Map.Entry<String, String> entry : map.entrySet()) {
                System.out.println(entry.getKey()+"\t"+entry.getValue());
            }
        hashMap存储数据大致流程
                map.put(key,value)
                1 根据key的hashcode值计算该数据应存储的下标位置
                2 如果该下标位置没有内容,则直接将数据存入该位置
                3 如果该下表位置有内容(hash冲突)将对象的key与改下标的链表中的对象进行equals比较
                4 如果equals方法返回true则将内容替换掉该位置的链表中该节点的内容
                5 如果equals方法返回false创建新的node节点并添加到链表的后面
LinkHashMap
在hashmap基础之上内部维护了一个链表,用来保存数据的插入顺序
    可以称之为有序的hashmap(存储顺序和迭代顺序相同)
treemap
基于红黑树实现可以根据key的自然顺序进行排序
    在创建treemap对象的时候也可以传入一个比较器,treeMap会根据比较器进行排序
    判断key值是否相等是根据比较器的compare方法或compare able接口中的compareto方法
    进行判断如果返回0则为重复
    HashMap LinkedHashMap   TreeMap等都是线程不安全的
    如果需要使用线程安全的情况有
    HashTable   线程安全的实现上与hashmap相同,但因为性能问题基本不使用,其key值和value值均不允许为null
替代方式    Collections.syncharonizedMap()和concurrentHashMap
    oncurrentHashMap    与HashMap实现方法类似oncurrentHashMap为线程安全的,效率比hashtable高。在需要线程安全的时候推荐使用该类
三、set的相关集合
无序 不可重复的集合  底层通过Map来实现的。set的数据实际上是存储在map的key当中
      hashset
    创建:HashSet<String > set = new HashSet<>();
    API
      .add()  添加
      .size()  长度
      .remove()  删除
      .contains()  是否包含
遍历
      for (String s : set) {
          System.out.println(s);
      }
      linkedhashset
    插入和遍历时顺序相同,底层基于linkedhashmap
      treeset
    treeset是一个有序set类