天道酬勤,学无止境

HashMap的基本原理及其内部数据结构

基本原理:

通过hash的方法获取对象的位置,通过put和get存储和获取对象。

存储对象时,将K/V传给put方法,它会对K的hashCode做hash从而得到bucket的位置,进一步进行存储。
如果没碰撞直接放到bucket中。
如果碰撞了,以链表的形式存在bucket后。
如果碰撞导致链表过长,就把链表转换成红黑树。
如果节点已经存在就替换old value(保证key的唯一性)。
如果bucket满了(超过load factor*current capacity),就要resize。

获取对象时,我们传K到get方法,它会对K的hashCode做hash从而得到bucket位置。
如果访问的节点是bucket里的第一个节点,则直接命中。
如果有冲突,则进一步调用key.equals()方法到树或链表中查找。其中,树的时间复杂度为O(logn);链表的时间复杂度为O(n)。

内部数据结构:

jdk7中hashMap采用数组+链表。

jdk8中hashMap采用数组+链表/红黑树。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 理解Java对象:要从内存布局及底层机制说起,话说....
    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:《类和对象在JVM中是如何存储的,竟然有一半人回答不上来!》 这篇文章主要会对Java对象进行详细分析,基于上一篇文章,对Java对象的布局及其底层的一些机制进行解读,相信这些会对后期JVM调优有很大的帮助。 对象的内存布局 在上篇文章中我们提到,对象在JVM中是由一个Oop进行描述的。回顾一下,Oop由对象头(_mark、_metadata)以及实例数据区组成,而对象头中存在一个_metadata,其内部存在一个指针,指向类的元数据信息,就是下面这张图: oop-klass而今天要说的对象的内存布局,其底层实际上就是来自于这张图。 了解过对象组成的同学应该明白,对象由三部分构成,分别是:对象头、实例数据、对齐填充组成,而对象头和示例数据,对应的就是Oop对象中的两大部分,而对齐填充实际上是一个只在逻辑中存在的部分。 对象头 我们可以对这三个部分分别进行更深入的了解,首先是对象头: 对象头分为MarkWord和类型指针,MarkWord就是Oop对象中的_mark,其内部用于存储对象自身运行时的数据,例如:HashCode、GC分代年龄、锁状态标志、持有锁的线程、偏向线程Id、偏向时间戳等。
  • 《深入理解Mybatis原理》 04-Mybatis一级缓存详解 及使用注意事项
    MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项。 本章目录结构: 什么是一级缓存?为什么使用一级缓存? Mybatis一级缓存是怎样组织的? 一级缓存的生命周期 Cache接口的设计及CacheKey定义一级缓存性能分析及使用注意事项 1. 什么是一级缓存?为什么使用一级缓存? 每当我们使用Mybatis开启一次与数据库的会话,都会创建一个SqlSession对象表示一次数据库会话.在一次数据库会话中,可能会多次查询相同的数据,如果不做任何措施的话,会反复执行相同sql与数据库交互,导致浪费宝贵资源。 为了解决这个问题,Mybatis会在一次SqlSession会话中创建一个本地临时简单缓存,缓存会话中执行的查询结果,当下一次有相同查询SQL执行时,首先到缓存中判断是否有数据,若命中缓存则直接返回结果,不需要再去查数据库。 如下图所示: 在一次数据库会话SqlSession中,当客户端要通过数据库获取数据时,首先会到Excetor中的localCache判断是否有该数据的缓存
  • 常考集合面试题(一)
    集合面试题目录其他文章地址一、集合容器概述1、什么是集合2、集合的特点3、集合和数组的区别4、使用集合框架的好处5、常用的集合类有哪些?6、List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点?7、集合框架底层数据结构8、哪些集合类是线程安全的?9、Java集合的快速失败机制 “fail-fast”?10、 fail-safe(安全失败)是什么?11.fail-fast(快速失败)和fail-safe(安全失败)比较12、怎么确保一个集合不能被修改?其他文章地址常考集合面试题(一)常考集合面试题-List接口(二)常考集合面试题之Set-Queue(三)常考集合面试题之Map(四)常考集合面试题-辅助工具(五)一、集合容器概述1、什么是集合用于存储数据的容器。2、集合的特点1、对象封装数据,对象多了也需要存储。集合用于存储对象。2、对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因为集合是可变长度的。3、集合和数组的区别1、数组是固定长度的;集合可变长度的。2、数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。3、数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。4、使用集合框架的好处1、容量自增长;2
  • Java的set、list和map
    Java的set、list和map 文章目录 Java的set、list和map一、Java集合类体系结构二、集合迭代器三、有序集合:listArraylistLinkedListVector 四、无序集合:setSetHashSetLinkedHashSetTreeSetSet集合总结 五、键值对:mapHashMapTreeMapHashTableLinkedHashMap一、Java集合类体系结构二、集合的迭代器三、有续集:listArrayList:LinkedList:Vector: 四、无续集:setSetHashSetLinkedHashSetTreeSetSet集合总结 五、键值对:mapHashMapTreeMapHashtable**LinkedHashMap** 一、Java集合类体系结构 二、集合迭代器 三、有序集合:list Arraylist LinkedList Vector 四、无序集合:set Set HashSet LinkedHashSet TreeSet Set集合总结 五、键值对:map HashMap TreeMap HashTable LinkedHashMap 一、Java集合类体系结构 Java的所有的集合体系都是实现了Collection接口,所有通用的 Collection 实现类(通常通过它的一个子接口间接实现
  • Java学习笔记之 面向对象基本概念
    1. 对象 面向对象程序设计是将人们认识世界过程中普遍采用的思维方法应用到程序设计中。 对象是现实世界中存在的事物,它们是有形的,如某个人、某种物品;也可以是无形的,如某项计划、某次商业交易。 对象是构成现实世界的一个独立单位,人们对世界的认识,是从分析对象的特征入手的。 对象的特征分为静态特征和动态特征两种。静态的特征指对象的外观、性质、属性等; 动态的特征指对象具有的功能、行为等。 客观事物是错综复杂的,但人们总是从某一目的出发,运用抽象分析的能力,从众多的特征中抽取最具代表性、最能反映对象本质的若干特征加以详细研究。 人们将对象的静态特征抽象为属性,用数据来描述,在 Java 语言中称之为变量; 人们将对象的动态特征抽象为行为,用一组代码来表示,完成对数据的操作,在 Java语言中称之为方法。 一个对象由一组属性和一组对属性进行操作的方法构成。 2. 类 将具有相同属性及相同行为的一组对象称为类。广义地讲,具有共同性质的事物的集合就称为类。 在面向对象程序设计中,类是一个独立的单位,它有一个类名,其内部包括成员变量, 用于描述对象的属性; 还包括类的成员方法,用于描述对象的行为。 在 Java 程序设计中,类被认为是一种抽象数据类型,这种数据类型,不但包括数据,还包括方法。 类是一个抽象的概念,要利用类的方式来解决问题,必须用类创建一个实例化的类对象
  • ThreadLocal原理及使用场景
    ThreadLocal ThreadLocal是线程的内部存储类,是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰,可以在指定线程内存储数据,并且只有指定线程可以得到存储数据。 ThreadLocal<String> localName = new ThreadLocal(); localName.set("AAA"); String name = localName.get(); 在线程1中初始化了一个ThreadLocal对象localName,并通过set方法,保存了一个值AAA,同时在线程1中通过localName.get()可以拿到之前设置的值,但是如果在线程2中,拿到的将是一个null。 这是为什么,如何实现?不过之前也说了,ThreadLocal保证了各个线程的数据互不干扰。 看看set(T value)和get()方法的源码 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } public T get
  • 「Tomcat那些事儿」历史热文分类汇总
    最近有不少新关注的朋友,欢迎欢迎。感谢新老朋友们的关注和支持。在后台经常能收到提问,计划着写文章回答时,翻看以前的内容,基本都写过了。微信的历史文章查看,不能很好的将历史内容展示出来,方便查看。这里纯手工归类下,有其他问题,欢迎留言一起交流。Tomcat 源码与原理大部分文章都是分析Tomcat的源代码和实现原理的,这类最多。你一定不知道IDE里的Tomcat是怎么工作的!透过Tomcat配置认识其内部组件Servlet到底是单例还是多例你了解吗?你了解Tomcat是怎样处理Jsp文件的吗?Tomcat是如何响应静态资源的?WEB-INF目录知多少Tomcat是如何处理请求参数的?深入Tomcat源码分析Session到底是个啥!深度揭秘乱码问题背后的原因及解决方式禁用Cookie后,Session怎么样使用?快看被错用了这么久的GET和POST方法到底有什么区别web.xml是怎么被解析的?关于重定向和转发,书上和老师都没告诉你的......Tomcat的Logging(1)Tomcat的Logging(2) -- 内部实现方式你可能真的不了解的Basic认证修改JSP文件实时生效的秘密对于过期的session,Tomcat做了什么?和Tomcat学设计模式 | 责任链模式及Filter的工作原理Tomcat的Connector组件和Tomcat学设计模式 |
  • 助力面试之ConcurrentHashMap面试灵魂拷问,你能扛多久
    手把手轻松读懂HashMap源码 前言ConcurrentHashMap 原理JDK1.8 版本 ConcurrentHashMap 做了什么改进为什么 key 和 value 不允许为 nullConcurrentHashMap 如何保证线程的安全性如何用 CAS 保证数组初始化的安全put 操作如何保证数组元素的可见性精妙的计数方式addCount 计数方法fullAddCount 方法初始化 CounterCell 数组CounterCell 如何赋值计数数组 CounterCell 也能扩容吗 ConcurrentHashMap 的扩容扩容也能支持并发吗扩容戳有什么用首次扩容为什么计数要 +2 而不是 +1扩容条件 多并发下如何实现扩容扩容时的数据迁移如何保证安全性 总结 前言 本文从 ConcurrentHashMap 常见的面试问题引入话题,并逐步揭开其设计原理,相信读完本文,对面试中的相关问题会有很大的帮助。 HashMap 在我们日常的开发中使用频率最高的一个工具类之一,然而使用 HashMap 最大的问题之一就是它是线程不安全的,如果我们想要线程安全应该怎么办呢?这时候就可以选择使用 ConcurrentHashMap,ConcurrentHashMap 和 HashMap 的功能是基本一样的,ConcurrentHashMap 是 HashMap 的线程安全版本
  • 详解为何真正的自动驾驶离不开激光雷达
    当前,国内外对于初级自动驾驶L3的研发已经进行的如火如荼,比如以国产长安汽车首发的自动驾驶功能,还有一汽、广汽的量产步伐也紧随其后。然而,对于有限自动驾驶L3而言,并未能真正意义上的实现完全解放驾驶员。原因是需要限定比较严苛的ODD,且即便处于ODD下也智能允许驾驶员在其可处理的范围内脱手脱眼,而实际情况是,很多突发情况出现在ODD内时,系统仍然需要驾驶员及时接管车辆。这里的突发情况包括:1)临时出现的施工路段;2)前方突发掉落的物体;3)异形车辆(如自行车、摩托车、行人等)突然减速或切入;4)突发视线变暗或炫目。对于当前正在研发的自动驾驶功能而言,基本都是采用的全摄像头或摄像头+毫米波雷达两种方案实现,该两种方案对于自动驾驶常规场景的识别与处理基本没有问题,识别率甚至可以达到99%,但是针对如上列举的一些场景,如上两种方案将会在一定程度上失效,提示驾驶员接管车辆,甚至有些时候由于识别过晚,连提示驾驶员接管的时间都不够了。这样会显得所谓的“自动驾驶系统”不够安全,也不能真正为驾驶员带来信心感。为了处理以上极端工况,引入激光雷达就显得尤为必要了。本文将针对性的讲解激光雷达识别原理及如何破解自动驾驶极限工况识别问题。激光雷达识别原理激光雷达(LIDAR)是一种光学测量原理,用于定位和测量空间中物体的距离。基本上,它类似于RADAR系统,但是LIDAR不使用微波
  • java:数据结构面试题
    数据结构是面试一定会问的问题。 1.常用的数据结构有哪些? set,list,map,Quene.二叉树 set子类: HashSet:HashSet不能保证元素的排列顺序;使用Hash算法来存储集合中的元素,有良好的存取和查找性能;通过equal()判断两个元素是否相等,并两个元素的hashCode()返回值也相等。 TreeSet是SortedSet接口的实现类,根据元素实际值的大小进行排序;采用红黑树的数据结构来存储集合元素;支持两种排序方法:自然排序(默认情况)和定制排序。前者通过实现Comparable接口中的compareTo()比较两个元素之间大小关系,然后按升序排列;后者通过实现Comparator接口中的compare()比较两个元素之间大小关系,实现定制排列。 list子类: ArrayList: 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 空间不足时,增加原来空间的50%。 Vector: 底层数据结构是数组,查询快,增删慢。 线程安全,效率低。 空间不足时,增加原来空间的一倍。 Vector相对ArrayList查询慢(线程安全的) ,Vector相对LinkedList增删慢(数组结构) LinkedList: 底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。 Map子类:HashMap、Hashtable、
  • Java中的集合Set - 入门篇
    前言大家好啊,我是汤圆,今天给大家带来的是《Java中的集合Set - 入门篇》,希望对大家有帮助,谢谢简介前面介绍了集合List,映射Map,最后再简单介绍下集合Set,相关类如下图所示正文Set从外面看像List(都是存储单一数据的集合),只不过存储的数据不会有重复; 但是里面却是Map映射(因为它内存存储是基于Map结构实现),这也是为什么把Set放到Map后面来说的原因。Set和Map有什么关系呢?因为Map的键不会有重复,所以Set就利用了Map的这个特点,将其作为内部成员变量来使用 比如我们看下HashSet内部的源码,可以看到,基本上所有操作都是基于其内部的成员变量HashMap进行的 private transient HashMapmap; // 这个常量只是为了适配Map的键值对结构,无实际意义 private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } public int size() { return map.size(); } public boolean contains(Object o) { return map.containsKey(o); } public boolean add(E e) { return
  • 面试环节
    1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有。我只提几点: 1)写SQL:写SQL很常考察group by、内连接和外连接。 2)手写代码:手写代码一般考单例、排序、线程、消费者生产者。我建议排序算法除了冒泡排序,最好还能手写一种其他的排序代码。 2.面试流程? 1)让你自我介绍 2)问Java基础知识 3)问项目 4)情景问题,例如:你的一个功能上了生产环境后,服务器压力骤增,该怎么排查。 5)你有什么想问面试官的 3.面试常问的知识点? 1)集合相关问题(必问): HashMap、LinkedHashMap、ArrayList、LinkedList的底层实现。 HashMap和Hashtable的区别。 ArrayList、LinkedList、Vector的区别。 HashMap和LinkedHashMap的区别。 HashMap是线程安全的吗。2)线程相关问题(必问): 创建线程的3种方式。 什么是线程安全。 Runnable接口和Callable接口的区别。 wait方法和sleep方法的区别。 synchronized、Lock、ReentrantLock、ReadWriteLock。 介绍下CAS(无锁技术)。 什么是ThreadLocal。 创建线程池的4种方式。 ThreadPoolExecutor的内部工作原理。 分布式环境下,怎么保证线程安全
  • 通过其内部字段获取枚举(Get enum by its inner field)
    问题 带有内部字段的枚举,有点像地图。 现在,我需要按其内部字段枚举。 写下: package test; /** * Test enum to test enum =) */ public enum TestEnum { ONE(1), TWO(2), THREE(3); private int number; TestEnum(int number) { this.number = number; } public TestEnum findByKey(int i) { TestEnum[] testEnums = TestEnum.values(); for (TestEnum testEnum : testEnums) { if (testEnum.number == i) { return testEnum; } } return null; } } 但是,每次需要查找适当的实例时,对所有枚举进行查找并不是非常有效。 还有其他方法可以做到这一点吗? 回答1 您可以将static Map<Integer,TestEnum>与static初始化程序一起使用,该初始化程序将用由其number字段键入的TestEnum值来填充它。 请注意,将findByKey static ,并将number findByKey final 。 import java.util.*
  • Collection和Map
    一、集合和数组的区别: 1、数组是固定长度的;集合可变长度的。 2、数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。 3、数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。 二、集合和Map的继承关系: ​ Java 容器分为 Collection 和 Map 两大类,Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、List,注意:Map接口不是collection的子接口。 Collection集合主要有List和Set两大接口 1、List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元 素,元素都有索引。 常用的实现类有 ArrayList、LinkedList和 Vector。 2、Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。 Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。 Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 Map 的常用实现类:HashMap
  • Tomcat 从眼熟到脸熟
    前不久发了一篇分类汇总历史文章的文章(「Tomcat那些事儿」历史热文分类汇总)。这里面关于Tomcat的文章没有按学习顺序做太细致的划分,后面不少读者反馈过这个问题,今天我们一起来探讨下对于使用Tomcat的不同「角色」,一般需要了解哪些内容,以及我的公众号已发布文章的阅读顺序。对于 Tomcat 的使用角色,我这里分为两类实用型探究型实用型什么是实用型角色呢,比如一线运维人员,比如不想关注实现原理和问题细节的开发者。实用型角色喜欢在遇到问题时直接看到问题的答案。比如启动 Tomcat 时遇到了端口占用,会期待看到「在什么地方修改可以解决端口占用的问题?」此时可能一篇如何修改 server.xml 中关于 Connector 端口以及 SHUTDOWN 端口,以及「如何了解当前指定端口是被哪个进程占用」就比较符合其预期。对于实用型为主的朋友,可以重点关注 Tomcat的几个配置文件, bin 目录下的 catalina.sh conf 目录下的 server.xmlconf 目录下的 catalina.propertiesconf 目录下的 logging.properties记得好早以前看过一本『Apache Tomcat 6 高级编程』,感觉不错,可以对照着看看。初了配置外,记得还会讲一些稍深入的内容。类似于这种「只讲方式」的文章,我的公众号不太多
  • java集合(一)常见问题
    java集合(一)常见问题 0. java集合框架1. 说说List,Set,Map三者的区别?2. Arraylist 与 LinkedList 区别?3.ArrayList 与 Vector 区别呢?为什么要⽤Arraylist取代Vector呢?4. HashMap 和 Hashtable 的区别5. HashMap 的长度为什么是2的幂次方6. HashMap 和 HashSet区别7. HashSet是如何检查重复的?8. HashMap的底层实现9. ConcurrentHashMap 和 Hashtable 的区别10. 集合和数组的区别11.常用的集合底层的数据结构?12. Java集合的快速失败机制 “fail-fast”?13.Iterator 怎么使用?有什么特点?14.如何边遍历边移除 Collection 中的元素?15. 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?16.如何实现数组和 List 之间的转换?17.多线程场景下如何使用 ArrayList?18.BlockingQueue是什么?19.在 Queue 中 poll()和 remove()有什么区别?20.详解HashMap的实现原理? 0. java集合框架 Java集合主要有4个部分:List列表、Set集合、Map映射
  • java安全编码指南之:Mutability可变性
    文章目录简介可变对象和不可变对象创建mutable对象的拷贝为mutable类创建copy方法不要相信equals不要直接暴露可修改的属性public static fields应该被置位finalpublic static final field 应该是不可变的简介mutable(可变)和immutable(不可变)对象是我们在java程序编写的过程中经常会使用到的。可变类型对象就是说,对象在创建之后,其内部的数据可能会被修改。所以它的安全性没有保证。而不可变类型对象就是说,对象一旦创建之后,其内部的数据就不能够被修改,我们可以完全相信这个对象。虽然mutable对象安全性不够,但是因为其可以被修改,所以会有效的减少对该对象的拷贝。而immutable对象因为不可改变,所以尝试对该对象的修改都会导致对象的拷贝,从而生成新的对象。我们最常使用的String就是一个immutable对象。那么可变性在java的安全编码中的最佳实践是怎么样的呢? 一起来看看吧。可变对象和不可变对象知道了可变对象和不可变对象的不同之处之后,我们看一下怎么才能判断这个对象是可变对象还是不可变对象呢?首先,最简单的一点就是,不可变对象创建之后就不能够被修改,所以不可变对象里面基本上没有setXXX之类的方法,而可变对象提供了setXXX这些可以修改内部变量状态的方法。看一个例子java.util
  • 交换机结构原理
    1、硬件结构 三层交换机的硬件结构分为两个部分,处理器模块和交换模块,它们之间通过PCI接口相连,同时配合相应的外围电路形成完整的三层交换机系统 (1)处理器模块 处理器部采用一款MOTOROLA PowerQUICC II CPU,同一些外部存储设备以及一些外围电路构成三层交换机的处理器部分。 处理器模块主要是运行嵌入式操作系统,配置系统和路由表的维持,而不是数据转发通路的组成部分。 CPLD 保存一些CPU初始化的一些配置以保证上电后CPU正常启动; Flash 芯片用于存储三层交换机的所需要的所有软件和相关配置; SDRAM 在系统启动之后载入FLASH中的程序,保证系统正常运行; 处理器模块一方面提供一个快速以太网接口和一个异步口,用于对交换机进行配置和调试;另一方面通过PCI接口和交换模块相连,通过PCI接口对交换模块进行控制,并进行数据传输 。 (2)交换模块 交换模块采用了BROADCOM公司的BCM5645作为 ASIC芯片,通过 PCI接口 与处理器模块进行通信完成数据传输;通过5645提供的 内存接口,可以给交换模块提供一个64M的外部SDRAM,从而提高交换机的吞吐量和交换速度。5645通过MII接口和GMII接口分别连接24个百兆以太网和2个千兆以太网 2、软件结构 三层交换机的软件系统采用了模块化、分布式的设计方法,基于实时多任务操作系统。
  • 如何成为杰出的程序员?Nginx负载均衡策略有哪些?实战案例
    开头 最近一个哥们去面试某当红大厂了,其中几个他印象深刻的面试题你们品品: 1、介绍下如何对MySQL SQL语句进行分析和优化? 2、Redis 怎样实现的分布式锁? 3、如何实现本地缓存和分布式缓存? 4、说一下 JVM 的内存布局和运行原理? 5、RocketMQ 是怎么存储消息的?源码中有哪些高可用、高性能的设计? 面试官不愧是大佬,一层接一层的问过来,问完**“Redis 怎样实现的分布式锁”又问“单机锁有哪些?它为什么不能在分布式环境下使用?”** 由于平时只是改改以前的框架代码,哥们当场懵逼!面完瞬间觉得自己的技术弱爆了!结果当然是挂! 1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有。我只提几点: 写SQL:写SQL很常考察group by、内连接和外连接。手写代码:手写代码一般考单例、排序、线程、消费者生产者。我建议排序算法除了冒泡排序,最好还能手写一种其他的排序代码。试想:如果一般面试者都写的冒泡排序,而你写的是快速排序/堆排序,肯定能给面试官留下不错的印象。 2.面试流程? 让你自我介绍问Java基础知识问项目情景问题,例如:你的一个功能上了生产环境后,服务器压力骤增,该怎么排查。你有什么想问面试官的 3.面试常问的知识点? 1)集合相关问题(必问): HashMap、LinkedHashMap、ConcurrentHashMap
  • 阿里,字节都不要我!卧薪尝胆33天,才艰难六面拿到美团offer,这也太难了吧,呜呜呜~
    1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有。我只提几点: 写SQL:写SQL很常考察group by、内连接和外连接。手写代码:手写代码一般考单例、排序、线程、消费者生产者。我建议排序算法除了冒泡排序,最好还能手写一种其他的排序代码。试想:如果一般面试者都写的冒泡排序,而你写的是快速排序/堆排序,肯定能给面试官留下不错的印象。 2.面试流程? 让你自我介绍问Java基础知识问项目情景问题,例如:你的一个功能上了生产环境后,服务器压力骤增,该怎么排查。你有什么想问面试官的 3.面试常问的知识点? 1)集合相关问题(必问): HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。HashMap和Hashtable的区别。ArrayList、LinkedList、Vector的区别。HashMap和ConcurrentHashMap的区别。HashMap和LinkedHashMap的区别。HashMap是线程安全的吗。ConcurrentHashMap是怎么实现线程安全的。 2)多线程并发相关问题(必问): 创建线程的3种方式。什么是线程安全。Runnable接口和Callable接口的区别。wait方法和sleep方法的区别。synchronized、Lock、ReentrantLock