加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 运营 > 正文

机器人技术的使用案例

发布时间:2021-02-01 10:21:08 所属栏目:运营 来源:互联网
导读:面试第一题必问的 HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性: HashMap 的存取是没有顺序的。 KV 均允许为 NULL。 多线程情况下该类安全,可以考虑用 HashTable。 JDk8底层是数组 + 链表 + 红黑树,JDK7底层是数组

面试第一题必问的 HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性:

  1. HashMap 的存取是没有顺序的。
  2. KV 均允许为 NULL。
  3. 多线程情况下该类安全,可以考虑用 HashTable。
  4. JDk8底层是数组 + 链表 + 红黑树,JDK7底层是数组 + 链表。
  5. 初始容量和装载因子是决定整个类性能的关键点,轻易不要动。
  6. HashMap是懒汉式创建的,只有在你put数据时候才会 build。
  7. 单向链表转换为红黑树的时候会先变化为双向链表最终转换为红黑树,切记双向链表跟红黑树是共存的。
  8. 对于传入的两个key,会强制性的判别出个高低,目的是为了决定向左还是向右放置数据。
  9. 链表转红黑树后会努力将红黑树的root节点和链表的头节点 跟table[i]节点融合成一个。
  10. 在删除的时候是先判断删除节点红黑树个数是否需要转链表,不转链表就跟RBT类似,找个合适的节点来填充已删除的节点。
  11. 红黑树的root节点不一定跟table[i]也就是链表的头节点是同一个,三者同步是靠MoveRootToFront实现的。而HashIterator.remove()会在调用removeNode的时候movable=false。

常见HashMap考点:

  1. HashMap原理,内部数据结构。
  2. HashMap中的put、get、remove大致过程。
  3. HashMap中 hash函数实现。
  4. HashMap如何扩容。
  5. HashMap几个重要参数为什么这样设定。
  6. HashMap为什么线程不安全,如何替换。
  7. HashMap在JDK7跟JDK8中的区别。
  8. HashMap中链表跟红黑树切换思路。
  9. JDK7中 HashMap环产生原理。

2、ConcurrentHashMap

ConcurrentHashMap 是多线程模式下常用的并发容器,它的实现在JDK7跟JDK8区别挺大的。

2.1 JDK7

JDK7中的 ConcurrentHashMap 使用 Segment + HashEntry 分段锁实现并发,它的缺点是并发程度是由Segment 数组个数来决定的,并发度一旦初始化无法扩容,扩容的话只是HashEntry的扩容。
 

对于这样段代码,无论你用多少线程同时调用、怎么调用、什么时候调用都会返回2,这段代码就是线程安全的。

那么我们该怎样写出线程安全的代码呢?要回答这个问题,我们需要知道我们的代码什么时候呆在自己家里使用私有资源,什么时候去公共场所浪使用公共资源,也就是说你需要识别线程的私有资源和共享资源都有哪些,这是解决线程安全问题的核心所在。
 

因此我们可以看到,这里有两种情况:

  • 线程私有资源,没有线程安全问题
  • 共享资源,线程间以某种秩序使用共享资源也能实现线程安全。

本文都是围绕着上述两个核心点来讲解的,现在我们就可以正式的聊聊编程中的线程安全了。

什么是线程安全

我们说一段代码是线程安全的,当且仅当我们在多个线程中同时且多次调用的这段代码都能给出正确的结果,这样的代码我们才说是线程安全代码,Thread Safety,否则就不是线程安全代码,thread-unsafe.。非线程安全的代码其运行结果是由掷骰子决定的。

怎么样,线程安全的定义很简单吧,也就是说你的代码不管是在单个线程还是多个线程中被执行都应该能给出正确的运行结果,这样的代码是不会出现多线程问题的,就像下面这段代码:

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读