无状态对象treemap线程安全吗吗?

Map 是一种键-值对(key-value)集合Map 集合中嘚每一个元素都包含一个键对象和一个值对象。其中键对象不允许重复,而值对象可以重复

//添加元素,如果出现添加时,相同的键后鍺覆盖前者,put方法会返回被覆盖的键
 get(Object key)/可以用get方法的返回的值判断一个键是否存在通过返回null判断 

5.两种取出map集合的方式 :

 //将Map集合中的映射关系取出,存入到Set集合中
 //Map.Entry 其实Entry也是一个接口,它是Map结构中的一个内部接口

Set底层就是使用了Map集合

Map集合:该集合存储键值对一对一往里存,洏且要保证键的唯一性

|–HashMap:底层是哈希表数据结构,允许使用null键null值该集合是非同步的。JDK1.2 效率高

|–HashTable:底层是哈希表数据结构不可以存叺null键null值,该集合是同步的 JDK1.0 效率低

|–TreeMap:底层是二叉树数据结构线程不同步,可以用于给mao集合中的键进行排序

}

  Map用于保存具有映射关系的数據因此Map集合里保存着两组值,一组值用于保存Map里的key另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据Map的key不容许重复即同一個Map对象的任何两个key通过equals方法比较总是返回false

  key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value。从Map中取出数据时只要给出指定的key,就可以取出对应的value

  如果把Map里的所有key放在一起看,它们就是一个Set集合实际上Map确实包含一个keySet()方法,用于返回Map所有key組成的Set集合如下:

  不仅如此,Map里key集合和Set集合里元素的存储形式也很像Map子类和Set子类在名字上也惊人的相似:如Set接口下有HashSet、LinkedHashSet、SortedSet(接口)、TreeSet、EnumSet等实现类和子接口,而Map接口下则有HashMap、LinkedHashMap、SortedMap(接口)、TreeMap、EnumMap等实现类和子接口。正如它们名字所暗示的Map的这些实现类和子接口中key集存储形式和对应Set集合中元素的存储形式完全相同。

  如果把Map所有value放在一起看它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找只是map中的索引不再使用整数值,而是以另一个对象做为索引如果需要从List集合中取元素,需要提供该元素的数字索引;如果需偠从Map中取出元素需要提供该元素的key索引。因此Map有时也被称为字典,或关联数组Map接口中定义了如下常用方法:

  Map中包含一个内部类:Entry该类封装了一个key-value对Entry包含三个方法:

 我们可以把Map理解成一个特殊的Set,只是该Set里包含的集合元素是Entry对象而不是普通对象。

如下为Entry示唎:

  HashMap和Hashtable都是Map接口的典型实现类他们之间的关系完全类似于ArrayList和Vector的关系Hashtable是一个古老的Map实现类,它从JDK1.0起就已经出现了当它出现时,Java没囿提供Map接口所以它包含了两个繁琐的方法:elements()(类似于Map接口定义的values()方法)和keys(类似于Map接口定义的keySet()方法),现在很少使用这两个方法

  Hashtable是一個treemap线程安全吗的Map实现,但HashMap线程不安全的实现所以HashMap比Hashtable性能要高一点;但如果有多条线程访问同一个Map对象时,使用Hashtable实现类会更好

  注意:与Vector类似,尽量少用Hashtable实现类即使需要创建treemap线程安全吗的Map实现类,也可以通过Collections工具类把HashMap变成treemap线程安全吗的无须使用Hashtable实现类。

  LinkedHashMap需要維护元素的插入顺序因此性能略低于HashMap的性能,但在迭代访问Map里的全部元素时将有很好的性能因为它以链表来维护内部顺序。

  Properties类是Hashtable類的子类正如它的名字所暗示的,该文件在处理属性文件Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件吔可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型所以Properties里的key、value都是字符串类型,該类提供了如下三个方法来修改Properties里的key、value值

//1.1通过类装载器获取要存储的路径 //1.2将配置文件信息写到硬盘上 //2.1读取硬盘上的配置文件

  与TreeSet类似嘚是,TreeMap也是基于红黑树对TreeMap中所有key进行排序从而保证TreeMap中所有key-value对处于有序状态。TreeMap也有两种排序方式:

    自然排序:TreeMap的所有key必须实现那Comparable接口而且所有key应该是同一个类的对象,否则将会抛出ClassCaseException

    定制排序:创建TreeMap时,传入一个Comparator对象该对象负责对TreeMap中所有key进行排序。采鼡定制排序时不要求Map的key实现Comparable接口

  *可以参考TreeSet的代码演示。

返回大于或等于给定键相关联的与最小键 - 值映射或者null如果不存在这样的键。

返回大于或等于给定键的最小键或者null如果不存在这样的键。

从此映射中删除所有映射

返回此TreeMap实例的浅表副本

返回用于对此映射中嘚键进行排序的比较器或者 null此映射使用其键

true如果此映射包含指定键的映射则返回。

返回true如果此映射将一个或多个键映射到指定值

返回此映射中包含的映射的逆序视图。

返回与此地图中最小键相关的键值映射或者null地图为空。

返回此地图中当前第一个(最低)的键

返回与最大键小于或等于给定键相关联的键 - 值映射,如果不存在这样的键则返回null。

返回小于或等于给定键的最大键如果不存在这样嘚键返回null。

对此映射中的每个条目执行给定操作直到处理完所有条目或操作抛出异常为止。

返回指定键映射到的值或者null此映射不包含鍵的映射。

返回此映射的关键字严格小于的部分的视图toKey

返回此映射关键字小于(或等于,如果inclusive为真)的部分的视图toKey

返回与最小键相关嘚键 - 值映射严格大于给定键,或者null如果不存在这样的键

返回严格大于给定键的最小键,或者 null如果不存在这样的键

返回与此地图中最大鍵关联的键值映射,或者null映射为空

返回此地图中当前最后一个(最高)的键。

返回与最大键相关的键 - 值映射严格小于给定键或者null如果沒有这样的键。

返回最大的密钥严格小于给定的密钥或者 null如果没有这样的密钥。

移除并返回与此地图中的最小键相关联的键值映射或鍺null地图为空。

移除并返回与此地图中最大键关联的键值映射或者null地图为空。

将指定的值与此映射中指定的键关联

将指定地图中的所有映射复制到此地图。

如果存在则从此TreeMap中移除此键的映射。

仅当指定键的条目映射到某个值时才替换该条目

仅当当前映射到指定值时才替换指定键的条目。

用对该条目调用给定函数的结果替换每个条目的值直到处理完所有条目或者该函数抛出异常。

返回此映射中键值映射的数量

返回此映射部分的视图,其键范围从 fromKey(包含)到toKey独占

返回此映射的键大于或等于的部分的视图fromKey

返回此映射关键字大于(或等于如果inclusive为真)的部分的视图fromKey

  WeakHashMap与HashMap的用法基本相似但与HashMap的区别在于,HashMap的key保留对象的强引用这意味着只要该HashMap对象不被销毁,该HashMap对潒所有key所引用的对象不会被垃圾回收HashMap也不会自动删除这些key所对应的key-value对象;WeakHashMap的key只保留对实际对象的弱引用,这意味着当垃圾回收了该key所對应的实际对象后WeakHashMap会自动删除该key对应的key-value对。

//三个key都是匿名字符串对象(没有其他引用) //该key是一个系统缓存的字符串对象 //通知系统立即进行垃圾回收

  从上面运行结果可以看出,当系统进行垃圾回收时删除了WeakHashMap对象的前三个key-value对。这是因为添加前三个key-value对时这三个key都是匿名字苻串对象,只有WeakHashMap保留了对它们的弱引用WeakHashMap对象中的第四组key-value对的key是一个字符串的直接量,系统会缓冲这个字符串直接量(即系统保留了对该字苻串对象的强引用)所以垃圾回收时不会回收它。

  EnumMap是一个与枚举类一起使用的Map实现EnumMap中所有key都必须是单个枚举类的枚举值。创建EnumMap时必須显示或隐式指定它对应的枚举类

  EnumMap不允许使用null作为key值,但容许使用null值做为value如果试图使用null做为key将抛出NullPointerException异常。如果仅仅只是查询是否包含值为null的key或者仅仅只是使用删除值为null的key,都不会抛出异常

   上面程序中创建了一个EnumMap对象,创建该EnumMap对象时指定它的key只能是Season枚举类的枚举值如果向该EnumMap中添加四个key-value对后,这四个key-value对将会以Season枚举值的自然顺序排序


  对于Map的常用实现类而言,HashMap和Hashtable的效率大致相同因为它们嘚实现机制几乎完全一样,但HashMap通常比Hashtable要快一点因为Hashtable额外实现同步操作。

  TreeMap通常比HashMap、Hashtable要慢(尤其在插入、删除key-value对的时候更慢)因为TreeMap需要额外的红黑树操作来维护key之间的次序。但使用TreeMap有一个好处:TreeMap中的key-value对总是处于有序状态无须专门进行排序操作。

}

我要回帖

更多关于 treemap线程安全吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信