[Java] Java自学笔记(八)——集合

*集合
    ·集合使用来存储引用类型数据的容器
*Collection 集合
    ·存取数据时单个存取,可以迭代(顺序访问集合中的每一个元素并只访问一次)
        ·子接口List集合:有序可重复(存储数据和添加顺序一致)
            ·实现类ArrayList底层是数组,线程不安全
            ·实现类Vector底层是数组,是线程安全的
            ·实现类LinkedList底层是双向链表,访问不方便,添加删除效率高
        ·子接口Set集合:无序不可重复
            ·实现类HashSet
                底层是HashMap,HashSet就是HashMap的键的集合
            ·实现类CopyOnWriteArraySet
            ·子接口SortSet
                ·可以对元素进行自然排序,要求集合中的元素必须是可比较的
                ·子接口NavigableSet
                    ·实现类TreeSet
                        可以对集合的元素进行排序
                    ·实现类ConcurrentSkipListSet
*Collection的常用操作
    ·add(E e)向集合中添加元素
    ·addAll(Collection c)把集合c中的所有元素都添加到当前集合中
    ·clear()删除集合中所有的元素
    ·contains(Object o)判断集合中是否包含指定的元素
    ·containsAll(Collection c)当前集合是否包含集合c中的所有元素
    ·isEmpty()判断集合是否为空
    ·iterator()返回集合迭代器对象
    ·remove(Object o)在集合中删除第一个与o匹配的元素
    ·removeAll(Collection c)把当前集合中出现在c集合中的元素都删除
    ·retainAll(Collection c)删除当前集合中不在c中的元素
    ·size()返回元素的个数
    ·toArray()把集合转换为数组
*List集合
    ·有序,可重复
    ·List对每一个集合指定了一个索引值,增加了针对索引值的操作
*LinkedList
    底层是双向链表
    ·单向链表
        ·单向链表由若干个节点组成,每个节点处了存储数据之外,还有一个指向下个节点的指针
        ·优点:插入/删除元素时不需要扩容也不需要复制移动元素,只需要修改一下指针
        ·缺点:如果想要查看指定节点前一个元素,需要重新从头开始
    ·双向链表
        ·双向链表由若干个节点组成,每个节点处了数据域之外,还有一个指针指向下一个节点的指针域,一个向上检点的指针域
        ·优点:插入/删除元素时不需要扩容也不需要复制移动元素,只需要修改一下指针
               不仅可以从前往后寻找,也可以从后往前寻找
    ·新增的方法
        ·增加了针对头与尾的操作
            ·addFirst(E e) 把元素e添加到第一个
            ·addLast(E e) 把元素e添加到最后一个
            ·removeFirst(E e) 删除第一个元素
            ·removeLast(E e)删除最后一个元素
            ·peek()返回第一个元素
    有时候也会使用Linkedlist模拟栈
        ·push(E e)模拟压栈,把元素e添加到列表的头部
        ·pop(E e)模拟出栈,把列表的第一个元素删除
    ·使用offer(E e),poll()模拟队列,队列特点先进先出
        ·offer(E e)模拟入队,把元素e的第一个元素删除
        ·poll()模拟出队,把列表的第一个元素删除
*Set集合
    ·无序不可重复
*HashSet
    ·HashSet底层是HashMap
    ·向HashSet中添加元素,实际上就是把该元素作为键添加到HashMap中
    ·HashSet就是HashMap键的集合
*TreeSet    
    ·TreeSet实现了SortedSet接口,可以对元素自然排序,要求集合中的元素必须是可比较的
        ·在创建TreeSet是,可以指定Comparator比较器
        ·没有指定Compparator比较器,要求元素的类实现Comparable接口
    ·TreeSet底层是TreeMap
        ·向TreeSet添加元素,实际上是吧该元素作为键添加到了底层的TreeMap中
        ·TreeSet实际上就是TreeMap键的集合
    ·TreeSet要求元素必须是可比较
        ·首先看是否有Comparator比较器,如果没有在查找是否实现了COmparable接口
        ·一般情况下,类实现Comparable一个默认的比较规则,再使用Comparator定义很多不同的比较规则
        ·在TreeSet集合中,判断是否同一个对象是根据Comparator/comparable的比较结构是否为0判断是否可以添加,比较结构为0为同一个元素
*泛型
    ·泛型就是把数据类型作为参数传递
    ·在Comparator<>/Comparable<>接口中通过泛型指定比较元素的数据类型
    ·在Collection<>集合中,通过泛型指定存储元素的诗句类型
    ·泛型的好处
        在编译时可以进行数据类型的检查
    ·注意
        在集合泛型中,在定义集合时泛型才有作用
        Collection collection = new ArrayList<>();
        约束Collection集合中只能存储String字符串,在赋值时,ArrayList后面的泛型不需要写,如果写只能和前面的泛型一致
*Collection工具类
    ·java.util.Collections 工具类提供了一些对Collection集合进行操作的方法
    ·Collections工具类有一组操作:synchronizedXXX(XXX)可以把XXX集合转换为线程安全的集合
        Collection synchronizedCollection(Collection c)
        static listsynchronizedList(List list)
        static Map synchronizedMap(Map m)
        static set synchronizedSet(Set s)
*Map集合
    ·是按<键,值>对的形式进行存取的<"list",18>
    ·子接口ConcurrentMap
        ·应用于对线程环境
        ·实现类ConcurrentHashMap
        ·子接口ConcurrentNavigableMap
            ·实现类ConcurrentSkipListMap                
    ·子接口SortedMap
        ·根据键自然排序,要求键必须是可以比较的Compar/Comparable
        ·子接口NavigableMap
            ·子接口ConcurrentNavigableMap
            ·实现类TreeMap
                ·可以根据键自然排序,排序的原理是二叉树原理
    ·实现类HashMap
        ·底层是哈希表数列表
    ·实现类Hashtable
        ·底层也是哈希表,是线程安全的
        ·子类Propertie
            ·键与值都是String类型,常应用于设置\读取属性

*Map基本操作
    ·clear()清楚所有的<键,值>对
    ·containsKey(Object key)判断是否包含指定的键
    ·containsValue(Object value)判断是否包含指定的值
    ·entrySet()返回Entry的集合,一个<键,值>对就是一个Entry
    ·get(Object key)返回key对应的值
    ·isEmpty()判断是否为空
    ·keySet()返回键的集合
    ·put(K key, V value)向Map中添加<键,值>对,如果键已存在,使用value值替换原来的值
    ·remove(Object key)只要key匹配就删除对应的<键,值>对
    ·size()返回<键,值>对的数量
    ·values() 返回值得集合
*HashMap与HashTable
    ·底层都是哈希表(散列表),但是HashTable是线程安全的饿,HashMap不是线程安全的
    ·HashMap的父类是AbstractMap,HashTable的父类是Dictionary
    ·HashMap默认初始化容量:16,HashTable默认初始化容量:11
    ·加载因子 0.75 ——当<键,值>对的数量打与数组的容量(哈希桶的容量)*加载因子时,需要扩容
    ·HashMap两倍扩容,HashTable两倍+1;
    ·HashMap的键和值都可以为null,Hashtable的键和值都不可以为null
    ·HashMap可以指定初始化容量,系统会调整为大于该数的2的幂次方,为了快速计算数组下标
     HashTable可以指定初始化容量,不扩容
*Properties
    ·继承了HashTable
    ·键和值都是String字符串
    ·常用与设置和读取系统的属性值
    ·经常把属性保存到配置文件中
    ·一般情况下会在当前工程创建一个资源包,在资源包中添加配置文件
    ·在src目录下,创建.properties
*TreeMap
    ·TreeMap实现了SortMap,可以根据键自然排序,排序原理是二叉树原理
    ·TreeMap中的键采用中序遍历,左子树-根-右子树
    ·TreeMap的键必须可比较

 

你可能感兴趣的:(Java)