• Java 中的容器 Collection 和 Map


    Set中不能有重复元素,通过equals方法判断

    HashSet : 为快速查找而设计的Set,存入的元素必须定义hashCode()方法,可以有一个null值

    TreeSet :底层为树结构(红黑二叉树),内部有序.存入的元素必须实现comparable接口,不能有null值

    LinkedHashSet : 具有HashSet的查找速度,同时按照插入的顺序存储,可以有一个null值

    要将自定义的类对象放入Set或者Map时应该考虑是否需要重写其equals()方法和hashCode方法,如还需实现comparable接口,equals方法与compareTo方法结果应该一致

    SortedSet : 接口,唯一实现类---TreeSet

    常用方法 

    comparator() : 返回当前Set的comparator,或者null(表示自然顺序)

    first(),last()方法:返回第一个和最后一个元素

    SortedSet subSet(fromElement, toElement) 

    SortedSet headSet(toElement)

    SortedSet tailSet(fromElement)

    Queue 队列 (接口)仅有LinkedList 和 PriorityQueue 两个实现

    方法 抛出异常 返回特殊值
    添加 add offer
    移除 remove poll
    查看 element peek

    其中添加返回Boolean,移除和查看返回元素

    PriorityQueue 内部的优先级实现也是通过compareTo实现的

    双端队列:LinkedList 可以在队列任意一端添加或删除元素

    Map

    subMap()只有TreeMap才有

    WeakHashMap : 弱键映射,允许释放映射所指向的对象.如果处映射外没有引用指向对象,则该对象可以被回收

    ConcurrentHashMap : 线程安全的Map,不涉及同步加锁

    IdentityHashMap :使用==代替equals()对键进行比较的三列映射

    LinkedHashMap : 默认按照插入顺序存储,可以通过调用构造器LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

     将顺序变为LRU(Leas-Rencently-Used,最近最少使用),可以用于定期垃圾清理,其中loadFactor为加载因子,表示当前的最大容量,最大容量等于第一个大于initialCapacity

    的2的n次方的值乘以加载因子,加载因子越大表示填充越紧密,查找速度会变;而太小的话会浪费空间,默认为0.75;accessOrder为false表示按插入顺序存储,true表示LRU

    默认的eqals比较对象的地址,重写equals方法

    public boolean equals(Object obj){
         return (obj instanceof X) && ((X)obj).a == this.a;       
    }
    //其中instanceof既判断了obj是否是X的实例也判断了其是否为null

    Map存储原理:内部可以看作一个list<Entry>数组,通过hashCode可以得到key的唯一hash值,通过该值计算处对应数组下标,如果对应下标处值为null则新建一个list<Entry>,然后将该键值对放入list;如果不为null则遍历list查看是否有相同的key(依据equals),如果存在则将对应的oldValue替换成value,否则直接将键值对添加到list

    Map中查找元素的过程:首先利用hashCode()计算key的hash值得到数组下标,如果该下标处值为null则返回null,否则取出对应list,遍历查找对应key的键值对,如果找到了返回该键值对的value,否则返回null

    散列表中的“槽位”通常称为“桶位”(bucket),为使散列分布均匀,桶的数量通常使用2的整数次方,并且用掩码代替除法

    工具类 Collections

    实用方法

    max(),min() 

    reverse(List list) 逆转所有元素的次序

    rotate(List list , int distance) 将所有元素向后移动distance个位置,末尾的元素循环到前面来

    shuffle(List list ,(Random rand)) 将所有元素顺序打乱可以用指定随即源

    sort(List list (Comparator comp)) 按照元素的自然顺序或者提供的顺序排序

    swap(List list ,int i ,int j) 交换指定表中位置i和位置j的元素,通常比自己写的代码快!!!!

    disjoint(Collection c1,Collection c2) 当两个集合中没有任何元素相同时返回true

    frequency(Collection c ,Object o) 返回集合中等于o的元素个数

    unmodifiableXXX(? extends XXX) 将容器设置为不可变

    快速报错

    防止多个进程同时修改一个容器的内容等使容器不稳定的情况,例如在获取到迭代器后又添加元素再进行迭代的情况

  • 相关阅读:
    Linux新手入门:通过chmod改变文件权限--转
    一个非常好的性格切割问题
    Weka算法Classifier-tree-J48源代码分析(一个)基本数据结构和算法
    百度地图3.1课程—检索演示
    JAVA在IO流量汇总
    crm2011i创建nt类型字段
    学习vi和vim编辑(3):一个简单的文本编辑器(2)
    禹洲:我们这一代人的困惑
    D其他项目打电话AL工程EF Model
    HDU 2289 Cup(可以二分法,但是除了它的一半?)
  • 原文地址:https://www.cnblogs.com/xiao-ji-xiang/p/9763658.html
Copyright © 2020-2023  润新知