搜索
写经验 领红包
 > 生活

java中常见的类有哪些(java常见类型)

导语:比较全面的介绍一下Java中常见的几种map以及应用场景

java中常见的类有哪些(java常见类型)

有些比较传统的面试官经常会问依稀啊比较经典的问题,比如Java中map都哪些实现类,分别适用什么样的场景等等,网上有很多介绍的博客,大部分都是千篇一律相互抄的,今天我看着Java源码(JDK版本是1.7的),比较全面的好好总结整理一下,以后以便参考;其中最为常用的就是HashMap,hashtable,ConcurrentHashMap,treemap ,hashset等其他不能常用的还有ListOrderedMap,ConcurrentSkipListMap;下面开始逐个地介绍一下;

hashmap

使用数组+链表实现(1.8以后变成数组+链表和红黑树实现),具体实现逻辑就不写了,因为文章的重点不是介绍实现,它的复杂度最差是O(n),最快的O(1),它是线程不安全的Map,方法上都没有synchronized关键字修饰;

hashtable

功能与HashMap类似,不同点是,承自Dictionary类,并且是线程安全的,但在任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换,它的时间复杂度跟hashmap一样

ConcurrentHashMap

1.它使用Collections的 synchronizedMap方法使HashMap具有线程安全的能力;

2.就是使用concurrentHashMap。ConcurrentHashMap 是设计为非阻塞的。在更新时会局部锁住某部分数据,但不会把整个表都锁住。同步读取操作则是完全非阻塞的。好处是在保证合理的同步前提下,效率很高。坏处是严格来说读取操作不能保证反映最近的更新。例如线程A调用putAll写入大量数据,期间线程B调用get,则只能get到目前为止已经顺利插入的部分数据。

LinkedHashMap

LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。在需要保证顺序的情境下,使用LinkedHashMap。时间复杂度是O(n)

TreeMap

TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap。在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。

HashSet

对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。

ConcurrentSkipListMap

ConcurrentSkipListMap是一种线程安全的并发访问的排序映射表。内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找、插入、删除操作。注意,调用ConcurrentSkipListMap的size时,由于多个线程可以同时对映射表进行操作,所以映射表需要遍历整个链表才能返回元素个数,这个操作是个O(log(n))的操作。

ListOrderedMap里面实现跟普通map实现是一致的,只是把key在List中存了一份;

本文内容由快快网络小迪创作整理编辑!