Java基础(二)

  • 问 Java中有哪些容器(集合类)
    答: Java中的集合类主要是由Collection和Map这两个接口派生出来的,其中Collection接口又派生出三个子接口,分别是Set,List,Queue.所有的Java集合类,都是Set,List,Queue.Map这四个接口的实现类,这四个接口将集合分成了四个大类,其中
  1. Set代表无序的,元素不可重复的集合.
  2. List代表有序的,元素可以重复的集合.
  3. Queue代表先进先出(FIFO)的队列
  4. Map代表具有映射关系(Key-Value)的集合

拓展阅读

Collection体系的继承树


Collection体系的继承树

Map体系的继承树


Map体系的继承树

注:紫色框体代表接口,其中加粗的代表四类集合的接口. 蓝色框代表实现类,其中有阴影的是常用实现类

  • 问:Java中的容器,线程安全和线程不安全的分别有哪些?
    答: java.util包下的集合类大部分都是线程不安全的,例如常用的HashSet.TreeSet.ArrayList.LinkedList.ArrayDeque.HashMap.TreeMap,这些都是线程不安全的集合类,优点是性能好. 如果需要使用线程安全的集合类,则可以使用Collections工具类提供的synchronizedXxx(),将这些集合类包装成线程安全的集合类

java.util包下也有线程安全的集合类,例如Vector,Hashtable.这些集合类都是比较古老的API. 虽然实现了线程安全,但是性能很差.

从Java5开始,Java在java.util.concurrent包下提供了大量支持高效并发访问的集合类,它们既能包装良好的访问性能,有能包装线程安全.这些集合类可以分为两部分,它们的特征如下:

  1. 以Concurrent开头的集合类:
    以Concurrent开头的集合类代表了支持并发访问的集合,它们可以支持多个线程并发写入访问,这些写入的线程的所有操作都是线程安全的,但读取操作不必锁定.以Concurrent开头的集合类采用了更复杂的算法来保证永远不会锁住整个集合,因此在并发写入时有较好的性能.
  2. 以CopyOnWrite开头的集合类:
    以CopyOnWrite开头的集合类采用复制底层数组的方式来实现写操作.当线程对此类集合执行读操作时,线程将会直接读取集合本身,无须加锁与阻塞.当线程对此类集合执行写入操作时,集合会在底层复制一份新的数组,接下来对新的数组执行写入操作. 由于对集合的写入操作都是对数组的副本执行操作,因此它是线程安全的.

拓展阅读

java.util.concurrent包下的线程安全的类的体系结构


concurrent包下线程安全的集合类
  • 问 Map接口有哪些实现类?
    答:常用的有HashMap.LinkedHashMap.TreeMap.ConcurrentHashMap.
    对于无需排序的场景,优先考虑HashMap. 因为它是性能最好的Map实现. 如果要保证线程安全,则使用ConcurrentHashMap. 它的性能好于Hashtable,因为在put时会采用分段锁/CAS的加锁机制,而不是像HashTable,put和get都做同步处理.
    如果需要排序,按插入顺序排序则可以使用LinkHashMap. 如果要Key按照自然顺序排序甚至自定义顺序排序,则可以选择TreeMap. 如果要保证线程安全,则可以使用Collections工具类包装成线程安全的Map
  • 问: 描述下Map put的过程
    答: HashMap最经典,以此为例
  1. 首次扩容
    先判断数组是否为空,若数组为空则进行第一次扩容(resize)
  2. 计算索引
    通过hash算法,计算键值对在数组中的索引
  3. 插入数据
    如果当前位置为空,则直接插入数据
    如果当前位置元素非空,且Key存在,则直接覆盖其value
    如果当前位置元素非空,且key不存在,则将数据链到链表末端
    若链表长度达到8,则将链表转成红黑树,并将数据插入树中
  4. 再次扩容
    如果数组元素个数(size)吃过threshold,则再次进行扩容操作.

拓展阅读

HashMap添加数据的详细过程


HashMap添加数据过程
  • 问: 如何得到一个线程安全的Map?
    答: 1. 使用Collections工具类,将线程不安全的Map包装成线程安全的Map;
  1. 使用java.util.concurrent包下的Map,如ConcurrentHashMap;
  2. 不建议使用HashTable,虽然线程安全,但性能较差.
  • 问 HashMap有啥特点
  1. HashMap是线程不安全的实现,高效率
  2. HashMap可以使用null作为key或value
  • HashMap为什么线程不安全?
    答: HashMap在并发执行put操作时,可能会导致形成循环链表,从而引起死循环.

  • HashMap如何实现线程安全?

  1. 直接使用Hashtable类
  2. 直接使用ConcurrentHashMap
  3. 使用Collections将HashMap包装成线程安全的Map
  • 问 介绍下ConcurrentHashMap是如何实现的?
    答: jdk1.7和jdk1.8中不同
    在1.7中ConcurrentHashMap由Segment数据结构和HashEntry数组结构构成. 采取分段锁来保证安全性. Segment扮演锁的角色,HashEntry用于存储键值对数据.


    在jdk1.7中ConcurrentHashMap的数据结构

    在1.8中的实现已经摒弃了Segment的概念,直接使用了Node数组+链表+红黑树的数据结构来实现.并发控制使用Synchronized和CAS来操作.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 请你谈谈大O符号(big-O notation)并给出不同数据结构的例子 考察点:JAVA notation 参考...
    天涯的尽头s风沙阅读 484评论 0 1
  • 1.JDBC 作用:连接数据库并发送SQL语句,本身不具备操作数据库的能力。 流程:1)注册驱动; Class.f...
    sunnysans阅读 292评论 0 1
  • 目录 1 Java基础 2 Java集合 3 Java多线程 4 JVM 5 常见问题汇总参考资料 ·...
    小小千千阅读 1,092评论 0 0
  • Java提升 集合 1.集合基础 1.导包 2.创建 ArrayList array = new ArrayLi...
    HWjoker阅读 162评论 0 1
  • 面向对象特征;重载和重写;静态绑定和动态绑定;抽象类和接口;包。 面向对象的特征 面向对象的三个基本特征是:封装、...
    isuntong阅读 372评论 0 0