b2c信息网

您现在的位置是:首页 > 明日新闻 > 正文

明日新闻

征服面试官map源码的简单介绍

hacker2022-06-09 21:10:26明日新闻85
本文目录一览:1、如果你是一个Java面试官,你会问哪些问题?

本文目录一览:

如果你是一个 Java 面试官,你会问哪些问题?

1、谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?考点分析:对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。回归正题,对于 Java 平台的理解,可以从很多方面简明扼要地谈一下,例如:Java 语言特性,包括泛型、Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。2、对比Hashtable、HashMap、TreeMap有什么不同?考点分析:上面的回答,只是对一些基本特征的简单总结,针对Map相关可以扩展的问题很多,从各种数据结构、典型应用场景,到程序设计实现的技术考量,尤其是在Java 8里,HashMap本身发生了非常大的变化,这些都是经常考察的方面。很多朋友向我反馈,面试官似乎钟爱考察HashMap的设计和实现细节,所以今天我会增加相应的源码解读,主要专注于下面几个方面:理解Map相关类似整体结构,尤其是有序数据结构的一些要点。从源码去分析HashMap的设计和实现要点,理解容量、负载因子等,为什么需要这些参数,如何影响Map的性能,实践中如何取舍等。理解树化改造的相关原理和改进原因。除了典型的代码分析,还有一些有意思的并发相关问题也经常会被提到,如HashMap在并发环境可能出现无限循环占用CPU、size不准确等诡异的问题。我认为这是一种典型的使用错误,因为HashMap明确声明不是线程安全的数据结构,如果忽略这一点,简单用在多线程场景里,难免会出现问题。理解导致这种错误的原因,也是深入理解并发程序运行的好办法。对于具体发生了什么,你可以参考这篇很久以前的分析,里面甚至提供了示意图,我就不再重复别人写好的内容了。3、Java 提供了哪些 IO 方式? NIO 如何实现多路复用?考点分析:在实际面试中,从传统 IO 到 NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面,比如:基础 API 功能与设计, InputStream/

通过实现原理及源代码分析HashMap该怎么用

HashMap

,都知道哪里要用

HashMap

,知道

Hashtable

HashMap

之间的区别

,那么

为何这道面试题如此特殊呢?是因为这道题考察的深度很深。

这题经常出现在高级或中高级

面试中。投资银行更喜欢问这个问题,甚至会要求你实现

HashMap

来考察你的编程能力。

ConcurrentHashMap

和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的

旅程吧!

作为一个面试官,我会问初级java工程师哪些问题?

初级java工程师多数是刚毕业或者工作1,2年的新人。对于新人,面试中基础问题会问道很多,因为先要考察这个人的基础。

关于基础类的题目,我在面试初级java工程师的时候一般会问下面两大类问题,每类5个题目,这样下来我就基本可以了解这位工程师的程度了。

java基础类

面向对象基础类

java基础类

1.描述一下java的访问修饰符,和它们之间的区别?

回答:如果可以回到出public,private,protected,就算是ok;回答出default的,加分。

2. int和Integer 区别?

回答:如果回答出Integer是int的包装类,就算ok;回答出其他的基本类型和它们相应的包装类,加分。

3.如何定义一个单精度浮点类型的变量?

回答:float 变量名=1.2f ;回答出不加最后的f为双精度浮点类型,加分

4. equals和==的区别?

回答: equals是值比较(一般处理java开发都会这么说,算是ok的)而==是引用比较(或者对象比较);回答equals是可以自定义的,加分

5.将一个数组作为参数传递到一个方法中,在方法中,数组内的元素值被改变了,那么在方法外部,这个数组内的元素是否也被改编了?

回答:是,因为java方法中传递的是引用,就ok。如果回答中,将引用说明了自己的理解,加分。

面向对象基础类

1.重载和重写的区别?

回答:这个看个人理解,理解没有什么大的偏差就ok;回答出多态相关的,加分。

2.构造方法能不能重载?

回答:可以重载,ok;回答构造方法时不能继承的,所以如果要调用指定父类构造器就必须重写子类构造方法,加分。

3.抽象方法(abstract)是否可以被final、static、native修饰?

回答:都不可以,因为抽象方法是必须子类实现的,final方法时不可以被重写的,static是父类必须实现的方法,native是本地语言实现的方法。回答出封装和继承相关的,加分

4.当父类引用指向子类对象的时候,子类重写了父类方法和属性,那么当访问属性的时候,访问是谁的属性?调用方法时,调用的是谁的方法?

回答:访问的是父类的属性,调用的是子类的方法,ok;如果可以画图解释的话,加分

5.抽象类和接口有什么异同?

回答:一些类定义上的区别,ok;回答在应用过程中,如何根据业务定义接口,加很多分

最后,如果前面问题回答的不错,会补充两个编程习惯问题。

1.在你写过的代码中,你写过超过2层的循环吗,怎么实现的?

回答:没有,就算ok;如果回答有,听一下实现,如果原因说不出来,扣分。

2.在你写过的代码中,if语句最多嵌套了几层,最多有多少分支,怎么实现的?

回答:3层以下,就算ok;如果回答3层以上,听一下实现,如果原因说不出来,扣分。

4,5个分支,就算ok;如果回答5个分支以上,听一下实现,如果原因说不出来,扣分。

最后两个题其实比较陷阱,但是正是一个反向的思考才能了解面试者之前的工作状态。

如果面试者在平日里就有好的习惯,自然不用担心。

为什么面试要问hashmap 的原理

HashMap

的工作原理

HashMap

,都知道哪里要用

HashMap

,知道

Hashtable

HashMap

之间的区别

,那么

为何这道面试题如此特殊呢?是因为这道题考察的深度很深。

这题经常出现在高级或中高级

面试中。投资银行更喜欢问这个问题,甚至会要求你实现

HashMap

来考察你的编程能力。

ConcurrentHashMap

和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的

旅程吧!

先来些简单的问题

“你用过

HashMap

吗?”

“什么是

HashMap

?你为什么用到它?”

几乎每个人都会回答“是的”,然后回答

HashMap

的一些特性,譬如

HashMap

可以接

null

键值和值,而

Hashtable

则不能;

HashMap

是非

synchronized;HashMap

很快;

以及

HashMap

储存的是键值对等等。

这显示出你已经用过

HashMap

而且对它相当的熟

悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于

HashMap

的更多

基础的细节。面试官可能会问出下面的问题:

“你知道

HashMap

的工作原理吗?”

“你知道

HashMap

get()

方法的工作原理吗?”

你也许会回答“我没有详查标准的

Java API

,你可以看看

Java

源代码或者

Open JDK

。”

“我可以用

Google

找到答案。”

但一些面试者可能可以给出答案,

HashMap

是基于

hashing

的原理,

我们使用

put(key,

value)

存储对象到

HashMap

中,使用

get(key)

HashMap

中获取对象。当我们给

put()

方法传递键和值时,

我们先对键调用

hashCode()

方法,

返回的

hashCode

用于找到

bucket

位置来储存

Entry

对象。”这里关键点在于指出,

HashMap

是在

bucket

中储存键对象和

值对象,作为

Map.Entry

。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,

或者错误的认为仅仅只在

bucket

中存储值的话,

你将不会回答如何从

HashMap

中获取对

象的逻辑。这个答案相当的正确,也显示出面试者确实知道

hashing

以及

HashMap

的工

作原理。但是这仅仅是故事的开始,当面试官加入一些

Java

程序员每天要碰到的实际场景

的时候,错误的答案频现。下个问题可能是关于

HashMap

中的碰撞探测

(collision

detection)

以及碰撞的解决方法:

“当两个对象的

hashcode

相同会发生什么?”

从这里开始,真正的困惑开始了,一些面

试者会回答因为

hashcode

相同,

所以两个对象是相等的,

HashMap

将会抛出异常,

或者

不会存储它们。然后面试官可能会提醒他们有

equals()

hashCode()

两个方法,并告诉他

们两个对象就算

hashcode

相同,但是它们可能并不相等。一些面试者可能就此放弃,而

另外一些还能继续挺进,他们回答“因为

hashcode

相同,所以它们的

bucket

位置相同,

‘碰撞’会发生。因为

HashMap

使用

LinkedList

存储对象,这个

Entry(

包含有键值对的

Map.Entry

对象

)

会存储在

LinkedList

中。”这个答案非常的合理,虽然有很多种处理碰撞

的方法,这种方法是最简单的,也正是

HashMap

的处理方法。但故事还没有完结,面试

官会继续问:

“如果两个键的

hashcode

相同,

你如何获取值对象?”

面试者会回答:

当我们调用

get()

方法,

HashMap

会使用键对象的

hashcode

找到

bucket

位置,然后获取值对象。面试官

提醒他如果有两个值对象储存在同一个

bucket

他给出答案

:

将会遍历

LinkedList

直到找到

值对象。

面试官会问因为你并没有值对象去比较,

你是如何确定确定找到值对象的?除非面

试者直到

HashMap

LinkedList

中存储的是键值对,否则他们不可能回答出这一题。

其中一些记得这个重要知识点的面试者会说,

找到

bucket

位置之后,

会调用

keys.equals()

方法去找到

LinkedList

中正确的节点,最终找到要找的值对象。完美的答案!

源码定位map

1OD打开看特征码前后有什么明显的函数没有,如有,到源码找那个函数,函数附近就是特征码;

2建议重新定位特征码,好多时候都是定位不准确造成的。

补充:

3有些特征码无对应的源码。 我在做gh0st免杀的时候,特征码定位在GetStartupInfoA上,而程序中根本找不到这个函数。我是通过重新定位(指定定位开始位置,结束位置)解决的。

发表评论

评论列表

  • 双笙几渡(2022-06-10 01:03:18)回复取消回复

    直到HashMap在LinkedList中存储的是键值对,否则他们不可能回答出这一题。其中一些记得这个重要知识点的面试者会说,找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。完美的答案!源码