澳门新葡萄京官网首页 3

澳门新葡萄京官网首页Java 容器和泛型HashSet,TreeSet 和 LinkedHashSet比较

一、Set回顾

一个不饱含重复成分(包蕴可变对象)的Collection,是一种无序的聚合。Set不带有满
a.equals(b卡塔尔 的成分对a和b,何况最多有二个null。

泥瓦匠的纪念皇城:

1、不允许包含相同元素

2、决断目标是还是不是一致,依据equals方法

澳门新葡萄京官网首页 1

集合概述

  • 集结用来积攒数据不等的指标,且必须要保留对象,实际保存的是指标的引用变量
  • 金口玉牙由多少个接口派生而出,Collection(派生了Set List Queue卡塔尔国 Map
  • Set冬天不另行,List有序重复,Map key-value队,Queue是队列完成

澳门新葡萄京官网首页 2

澳门新葡萄京官网首页 3


10.1 Set集合

       
Set接口世襲Collection接口,未有提供额外的秘诀。Set集合不准包蕴形似的要素,向Set集结增加已存在的要素时,add(卡塔尔方法重回false。

二、HashSet

八个按着Hash算法来囤积会集中的成分,其成分值能够是NULL。它无法承保成分的排列顺序。相符,HashSet是不一齐的,要是要求八十多线程访谈它的话,能够用
Collections.synchronizedSet 方法来包装它:

Set s = Collections.synchronizedSet(new HashSet(...));

同上一节同样,用迭代器的时候,也要注意 并发改善十二分ConcurrentModificationException

要留意的地点是,HashSet集合判断五个要素相等不单单是equals办法,而且必得hashCode(State of Qatar方法再次来到值也要对等。看上面包车型地铁例子:

import java.util.HashSet;

class EuqalsObj
{
    public boolean equals(Object obj)
    {
        return true;
    }
}

class HashCodeObj
{
    public int hashCode()
    {
        return 1;
    }
}

class HashSetObj
{
    public int hashCode()
    {
        return 2;
    }

    public boolean equals(Object obj)
    {
        return true;
    }
}

public class HashSetTest
{
    public static void main(String[] args)
    {
        HashSet objs = new HashSet();
        objs.add(new EuqalsObj());
        objs.add(new EuqalsObj());
        objs.add(new HashCodeObj());
        objs.add(new HashCodeObj());
        objs.add(new HashSetObj());
        objs.add(new HashSetObj());

        System.out.println("HashSet Elements:");
        System.out.print("/t" + objs + "/n");
    }
}

Run 一下,调节台如下输出:

HashSet Elements:
    [HashCodeObj@1, HashCodeObj@1, HashSetObj@2, EuqalsObj@1471cb25, EuqalsObj@3acff49f]

泥瓦匠依据结果,一一到来。首先,排列顺序不定。

HashSetObj 类知足我们刚刚的必要,所以集结中独有七个且它的HashCode值为2。

HashCodeObj
类固然它们HashCode值为1,可是她们不对等。(其实当HashCode值同样,那一个蕴藏地点会选取链式构造保留几个HashCodeObj对象。)

平等,EqualsObj
类他们非常,不过他们HashCode值不等,分别为1471cb25、3acff49f。

因此,用HashSet增加可变对象,要小心当指标有非常大或许改造后和其余对象冲突,那样大家不可能从HashSet找到确切我们必要的目的。

Collection和Iterator接口

  • Collection是Set List
    Queue的父接口,该接口里提供的不二秘籍能够操作Set、List、Queue会集。有add
    addAll clear contains containsAll isEmpty iterator remove removeAll
    retainAll size toArray。
  • 装有的Collection完结类都已经重写了toString(卡塔尔方法
  • Iterable是Collection的二个父接口,其forEach(Consumer
    action卡塔尔(قطر‎暗中同意方法能够用来遍历集结成分,Consumer是函数式接口,能够用Lambda表明式
  • Iterator接口首要用以遍历Collection会集成分,Iterator对象被叫做迭代器
  • Iterator提供的办法:hasNext next remove forEachRemaining(java8新扩大卡塔尔国
  • 用集结实例调用Iterator布局器创造迭代器实例,Iterator必得凭借于Collection对象
  • 值传递,修改迭代变量的值对集中无影响
  • 运用Iterator迭代做客集合成分时,只可以通过remove(卡塔尔国next(State of Qatar重临的因素,别的改正都不许,一旦检查评定到群集被更动,会立马引发这些
  • Collection还能用foreach循环来迭代拜访集结成分,在迭代中同样不能够改动集合
  • Collection新扩大removeIf(Predicate filter卡塔尔批量去除适合条件的集合成分
  • Predicate是函数式接口,其test方法检查评定对象是或不是满意钦定条件
  • 单身行使Steam
    • 应用Steam或XxxSteam的builder(卡塔尔类措施创设Stream对应的Builder
    • 双重调用Builder的add(卡塔尔国方法向该流中增多三个因素
    • 调用Builder的build(卡塔尔方法得到相应的Stream
    • 调用Stream的会集方法
  • 对于大好些个的集聚方法,每一种Stream只可以实行一回,分为中间方法和后边方法,流的章程又三个特性,有气象的措施和围堵方法
  • Stream常用中间方法:filter mapToXxx peek distinct sorted limit
    常用末端方法:forEach toArray reduce min max count anyMatch allMatch
    nonMatch findFirst findAny
  • 选择Collection接口提供的一个stream(State of Qatar暗中认可方法重返集结对应的流,使用流式API来全体操作会集成分很有益于

10.2 HashSet类

       
HashSet按Hash算法存储集结中的成分,具备能够的质量。Hash会调用该对象的hashCode(卡塔尔方法来博取该指标的hashCode值,然后依照hashCode值决定该对象在集合里的积累地点。即HashSet会集选取hash算法来决定成分的囤积地点

        HashSet中各样能存款和储蓄成分的职位被称呼“桶”。

    HashSet具有如下特征:

        – 成分的排列顺序与增加种种不鲜明雷同。

        – 不是线程同步的。

        – 集结成分能够是null

    HashSet判定四个因素相等的正经:

        八个对象通过equals(State of Qatar方法相比相等,并且五个对象的hashCode(卡塔尔(قطر‎方法再次来到值也相当于。

    HashSet重写equals和hashCode方法的准绳:

       
如果八个目的通过equals(卡塔尔国方法比较再次来到true,那多少个对象的hashCode(State of Qatar值也应当相符。

 
  注意:要是HashSet存款和储蓄了可变类,对某一个要素的改变以致会集中冒出三个一律的成分,未被更改的因素得以被去除,校订后的要素不可能被删去。因为HashSet依照hashCode值找到存款和储蓄地方,然后用equals推断相等。

三、LinkedHashList

HashSet的子类,也长久以来有HashCode值来决定成分地方。可是它应用链表维护成分的程序。记住八个字:有序

稳步的妙用,复制。举个例子泥瓦匠达成多少个HashSet冬日加多,然后复制多个一致次序的HashSet来。代码如下:

package com.sedion.bysocket.collection;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashListTest
{
    public static void main(String[] args)
    {
        /* 复制HashSet */
        Set h1 = new HashSet<String>();
        h1.add("List");
        h1.add("Queue");
        h1.add("Set");
        h1.add("Map");

        System.out.println("HashSet Elements:");
        System.out.print("/t" + h1 + "/n");

        Set h2 = copy(h1);
        System.out.println("HashSet Elements After Copy:");
        System.out.print("/t" + h2 + "/n");
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static Set copy(Set set)
    {
        Set setCopy = new LinkedHashSet(set);
        return setCopy;
    }

}

Run 一下,调节台出口:

HashSet Elements:
    [Map, Queue, Set, List]
HashSet Elements After Copy:
    [Map, Queue, Set, List]

足见,各样数据布局都有它存在的理由。

Set集合

  • Set与Collection基本相通,未有提供额外的法门,Set不相同意饱含重复成分,不能够记住成分增多顺序
  • Set四个常用完毕类,HashSet TreeSet EnumSet

HashSet

  • HashSet是Set接口的卓逸不群实现,多数时候都用那个,按Hash算法来存款和储蓄集结中的成分,具备很好的存取和寻找品质
  • 特点:无法确定保证成分的排列顺序、不是同台的,必需透过代码来担保其同台、集合成分能够是null
  • 向聚集中存入贰个因素时HashSet会调用hashCode(State of Qatar方法获得该对象的hashCode值,依照值决定成分的仓储位置
  • HashSet判别四个因素的杰出标准是equals(卡塔尔相比相等而且hashCode(卡塔尔国方法重临值相等,所以重写方法时尽大概确认保障equals(State of Qatar和hashCode(卡塔尔(قطر‎比较结实相像
  • equals(卡塔尔相等hashCode(卡塔尔(قطر‎不等时,会将多个一律成分保存在差别岗位,违背了Set的平整。equals(State of Qatar不等hashCode(卡塔尔国相等时会在三个职位上用链式布局保留多个目的,招致定位品质降低。
  • 重写hashCode(卡塔尔方法的着力准绳:
    • 程序运营中,同一对象往往调用hashCode(卡塔尔方法应该回到相等的值
    • 七个指标equals(State of Qatar重返true时,hashCode(卡塔尔(قطر‎也理应又平等的重返值
    • 指标中用来equals(卡塔尔国方法相比正式的实例变量也都应当用于总结hashCode值
  • 当程序把可变对象增加到HashCode中后,尽量不要去改善参加计算hashCode(卡塔尔国和equals(卡塔尔国的实例变量,不然会形成HashSet不能够正确操作那些集结成分
  • HashSet有三个子类LinkedHashSet,它同有时间采取链表维护成分次序,遍历时会按要素增添顺序来做客
  • LinkedHashSet因为需求保障成分的插入顺序,质量略低于HashSet,但在迭代作客全体因素时有优质的质量

TreeSet

  • TreeSet是SortedSet接口的兑现类,能够保障成分处于排序状态
  • 比起HashSet额外提供的主意:comparator first last lower higher subSet
    headSet tailSet
  • TreeSet采纳红黑树的数据布局存款和储蓄会集成分,扶持三种排序形式:自然排序和定制排序,暗许自然排序
  • 当然排序调用Comparable接口的compareTo(卡塔尔国方法来比较成分大小关系,然后升序排列
  • 累计到自然排序TreeSet的目的必得落实了Comparable接口,达成了compareTo(卡塔尔方法
  • 大好些个分类在落到实处compareTo(卡塔尔(قطر‎时都急需比较对象是相仿类的实例,所以向TreeSet中增加的应该是同二个类的靶子
  • TreeSet比较五个对象是还是不是等于的独一规范是compareTo(State of Qatar是不是重回0,重写equals(卡塔尔国时应有保障与compareTo(卡塔尔方法结果相仿
  • TreeSet能够去除未有被改善实例变量且不与其余被改动实例变量的指标重复的靶子
  • 当TreeSet中可变对象的实例变量被纠正时,管理这一个指标很复杂且轻易出错,所以并不是更动首要的实例变量
  • 定制排序,new
    TreeSet(Comparator对象卡塔尔(قطر‎,能够用Lambda表明式代替,依照此来排序
  • 反之亦然不得以拉长差异类的实例,相比较元素相等的专门的学业是Comparator

EnumSet

  • EnumSet中的成分必需是点名美国影视剧类型的枚举值,有序,以枚举值在枚举类内定义顺序来支配,不准参预null
  • 中间以位向量的样式储存,EnumSet对象占用内部存款和储蓄器命宫行作用高
  • EnumSet只好由此类方式来创造实例,allOf complementOf copyOf noneOf of
    range
  • 思索复制贰个Collection集结里的因从来成立EnumSet集适那时候,必得保险Collection会集里的享有因素都以同二个枚举类的枚举值

Set实现类的性格解析

  • HashSet比TreeSet质量好,极其是增添、查询等操作,独有当须要保持排序的Set时才使用TreeSet,其余时候理应利用HashSet
  • LinkedHashSet对于HashSet,普通的插入、删除操作相当的慢,但遍历会更加快
  • EnumSet是八个贯彻类中品质最棒的,不过只可以保留同一枚举类的枚举值作为集合成分
  • 多少个完毕类都以线程不安全的,必得手动保险集合的同步性,能够因此Collections工具类的synchronizedSortedSet来包装Set集结,最佳在成立时施行。

10.3 LinkedHashSet类

       
LinkedHashSet类是HashSet类的子类,依据成分的hashCode值来决定元素的蕴藏地点,使用链表维护元素的丰盛次序。遍历LinkedHashSet集合里的因素时,LinkedHashSet会根据成分的丰硕顺序来拜候会集里的要素。

四、TreeSet

TreeSet使用树结构完毕(红黑树),集结中的成分进行排序,不过增添、删除和满含的算法复杂度为O(log(n))。

举个例证吗,首先大家定义一个Bird类。(鸟是泥瓦匠最心爱的动物)

class Bird
{
    int size;

    public Bird(int s)
    {
        size = s;
    }

    public String toString()
    {
        return size + "";
    }

}

然后用TreeSet添加Bird类。

public class TreeSetTest
{
    public static void main(String[] args)
    {
        TreeSet<Bird> bSet = new TreeSet<Bird>();
        bSet.add(new Bird(1));
        bSet.add(new Bird(3));
        bSet.add(new Bird(2));

        Iterator<Bird> iter = bSet.iterator();

        while (iter.hasNext())
        {
            Bird bird = (Bird) iter.next();
            System.out.println(bird);
        }
    }
}

Run一下,调控台出口如下:

Exception in thread "main" java.lang.ClassCastException: Bird cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(Unknown Source)
    at java.util.TreeMap.put(Unknown Source)
    at java.util.TreeSet.add(Unknown Source)
    at com.sedion.bysocket.collection.TreeSetTest.main(TreeSetTest.java:29)

答案很显著,TreeSet是排序的。所以伯德要求贯彻Comparable此接口。

java.lang.Comparable此接口强行对贯彻它的各样类的靶子开展一体化排序。这种排序被称为类的自然排序,类的 compareTo 方法被称作它的自然相比艺术

修改Bird如下:

class Bird implements Comparable<Bird>
{
    int size;

    public Bird(int s)
    {
        size = s;
    }

    public String toString()
    {
        return size + "号鸟";
    }

    @Override
    public int compareTo(Bird o)
    {
        return size - o.size;
    }

}

再次Run一下:

1号鸟
2号鸟
3号鸟

List集合

  • List集结有序、可再一次,每一个成分都有相应的顺序索引,从0开首
  • List接口扩充的部分方法:get indexOf lastIndexOf set subList
    replaceAll sort,还会有一对原本艺术的重载
  • List决断几个对象相等的独一标准是equals(卡塔尔(قطر‎
  • set(int index, Object
    element卡塔尔国方法不会转移List集结的金奈,索引必需有效
  • sort(卡塔尔(قطر‎和replaceAll(State of Qatar都足以提供三个拉姆da表明式作为参数
  • List还特别提供listIterator(卡塔尔,重临一个ListIterator对象,ListIterator接口世襲了Iterator接口,增添了hasPrevious
    previous add 方法,增加了向前迭代的功用

ArrayList和Vector

  • 都以依照数组实现的,封装了七个动态的、可再分配的Object[]数组,不点名initialCapacity时,数组暗许长度为10
  • initialCapacity参数设置数组的长短,会自行扩张,当增加大量因素时能够用ensureCapacity(int
    minCapacity卡塔尔国方法贰遍性扩展initialCapacity大小,减少分配次数,进步质量
  • trimToSize(卡塔尔调治数董事长度等于当前成分个数
  • Vector比较古老,有好些个短处,不引入应用
  • ArrayList线程不安全,Vector线程安全,所以质量相对极低
  • Stack世襲了Vector,模拟栈,进出栈都以Object类型,须求类型调换,提供了peek
    pop push方法,同样比较古老不引进应用,应该思索ArrayDeque
  • Arrays工具类有个asList(卡塔尔国方法江数组转变到List群集,是Arrays内部类ArrayList的实例,固定长度,只可以遍历访谈,不能够增加和删除

10.4 TreeSet类

       
TreeSet类是SortedSet接口的兑现类,TreeSet集合内的要素处于平稳状态。TreeSet选取红黑树的数据布局来囤积会集成分。TreeSet中应丰裕肖似体系型的目的。

    TreeSet集合新扩展如下方法:

        – Comparator
comparator(卡塔尔(قطر‎:要是TreeSet使用的定制排序,此模式将回到使用的Comparator;若使用了当然排序,则赶回null。

        – Object first(卡塔尔:再次来到群集中的第多少个要素。

        – Object last(卡塔尔:重回集结中的最后三个要素。

        – Object lower(Object o卡塔尔国:小于o的最大因素,o不需求存在会集中。

        – Object higher(Object oState of Qatar:大于o的极小成分,o无需存在集结中。

        – SortedSet subSet(Object form, Object
toState of Qatar:重回form(满含)到to(不包蕴)之间的因素作为子集结。

        – SortedSet headSet(Object to卡塔尔:重临小于to的因素作为子集结。

        – SortedSet tailSet(Object
from卡塔尔:再次来到大于或等于from的要素作为子集结。

    落成了Compable接口的常用类及对比艺术:

        – BigDecimal和具备的数值型对应的包装类。

        – Character按UNICODE值实行比较。

        – Boolean按true大于false比较。

        – String按字符串中字符的UNICODE值举办比较。

        – Date、Time类,后边的日期时间比前边的大。

    自然排序:

        TreeSet会调用集结成分的compareTo(Object
o卡塔尔方法来比较成分之间的深浅关系,然后将集合成分按升序排序,即为自然排序。

        假诺筹划把多个对象增多到TreeSet时,该目的的类必需达成Comparable接口。假使指标的类未兑现Comparable接口,那么在走入成分和抽出成分时,程序将会抛出ClassCastException十分。

       
注意:如果TreeSet会集存储了可变类,对某叁个因素的退换导致集结中现身七个同样的要素,则未被改造的和校订未来的成分均不能够被成功删除。独有删除其余未被改变的要素,何况TreeSet对成分重新索引之后,发生再一次的成分才方可被删除。

    定制排序:

        创造TreeSet对象时传出三个Comparator达成类的目的,并且重写了int
compare(T o1, T o2卡塔尔国方法。那个时候目的的类无须实现Comparable接口。

    TreeSet判定多少个因素相等的科班:

        八个指标通过compareTo(Object o卡塔尔(قطر‎方法比较重返0。

    TreeSet重写equals和compareTo方法的平整:

       
假若三个对象通过equals方法相比较重回true时,那八个对象通过compareTo方法比较应重临0。

五、质量测量试验比较

本着地点二种Set会集,大家对它们的Add方法开展品质测量试验:

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.TreeSet;

class Bird implements Comparable<Bird>
{
    int size;

    public Bird(int s)
    {
        size = s;
    }

    public String toString()
    {
        return size + "号鸟";
    }

    @Override
    public int compareTo(Bird o)
    {
        return size - o.size;
    }

}
public class Set
{
    public static void main(String[] args)
    {
        Random r = new Random();

        HashSet<Bird> hashSet = new HashSet<Bird>();
        TreeSet<Bird> treeSet = new TreeSet<Bird>();
        LinkedHashSet<Bird> linkedSet = new LinkedHashSet<Bird>();

        // start time
        long startTime = System.nanoTime();

        for (int i = 0; i < 1000; i++) {
            int x = r.nextInt(1000 - 10) + 10;
            hashSet.add(new Bird(x));
        }
        // end time
        long endTime = System.nanoTime();
        long duration = endTime - startTime;
        System.out.println("HashSet: " + duration);

        // start time
        startTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            int x = r.nextInt(1000 - 10) + 10;
            treeSet.add(new Bird(x));
        }
        // end time
        endTime = System.nanoTime();
        duration = endTime - startTime;
        System.out.println("TreeSet: " + duration);

        // start time
        startTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            int x = r.nextInt(1000 - 10) + 10;
            linkedSet.add(new Bird(x));
        }
        // end time
        endTime = System.nanoTime();
        duration = endTime - startTime;
        System.out.println("LinkedHashSet: " + duration);
    }
}

Run一下,能够在调控台南看见:

HashSet: 2610998
TreeSet: 3195378
LinkedHashSet: 2673782

足见,TreeSet因为急需开展相比较,所以质量特不佳。

Queue

  • Queue用于模拟队列,Queue接口定义的办法:add element offer peek poll
    remove
  • Queue有三个PriorityQueue达成类,Deque子接口,Deque有ArrayDeque和LinkedList多少个达成类

PriorityQueue实现类

  • 保存队列成分的依次是按要素大小进行排列,peek抽取的是队列中幽微的成分,无法插入null
  • PriorityCity的toString()再次回到值影响看不到顺序输出
  • 当然排序,达成Comparable接口,且元素应是同贰个类的三个实例
  • 定制排序,传入Comparator对象,不供给兑现Comparable接口

Deque接口

  • Deque是Queue的子接口,代表双端队列,定义了部分双端队列的主意还提供了pop
    push,也足以充作栈来行使
  • Iterator
    descendingIterator()重回三个双端队列对应的迭代器,逆向顺序迭代队列中的成分
  • Deque接口提供了二个优越的落到实处类ArrayDeque,基于数组完结的双端队列,相像可钦赐八个numElements,钦点数主任度,不点名时暗许16,提供了push
    peek pop方法
  • ArrayDeque也足以当做队列使用,决意于使用的不二秘技

LinkedList

  • 况且达成了List和Deque,能够依照目录随机拜访会集的成分,能够被当成双端队列使用,能够做栈也得以做队列
  • LinkedList内部以链表的款式积存集合成分,随机拜访品质比较糟糕,可是插入删除成分的性质较好

线性表的脾性剖判

  • List是三个线性表接口,ArrayList和LinkedList是线性表的多个杰出完结,四个是基于数组的,一个是依照链表的。Queue代表队列,Deque代表双端队列。
  • 完全来讲ArrayList比LinkedList质量好,超过半数时候应该思量用ArrayList
  • 行使List集结的建议
    • 遍历List,对于ArrayList、Vector集合应该是用随机拜谒(get卡塔尔来遍历,对于LinkedList应该运用迭代器(Iterator卡塔尔(قطر‎来遍历
    • 屡屡插入删除成分应运用LinkedList,ArrayList和Vector日常重新分配内部数组大小品质很差
    • 八线程应思量动用Collections包装成线程安全的集合,而不是去用古老的联谊

10.5 EnumSet类

        EnumSet是极度为枚举设计的会集类,EnumSet中的全数因素必得为钦赐枚举类型的枚举值。EnumSet按枚举值在枚举类中的定义顺序对集合成分实行排序。

       
EnumSet内部以位向量的花样开展仓库储存。数据存款和储蓄紧密且神速,占用内部存储器小,运转效能好。

        Enum会集不准参加null成分

    EnumSet类提供如下类方法来创制对象(未提供布局器):

        – EnumSet allOf(Class
enumType卡塔尔(قطر‎:创建贰个包涵钦点枚举类全数枚举值的集纳。

        – EnumSet complementOf(EnumSet
s卡塔尔国:成立三个EnumSet相对枚举类为补集的汇聚。

        – EnumSet copyOf(Collection
cState of Qatar:依照只包涵相仿枚举类枚举值的日常集结来成立。

        – EnumSet copyOf(EnumSet
s卡塔尔(قطر‎:根据EnumSet集结来成立,三个聚众有雷同的枚举值。

        – EnumSet noneOf(Class
enumTypeState of Qatar:创立三个品种为钦命枚举类的空集合。

        – EnumSet of(E first/E…
rest卡塔尔(قطر‎:成立叁个含有多个或两个枚举值的集纳。

        – EnumSet range(E from, E
to卡塔尔(قطر‎:依照枚举类中form到to之间的枚举值创建集结,包涵两侧值。

六、总结

HashSet:equlas hashcode

LinkedHashSet:链式布局

TreeSet:相比,Comparable接口,品质比较糟糕

Map集合

  • Map用于保存具有映射关系额数据,键值对,key不容许再一次,key童工equals方法相比较
  • 键值一一对应,Map中全部的key组成了三个Set集结,Map的兑现类和子接口中的key集存款和储蓄形式和相应的Set会集成分的存放格局完全雷同
  • Java先达成了Map,然后经过包装三个享有value都为null的Map完毕了Set集结
  • Map常用艺术:clear containsKey containsValue entrySet get isEmpty
    keySet put putAll remove size values
  • Map中有一个之中类Entry,封装了三个键值对,提供了八个方法:getKey
    getValue setValue
  • 万小米上的键值对key重复,新加上的value将会覆盖原来的
  • 富有的Map完成类都重写了toString(State of Qatar
  • Java8新增Map方法:compute computeIfAbsent computeIfPresent forEach
    getOrDefault merge putIfAbsent replace replaceAll

HashMap和Hashtable

  • Hashtable是叁个古老的Map完结类,线程安全,,区别意null作为key和value
  • HashMap线程不安全,能够null作为key和value
  • HashMap和Hashtable的成分对象必需得以达成hashCode(State of Qatar和equals(State of Qatar并保管结果同样
  • 当订正了作为key的可变对象,会冒出和HashSet近似之处,所以尽可能不要使用可变对象,尽量不要涂改可变对象
  • LinkedHashMap,HashMap的子类,用双向链表来保安键值对的主次,与插入顺序保持一致
  • Properties是Hashtable的子类,在管理属性文件时相比便于,约等于贰个键值都以String的Map,getProperty
    setProperty load store

SortedMap接口和TreeMap实现类

  • Map接口有子接口SortedMap,TreeMap为实在现类
  • TreeMap时红黑数据结构,每一个键值对为八个红黑树节点,同样的三种排序方式,自然排序和定制排序,法则同TreeSet
  • TreeMap提供的拜会键值没有错点子:firstEntry firstKey lastEntry lastKey
    higherEntry higherKey lowerEntry lowerKey subMap tailMap headMap

WeakHashMap实现类

  • key只保留了对实在指标的弱援用,所以key所引述的靶子未有被其余强引用变量所引用,就有希望会被垃圾回笼,WeakHashMap也恐怕自行删除那一个键值对
  • 如若急需接纳弱援用,就不用让key援引的对象具有任何强援用,不然失去了动用WeakHashMap的含义

IdentityHashMap实现类

  • key相等规范为key1==key2严峻相等才以为是相等的
  • 允许null作为key和value,不保险顺序

EnumMap实现类

  • EnumMap的key都必得是单个枚举类的枚举值,创建EnumMap时要求显式或隐式钦赐它对应的枚举类
  • 在当中以数组格局保留,依据key在枚举类中的定义顺序维护键值对一一,不准null作为key,但足以看成value

Map完毕类质量解析

  • Hashtable和HashMap实现机制差十分的少一致,由于Hashtable相比古老且线程安全,所以常常比HashMap慢
  • TreeMap更加慢,不过总处于平稳状态,能够调用keySet(State of Qatar再利用toArray(卡塔尔生成key的数组,再选择Arrays的binarySearch(卡塔尔再排序的数组中高速地查询对象
  • 诚如应有多着想使用HashMao,供给排序好的构思用TreeMap
  • LinkedHashMap比HashMap慢,EnumMap质量最佳

10.6 各Set类的习性分析

        HashSet的习性总是比TreeSet好,独有当要求一个维持排序的Set是,才思量使用TreeSet。
LinkedHashSet在插入删除时,质量比HashSet差,但遍历成分时却越来越快。EnumSet是颇负集结中品质最佳的,不过只可以保留同一枚举类中的枚举值。

        HashSet、TreeSet、EnumSet都以线程不安全的。

HashSet和HashMap品质选项

  • hash表中桶独有一个因素时有最棒的习性,八个因素时以链表情势积攒在叁个桶里,按顺序搜索(hash冲突)
  • hash表的载重影子到达负载极限制时间,hash表胡自动成倍扩大桶地数量,将原来对象重新分配,放入新桶内,rehashing
  • 负载极限默许0.75,折中时间和控件成本地开采,所占内部存储器和查询支付

Collections工具类

  • 对List会集地排序操作的类情势:reverse shuffle sort swap rotate
  • 用以查找替换操作的类措施:binarySearch(保险List处于平稳状态State of Qatar max min
    fill frequency indexOfSubList replaceAll
  • 同步调控的类措施:synchronizedXxx(卡塔尔国将钦点会集打包成线程同步的聚众
    xxx c = Collections.synchronizedXxx(new XxxXxx());
  • 安装不可变会集的类措施:emptyXxx singletonXxx
    unmodifiableXxx,重返值为汇聚的只读版本

Enumeration接口

  • Enumeration时Iterator的古老版本,hasMoreElements nextElement
  • 唯有Vector Stack Hashtable BitSet这个古老的群集类扶助Enumeration

发表评论

电子邮件地址不会被公开。 必填项已用*标注