精华内容
下载资源
问答
  • 常见的问法是,说下你最近的(或最拿得出手的)一个项目。根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚至有人说出项目经验从时间段或技术等方面和简历上的不匹配,这样就会造成如下的...
    06ea8559aeb56258bb86a36a56f47f60.gif

    原文地址:

    https://www.cnblogs.com/JavaArchitect/p/7586949.html

    如何在面试中介绍自己的项目经验

    在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见的问法是,说下你最近的(或最拿得出手的)一个项目。
    根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚至有人说出项目经验从时间段或技术等方面和简历上的不匹配,这样就会造成如下的后果。
    1 第一印象就不好了,至少会感觉该候选人表述能力不强。
    2 一般来说,面试官会根据候选人介绍的项目背景来提问题,假设面试时会问10个问题,那么至少有5个问题会根据候选人所介绍的项目背景来问,候选人如果没说好,那么就没法很好地引导后继问题了,就相当于把提问权完全交给面试官了。

    面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,所以本文将从“介绍”和“引导”两大层面告诉大家如何准备面试时的项目介绍。
           好了,如下是正文内容:


    1 在面试前准备项目描述,别害怕,因为面试官什么都不知道

    面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的(一般公司会到录用后,用背景调查的方式来核实)。更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张。如果你的工作经验比面试官还丰富的话,甚至还可以控制整个面试流程(笔者在面试方面成精后也经常干这种事情,大家一定也能行)。

    50672b3cd5d69d5acf3ac9b8cf554d12.png

    既然面试官无法了解你的底细,那么他们怎么来验证你的项目经验和技术?下面总结了一些常用的提问方式。

    57c4f2bc13dc805f879077436460946b.png

    2  准备项目的各种细节,一旦被问倒了,就说明你没做过

    一般来说,在面试前,大家应当准备项目描述的说辞,自信些,因为这部分你说了算,流利些,因为你经过充分准备后,可以知道你要说些什么。而且这些是你实际的项目经验(不是学习经验,也不是培训经验),那么一旦让面试官感觉你都说不上来,那么可信度就很低了。

    不少人是拘泥于“项目里做了什么业务,以及代码实现的细节”,这就相当于把后继提问权直接交给面试官。下表列出了一些不好的回答方式。

    d8065b23373beb76a381986da69c8235.png

    在避免上述不好的回答的同时,大家可以按下表所给出的要素准备项目介绍。如果可以,也请大家准备一下用英语描述。其实刚毕业的学生,或者工作经验较少的人,英语能力都差不多,但你说了,这就是质的进步。

    4c559f651d229d46bd72b615ee14e390.png

    面试前,你一定要准备,一定要有自信,但也要避免如下的一些情况。

    67ef83960b47516c24146a077b217057.png

    3  不露痕迹地说出面试官爱听的话

    在项目介绍的时候(当然包括后继的面试),面试官其实很想要听一些关键点,只要你说出来,而且回答相关问题比较好,这绝对是加分项。我在面试别人的时候,一旦这些关键点得到确认,我是绝对会在评语上加上一笔的。

    下面列些面试官爱听的关键点和对应的说辞。

    6ed44c2419706765980410f2f14477e9.png

    4  一定要主动,面试官没有义务挖掘你的亮点

    我去面试人家的时候,往往会特别提问:你项目里有什么亮点?或者你作为应聘者,有什么其他加分项能帮你成功应聘到这个岗位。即使这样问,还有些人直接说没有。

    我这样问已经是处于角色错位了,作为面试者,应当主动说出,而不是等着问,但请注意,说的时候要有技巧,找机会说,通常是找一些开放性的问题说。

    比如:在这个项目里用到了什么技术?你除了说一些基本的技术,比如Spring MVC,Hibernate,还有数据库方面的常规技术时,还得说,用到了Java内存管理,这样能减少对虚拟机内存的压力,或者说用到了大数据处理技术等。也就是说,得找一切机会说出你拿得出手的而且当前也非常热门的技术。

    或者找个相关的问题做扩展性说明,比如被问到:你有没有用到过一对多和多对多?你除了说基本知识点以外,还可以说,一般我还会根据需求适当地设置cascade和inverse关键字,随后通过一个实际的案例来说明合理设计对你项目的帮助,这样就能延伸性地说明你的技能了。相反如果你不说,面试话一定会认为你只会简单的一对一和一对多操作。

    面试的时候,如果候选人回答问题很简单,有一说一,不会扩展,或者用非常吝啬的语句来回答我的问题,那么我一般会给机会让他们深入讲述(但我不敢保证不是每个面试官都会深入提问),如果回答再简洁,那么也会很吝啬地给出好的评语。

    记住:面试官不是你的亲戚,面试官很忙,能挖掘出你的亮点的面试官很少,而说出你的亮点是你的义务。

    我在面试别人过程中,根据不同的情况一般会给出如下的评语。

    1 回答很简单,但回答里能证明出他对框架等技术确实是做过,我会在评语里些“对框架了解一般,不知道一些深层次的知识(我都问了多次了你都回答很简答,那么对不起了,我只能这么写,或许你确实技术很强,那也没办法,谁让你不肯说呢?)”,同时会加一句“表达能力很一般,沟通能力不强”,这样即使他通过技术面试,后面的面试他也会很吃力。

    2 回答很简单,通过回答我没法验证他是在项目里做过这个技术,还是仅仅在平时学习中学过这个技术。我就会写“在简历中说用过XX技术,但对某些细节说不上来,没法看出在项目里用到这个技术”,如果这个技术是职务必需点,那么他通过面试的可能性就非常小。

    3 回答很简单,而且只通过嗯啊之类的虚词回答,经过提醒还这样,我会敷衍几句结束面试,直接写“技术很薄弱,没法通过面试”。

    4 虽然通过回答能很好地展示自己的技能,但逻辑调理不清晰,那么我会让他通过技术面试,但会写上“技能很好,但表达能力一般(或有待提高),请后继面试经理斟酌”。这样通过后继综合面试的机会就一般了,毕竟综合面试会着重考察表达能力交往能力等非技术因素。

    不管怎样,一旦回答简单,不主动说出你的擅长点,或没有条理很清楚地说出你的亮点,就算我让你通过面试,也不会写上“框架细节了解比较深,数据库应用比较熟练”等之类的好评语,你即使通过技术和后面的综合面试,工资也是比较低的。

    5  一旦有低级错误,可能会直接出局

    面试过程中有些方面你是绝对不能出错,所以你在准备过程中需要尤其注意如下的因素。下面列了些会导致你直接出局的错误回答。

    1e3bf6b186bcb2075d3fb1b690735a3f.png

    6  引导篇:准备些加分点,在介绍时有意提到,但别说全

    在做项目介绍的时候,你可以穿插说出一些你的亮点,但请记得,不论在介绍项目还是在回答问题,你当前的职责不是说明亮点而是介绍项目,一旦你详细说,可能会让面试官感觉你跑题了。

    所以这时你可以一笔带过,比如你可以说,“我们的项目对数据要求比较大,忙的时候平均每小时要处理几十万条数据”,这样就可以把面试官引入“大数据”的方向。

    你在面试前可以根据职位的需求,准备好这种“一笔带过”的话。比如这个职位的需求点是Spring MVC框架,大数据高并发,要有数据库调优经验,那么介绍以往项目时,你就最好突出这些方面你的实际技能。

    再给大家举个例子,比如Java虚拟机内存管理和数据库优化是绝大多数项目都要遇到的两大问题,大家都可以在叙述项目经验时说,在这个项目里,我们需要考虑内存因素,因为我们的代码只允许在2G内存环境中运行,而且对数据库性能要求比较高,所以我们经常要监控优化内存和数据库里的SQL语句。这样当面试官深入提问时,就能抛出自己准备好的虚拟机内存优化和数据库优化方面的说辞。

    实在不行,你也可以说“我除了做开发,也做了了解需求,测试和部署的工作,因为这个项目人手比较少,压力比较大”,这样你也能展示你有过独挡一面的经历。

    我在面试过程中,一旦听到有亮点,就会等到他说好当前问题后,顺口去问,一般技术面试最多办半小时,你把时间用在回答准备好的问题点上的时候,被问其他问题的时间就会少了。

    7  你可以引导,但不能自说自话

    我面试的时候,也会遇到些有准备的人,其实如果你真的想应聘的话,一定要事先准备,这点我能理解,甚至赞同,你只要别露出太明显的痕迹,我不会写上“似乎有准备,没法考察真实技能”这种话,更何况未必每个面试官都能感觉出你准备过。  但你不能凭着有准备而太强势,毕竟面试是面试官主导的。

    我遇到个别面试的人,他们说话太多,一般会主动扩展,比如我问他数据库用什么,他不仅回答数据库是什么,自己做了什么,甚至顺便会把大数据处理技术都说出来。

    其实过犹不及,我就会重点考察你说的每个细节,因为我怀疑你说的都是你从网上看的,而不是你项目中用到的,我甚至会直接威胁:“你先和我说实话这个技术你真在项目里用到,我后面会重点考察,一旦被认为你项目里没做,这个性质就是蒙混过关了”,往往这些人会主动坦白。

    不过话说回来,他如果仅仅说,数据量比较大,但点到为止,不继续说后面的话,我就会深入去问,他自然有机会表达。同时请注意,一般在面试过程中,一旦你亮出加分点,但面试官没接嘴,这个加分点可能就不是项目必备的,也不是他所关注的,当前你就可以别再说了,或者等到你提问题的时候再说。

    8  不是结尾的总结

    到这里,我们已经给出了介绍项目的一些技巧。第一,面试前一定要准备,第二,本文给出是的方法,不是教条,大家可以按本文给出的方向结合自己的项目背景做准备,而不是死记硬背本文给出的一些说辞。

    当大家介绍好项目背景后,面试才刚刚开始,哪怕你说得再好,哪怕你把问题引导到你准备的范围里,这也得应付Java Web(比如Spring MVC,ORM等)、Java Core(多线程、集合、JDBC等)和数据库等方面的问题。

    那么本文的价值体现在哪呢?如果引导不好,你根本没机会展示自己的能力。这就是本文给出的方法价值所在。说句自夸的话,本文给出的一些方法和说辞不是拍脑袋想出来的,而是从面试上百个候选人的经历中抽取出来的,其中有不少血泪,也有不少人成功的途径,这篇文章多少对大家(尤其是经验不满3年的初级程序员)有帮助。

    最后,切记:一定要引导面试官往自己准备好的点或者自己擅长的知识面上提问。

    a4519606547f873c4a6c6ce4ce72e8e2.gif

    - End -

    公众号可以帮粉丝内推【今日头条】,春招、实习、秋招、社招;技术岗和非技术岗都可以内推。

    今日头条春招内推码:MFVXXTU

    今日头条实习内推:头条内部员工私有的内推链接,

    最后,公众号为粉丝建立了【今日头条内推群】,内推群群一直有效:19届春招、20届实习、校招、以及20届以后的内推信息都会在群内发布。内推群提供简历直达HR的内推方式,之前通过这种方式内推的同学没有笔试,这种方式内推与内推码方式不冲突。

    内推群的入群方式:后台回复“头条内推”

     热 文 推 荐 

    ☞毕业三年,阿里Java师兄的接地气分享

    ☞知网免费使用作者论文,一年盈利10多亿

    今日问题:

    你觉得20届秋招形式如何?

    你觉得项目介绍中最重要的技巧是?

    长按,扫码,关注

    及时收看更多精彩内容

    af35d7033ba4dcedb12b5d562a4b4833.png

    博主:今日头条大数据工程师

     专注:求职 面经 源码 java 大数据技术分享

    点击阅读原文,立即参与头条实习内推

    喜欢就给个“好看2f01865f70b873f318a8ae55e652176f.gif

    展开全文
  • 源码精品专栏中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elastic-Job 源码解析分布式...

    点击上方“芋道源码”,选择“设为星标”

    做积极的人,而不是积极废人!

    源码精品专栏

     
    • 中文详细注释的开源项目

    • RPC 框架 Dubbo 源码解析

    • 网络应用框架 Netty 源码解析

    • 消息中间件 RocketMQ 源码解析

    • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

    • 作业调度中间件 Elastic-Job 源码解析

    • 分布式事务中间件 TCC-Transaction 源码解析

    • Eureka 和 Hystrix 源码解析

    • Java 并发源码

    来源:http://t.cn/EzQAAtu

    • 1、在面试前准备项目描述,别害怕,因为面试官什么都不知道

    • 2、准备项目的各种细节,一旦被问倒了,就说明你没做过

    • 3、不露痕迹地说出面试官爱听的话

    • 4、一定要主动,面试官没有义务挖掘你的亮点

    • 5、一旦有低级错误,可能会直接出局

    • 6、引导篇:准备些加分点,在介绍时有意提到,但别说全

    • 7、你可以引导,但不能自说自话

    • 8、不是结尾的总结


    在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见的问法是,说下你最近的(或最拿得出手的)一个项目。

    根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚至有人说出项目经验从时间段或技术等方面和简历上的不匹配,这样就会造成如下的后果。

    第一印象就不好了,至少会感觉该候选人表述能力不强。

    一般来说,面试官会根据候选人介绍的项目背景来提问题,假设面试时会问10个问题,那么至少有5个问题会根据候选人所介绍的项目背景来问,候选人如果没说好,那么就没法很好地引导后继问题了,就相当于把提问权完全交给面试官了。

    面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,所以本文将从“介绍”和“引导”两大层面告诉大家如何准备面试时的项目介绍。

    好了,如下是正文内容。

    1、在面试前准备项目描述,别害怕,因为面试官什么都不知道

    面试官是人,不是神,拿到你的简历的时候,是没法核实你的项目细节的(一般公司会到录用后,用背景调查的方式来核实)。

    更何况,你做的项目是以月为单位算的,而面试官最多用30分钟来从你的简历上了解你的项目经验,所以你对项目的熟悉程度要远远超过面试官,所以你一点也不用紧张。

    如果你的工作经验比面试官还丰富的话,甚至还可以控制整个面试流程(笔者在面试方面成精后也经常干这种事情,大家一定也能行)。

    bfaa46ad2eba48775fac2dcde8536313.png

    既然面试官无法了解你的底细,那么他们怎么来验证你的项目经验和技术?下面总结了一些常用的提问方式。

    a0a6920ef5b1e553afcaec2a648649bb.png

    2、准备项目的各种细节,一旦被问倒了,就说明你没做过

    一般来说,在面试前,大家应当准备项目描述的说辞,自信些,因为这部分你说了算,流利些,因为你经过充分准备后,可以知道你要说些什么。而且这些是你实际的项目经验(不是学习经验,也不是培训经验),那么一旦让面试官感觉你都说不上来,那么可信度就很低了。

    不少人是拘泥于“项目里做了什么业务,以及代码实现的细节”,这就相当于把后继提问权直接交给面试官。下表列出了一些不好的回答方式。

    0ff9f9fb6ce5052808616142115cec97.png

    在避免上述不好的回答的同时,大家可以按下表所给出的要素准备项目介绍。如果可以,也请大家准备一下用英语描述。其实刚毕业的学生,或者工作经验较少的人,英语能力都差不多,但你说了,这就是质的进步。

    07571cb197a025bb63c925a4df738ec9.png

    面试前,你一定要准备,一定要有自信,但也要避免如下的一些情况。

    f5bff9e3e6f90b51dcffe789925420fd.png

    3、不露痕迹地说出面试官爱听的话

    在项目介绍的时候(当然包括后继的面试),面试官其实很想要听一些关键点,只要你说出来,而且回答相关问题比较好,这绝对是加分项。我在面试别人的时候,一旦这些关键点得到确认,我是绝对会在评语上加上一笔的。

    下面列些面试官爱听的关键点和对应的说辞。

    b817a9201fb1c6490492ecf57e845b79.png

    4、一定要主动,面试官没有义务挖掘你的亮点

    我去面试人家的时候,往往会特别提问:你项目里有什么亮点?或者你作为应聘者,有什么其他加分项能帮你成功应聘到这个岗位。即使这样问,还有些人直接说没有。

    我这样问已经是处于角色错位了,作为面试者,应当主动说出,而不是等着问,但请注意,说的时候要有技巧,找机会说,通常是找一些开放性的问题说。

    比如:在这个项目里用到了什么技术?你除了说一些基本的技术,比如Spring MVC,Hibernate,还有数据库方面的常规技术时,还得说,用到了Java内存管理,这样能减少对虚拟机内存的压力,或者说用到了大数据处理技术等。也就是说,得找一切机会说出你拿得出手的而且当前也非常热门的技术。

    或者找个相关的问题做扩展性说明,比如被问到:你有没有用到过一对多和多对多?你除了说基本知识点以外,还可以说,一般我还会根据需求适当地设置cascade和inverse关键字,随后通过一个实际的案例来说明合理设计对你项目的帮助,这样就能延伸性地说明你的技能了。相反如果你不说,面试话一定会认为你只会简单的一对一和一对多操作。

    面试的时候,如果候选人回答问题很简单,有一说一,不会扩展,或者用非常吝啬的语句来回答我的问题,那么我一般会给机会让他们深入讲述(但我不敢保证不是每个面试官都会深入提问),如果回答再简洁,那么也会很吝啬地给出好的评语。

    记住:面试官不是你的亲戚,面试官很忙,能挖掘出你的亮点的面试官很少,而说出你的亮点是你的义务。

    我在面试别人过程中,根据不同的情况一般会给出如下的评语。

    1、回答很简答,但回答里能证明出他对框架等技术确实是做过,我会在评语里些“对框架了解一般,不知道一些深层次的知识(我都问了多次了你都回答很简答,那么对不起了,我只能这么写,或许你确实技术很强,那也没办法,谁让你不肯说呢?)”,同时会加一句“表达能力很一般,沟通能力不强”,这样即使他通过技术面试,后面的面试他也会很吃力。

    2、回答很简单,通过回答我没法验证他是在项目里做过这个技术,还是仅仅在平时学习中学过这个技术。我就会写“在简历中说用过XX技术,但对某些细节说不上来,没法看出在项目里用到这个技术”,如果这个技术是职务必需点,那么他通过面试的可能性就非常小。

    3、回答很简单,而且只通过嗯啊之类的虚词回答,经过提醒还这样,我会敷衍几句结束面试,直接写“技术很薄弱,没法通过面试”。

    4、虽然通过回答能很好地展示自己的技能,但逻辑调理不清晰,那么我会让他通过技术面试,但会写上“技能很好,但表达能力一般(或有待提高),请后继面试经理斟酌”。这样通过后继综合面试的机会就一般了,毕竟综合面试会着重考察表达能力交往能力等非技术因素。

    不管怎样,一旦回答简单,不主动说出你的擅长点,或没有条理很清楚地说出你的亮点,就算我让你通过面试,也不会写上“框架细节了解比较深,数据库应用比较熟练”等之类的好评语,你即使通过技术和后面的综合面试,工资也是比较低的。

    5、一旦有低级错误,可能会直接出局

    面试过程中有些方面你是绝对不能出错,所以你在准备过程中需要尤其注意如下的因素。下面列了些会导致你直接出局的错误回答。

    6a46fd99c9f7fbd4f0def551bfed158e.png

    6、引导篇:准备些加分点,在介绍时有意提到,但别说全

    在做项目介绍的时候,你可以穿插说出一些你的亮点,但请记得,不论在介绍项目还是在回答问题,你当前的职责不是说明亮点而是介绍项目,一旦你详细说,可能会让面试官感觉你跑题了。

    所以这时你可以一笔带过,比如你可以说,“我们的项目对数据要求比较大,忙的时候平均每小时要处理几十万条数据”,这样就可以把面试官引入“大数据”的方向。

    你在面试前可以根据职位的需求,准备好这种“一笔带过”的话。比如这个职位的需求点是Spring MVC框架,大数据高并发,要有数据库调优经验,那么介绍以往项目时,你就最好突出这些方面你的实际技能。

    再给大家举个例子,比如Java虚拟机内存管理和数据库优化是绝大多数项目都要遇到的两大问题,大家都可以在叙述项目经验时说,在这个项目里,我们需要考虑内存因素,因为我们的代码只允许在2G内存环境中运行,而且对数据库性能要求比较高,所以我们经常要监控优化内存和数据库里的SQL语句。这样当面试官深入提问时,就能抛出自己准备好的虚拟机内存优化和数据库优化方面的说辞。

    实在不行,你也可以说“我除了做开发,也做了了解需求,测试和部署的工作,因为这个项目人手比较少,压力比较大”,这样你也能展示你有过独挡一面的经历。

    我在面试过程中,一旦听到有亮点,就会等到他说好当前问题后,顺口去问,一般技术面试最多办半小时,你把时间用在回答准备好的问题点

    上的时候,被问其他问题的时间就会少了。

    7、你可以引导,但不能自说自话

    我面试的时候,也会遇到些有准备的人,其实如果你真的想应聘的话,一定要事先准备,这点我能理解,甚至赞同,你只要别露出太明显的痕迹,我不会写上“似乎有准备,没法考察真实技能”这种话,更何况未必每个面试官都能感觉出你准备过。 但你不能凭着有准备而太强势,毕竟面试是面试官主导的。

    我遇到个别面试的人,他们说话太多,一般会主动扩展,比如我问他数据库用什么,他不仅回答数据库是什么,自己做了什么,甚至顺便会把大数据处理技术都说出来。

    其实过犹不及,我就会重点考察你说的每个细节,因为我怀疑你说的都是你从网上看的,而不是你项目中用到的,我甚至会直接威胁:“你先和我说实话这个技术你真在项目里用到,我后面会重点考察,一旦被认为你项目里没做,这个性质就是蒙混过关了”,往往这些人会主动坦白。

    不过话说回来,他如果仅仅说,数据量比较大,但点到为止,不继续说后面的话,我就会深入去问,他自然有机会表达。同时请注意,一般在面试过程中,一旦你亮出加分点,但面试官没接嘴,这个加分点可能就不是项目必备的,也不是他所关注的,当前你就可以别再说了,或者等到你提问题的时候再说。

    8、不是结尾的总结

    到这里,我们已经给出了介绍项目的一些技巧。这些技巧都是从 java web轻量级开发面试教程从摘录的。

    两句话,第一,面试前一定要准备,第二,本文给出是的方法,不是教条,大家可以按本文给出的方向结合自己的项目背景做准备,而不是死记硬背本文给出的一些说辞。

    当大家介绍好项目背景后,面试才刚刚开始,哪怕你说得再好,哪怕你把问题引导到你准备的范围里,这也得应付Java Web(比如Spring MVC,ORM等)、Java Core(多线程、集合、JDBC等)和数据库等方面的问题。

    那么本文的价值体现在哪呢?如果引导不好,你根本没机会展示自己的能力。这就是本文给出的方法价值所在。

    说句自夸的话,本文给出的一些方法和说辞不是拍脑袋想出来的,而是从面试上百个候选人的经历中抽取出来的,其中有不少血泪,也有不少人成功的途径,这篇文章多少对大家(尤其是经验不满3年的初级程序员)有帮助。



    欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

    b2ecee14b0f20d754871b718e757d9ee.png

    已在知识星球更新源码解析如下:

    1386e5dfac3ba7cf1bb5f0b5e19ba186.png

    7d611e68c5ea90b82f2fe11b20f1c778.png

    ab67a86b5c83f43bf63b8c5f23b7397d.png

    如果你喜欢这篇文章,喜欢,转发。

    生活很美好,明天见(。・ω・。)ノ♡

    展开全文
  • Android重难点解析——面试中可能被问到的那些问题

    万次阅读 多人点赞 2015-12-11 16:12:52
    这篇项目主要介绍Android中的一些重难点概念,也包括面试中可能被问到的经典问题。 因为这些知识点比较琐碎,不太适合写成一篇文章,所以采用Github管理,内容会首先在Github更新,这里不定时同步,如果你想第一...

    这篇项目主要介绍Android中的一些重难点概念,也包括面试中可能被问到的经典问题。

    因为这些知识点比较琐碎,不太适合写成一篇文章,所以采用Github管理,内容会首先在Github更新,这里不定时同步,如果你想第一时间收到通知,请关注Github中的该项目。

    项目地址

    Android重难点解析,欢迎star,follow,将持续分享Android开发知识

    文章列表

    注意

    开发经验有限,内容上避免有不足甚至是错误,恳请各位发现之后提交issue,以免误导更多的人,技术交流,互相进步!欢迎留言讨论问题!

    关于我

    我会不定期从下面几个地方分享一些文章,CSDN主要是大块知识点,微博则是分享看到的好文章,微信则是每天遇到的好文章,内容可能有重复,选择你喜欢的渠道关注我即可,期待你的到来!

    我的CSDN博客:http://blog.csdn.net/zhaokaiqiang1992

    我的微博:裸奔的凯子哥,每天会不定时分享高质量博客,欢迎关注

    微信公众账号:kaizige1992

    展开全文
  • React 重难点总结

    千次阅读 2019-10-10 09:36:03
    各种在线评论都说,React比Vue更难上手。可能难以深入理解JSX,或者难以深入理解ES6的某些功能,然后React变得更难以使用,甚至有些反人类。 为什么要引入 React 在写 React 的时候,你可能会写类似这样的代码: ...

    各种在线评论都说,React比Vue更难上手。可能难以深入理解JSX,或者难以深入理解ES6的某些功能,然后React变得更难以使用,甚至有些反人类。

    为什么要引入 React

    在写 React 的时候,你可能会写类似这样的代码:

    import React from 'react'
    
    function A() {
      // ...other code
      return <h1>王洪岩</h1>
    }
    

    你肯定疑惑过,下面的代码都没有用到 React,为什么要引入 React 呢?

    如果你把

    import React from ‘react’

    删掉,还会报下面这样的错误:

    React is not defined

    那么究竟是哪里用到了这个 React,导致我们引入 React 会报错呢,不懂这个原因,那么就是 JSX 没有搞得太明白。

    你可以讲上面的代码(忽略导入语句)放到在线 babel 里进行转化一下,发现 babel 会把上面的代码转化成:

    function A() {
      // ...other code
      return React.createElement("h1", null, "王洪岩");
    }
    

    因为从本质上讲,JSX 只是为 React.createElement(component, props, ...children) 函数提供的语法糖。

    为什么要用 className 而不用 class

    1. React 一开始的理念是想与浏览器的 DOM API 保持一直而不是 HTML,因为 JSX 是 JS 的扩展,而不是用来代替
      HTML 的,这样会和元素的创建更为接近。在元素上设置 class 需要使用 className 这个 API:
    const element = document.createElement("div")
    element.className = "hello" 
    
    1. 浏览器问题,ES5 之前,在对象中不能使用保留字。以下代码在 IE8 中将会抛出错误:
    const element = {
     attributes: {
       class: "hello"
     }
    } 
    
    1. 解构问题,当你在解构属性的时候,如果分配一个 class 变量会出问题:
    const { class } = { class: 'foo' } // Uncaught SyntaxError: Unexpected token }
    const { className } = { className: 'foo' } 
    const { class: className } = { class: 'foo' } 
    

    为什么属性要用小驼峰

    因为 JSX 语法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小驼峰命名)来定义属性的名称,而不使用 HTML 属性名称的命名约定。(来自 JSX 简介)

    为什么 constructor 里要调用 super 和传递 props

    这是官网的一段代码,具体见:状态(State) 和 生命周期

    class Clock extends React.Component {
      constructor(props) {
        super(props);
        this.state = {date: new Date()};
      }
    
      render() {
        return (
          <div>
            <h1>Hello, world!</h1>
            <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
          </div>
        );
      }
    }
    

    而且有这么一段话,不仅让我们调用 super 还要把 props 传递进去,但是没有告诉我们为什么要这么做。

    注意:我们如何将props传递给基础构造函数:
    constructor(props) {
        super(props);
        this.state = {date: new Date()};
      }
      类组件应始终使用props调用基础构造函数
    

    不知道你有没有疑惑过为什么要调用 super 和传递 props,接下来我们来解开谜题吧。

    为什么要调用 super

    其实这不是 React 的限制,这是 JavaScript 的限制,在构造函数里如果要调用 this,那么提前就要调用 super,在 React 里,我们常常会在构造函数里初始化 state,this.state = xxx ,所以需要调用 super。

    为什么要传递 props

    你可能以为必须给 super 传入 props,否则 React.Component 就没法初始化 this.props

    class Component {
      constructor(props) {
        this.props = props;
        // ...
      }
    }
    

    不过,如果你不小心漏传了 props,直接调用了 super(),你仍然可以在 render 和其他方法中访问 this.props(不信的话可以试试嘛)。

    为啥这样也行?因为React 会在构造函数被调用之后,会把 props 赋值给刚刚创建的实例对象:

    const instance = new YourComponent(props);
    instance.props = props;
    

    props 不传也能用,是有原因的。

    但这意味着你在使用 React 时,可以用 super() 代替 super(props) 了么?

    那还是不行的,不然官网也不会建议你调用 props 了,虽然 React 会在构造函数运行之后,为 this.props 赋值,但在 super() 调用之后与构造函数结束之前, this.props 仍然是没法用的。

    // Inside React
    class Component {
      constructor(props) {
        this.props = props;
        // ...
      }
    }
    
    // Inside your code
    class Button extends React.Component {
      constructor(props) {
        super(); // ? 忘了传入 props
        console.log(props); // ✅ {}
        console.log(this.props); // ? undefined
      }
      // ...
    }
    

    要是构造函数中调用了某个访问 props 的方法,那这个 bug 就更难定位了。因此我强烈建议始终使用super(props),即使这不是必须的:

    class Button extends React.Component {
      constructor(props) {
        super(props); // ✅ We passed props
        console.log(props); // ✅ {}
        console.log(this.props); // ✅ {}
      }
      // ...
    }
    

    上面的代码确保 this.props 始终是有值的。

    如果你想避免以上的问题,你可以通过class 属性提案 来简化代码:

    class Clock extends React.Component {
      state = {date: new Date()};
    
      render() {
        return (
          <div>
            <h1>Hello, world!</h1>
            <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
          </div>
        );
      }
    }
    

    为什么组件用大写开头

    前面已经说过了,JSX 是 React.createElement(component, props, …children) 提供的语法糖,component 的类型是:string/ReactClass type,我们具体看一下在什么情况下会用到 string 类型,什么情况下用到 ReactClass type 类型

    • string 类型 react会觉得他是一个原生dom节点
    • ReactClass type 类型 自定义组件

    例如(string):在 jsx 中我们写一个

    <div></div>
    

    转换为js的时候就变成了

    React.createElement("div", null)
    

    例如(ReactClass type):在jsx中我们写一个

    function MyDiv() {
        return (<div><div>)
    }
    <MyDiv></MyDiv>
    

    转换为js的时候就变成了

    function MyDiv() {
      return React.createElement("div", null);
    }
    
    React.createElement(MyDiv, null);
    

    上边的例子中如果将MyDiv中的首字母小写,如下

    function myDiv() {
        return (<div><div>)
    }
    <myDiv></myDiv>
    

    转换为 js 的时候就变成了

    function MyDiv() {
      return React.createElement("div", null);
    }
    
    
    React.createElement("myDiv", null);
    

    由于找不到 myDiv 这个 dom,所以就会报错。

    为什么调用方法要 bind this

    前提知识:深刻的理解 JavaScript 中的 this

    相信刚写 React 的时候,很多朋友可能会写类似这样的代码:

    class Foo extends React.Component {
      handleClick () {
        this.setState({ xxx: aaa })
      }
    
      render() {
        return (
          <button onClick={this.handleClick}>
            Click me
          </button>
        )
      }
    }
    

    发现会报 thisundefined 的错,然后可能对事件处理比较疑惑,然后去看官网的事件处理有下面一段话:

    你必须谨慎对待 JSX 回调函数中的 this,在 JavaScript 中,class 的方法默认不会绑定this。如果你忘记绑定 this.handleClick 并把它传入了 onClick,当你调用这个函数的时候 this 的值为 undefined
    这并不是 React 特有的行为;这其实与 JavaScript 函数工作原理有关。通常情况下,如果你没有在方法后面添加 (),例如 onClick={this.handleClick},你应该为这个方法绑定 this

    然后你看了官网的例子和建议之后,知道需要为事件处理函数绑定 this就能解决,想下面这样:

    class Foo extends React.Component {
      handleClick () {
        this.setState({ xxx: aaa })
      }
    
      render() {
        return (
          <button onClick={this.handleClick.bind(this)}>
            Click me
          </button>
        )
      }
    }
    

    但是可能你没有去思考过为什么需要 bind this?如果你不能理解的话,还是 js 的基础没有打好。

    React 是如何处理事件的?

    咱们先来了解一下 React 是如何处理事件的。

    React 的事件是合成事件, 内部原理非常复杂,我这里只把关键性,可以用来解答这个问题的原理部分进行介绍即可。

    之前说过,jsx 实际上是 React.createElement(component, props, …children) 函数提供的语法糖,那么这段 jsx 代码:

     <button onClick={this.handleClick}>
         Click me
     </button>
    

    会被转化为:

    React.createElement("button", {
         onClick: this.handleClick
    }, "Click me")
    

    了解了上面的,然后简单的理解 react 如何处理事件的,React 在组件加载(mount)和更新(update)时,将事件通过 addEventListener 统一注册到 document 上,然后会有一个事件池存储了所有的事件,当事件触发的时候,通过 dispatchEvent 进行事件分发。

    所以你可以简单的理解为,最终 this.handleClick 会作为一个回调函数调用。

    理解了这个,然后再来看看回调函数为什么就会丢失 this

    this 简单回顾

    在函数内部,this的值取决于函数被调用的方式。

    如果你不能理解上面那句话,那么你可能需要停下来阅读文章,去查一下相关资料,否则你可能看不懂下面的,如果你懒的话,就看为你准备好的 MDN 吧。

    通过上面对事件处理的介绍,来模拟一下在类组件的 render 函数中, 有点类似于做了这样的操作:

    class Foo {
        sayThis () {
             console.log(this); // 这里的 `this` 指向谁?
         }
    
         exec (cb) {
             cb();
         }
    
        render () {
             this.exec(this.sayThis);
      }
    }
    
    var foo = new Foo();
    foo.render(); // 输出结果是什么?
    

    你会发现最终结果输出的是 undefined,如果你不理解为什么输出的是 undefined,那么还是上面说的,需要去深刻的理解 this 的原理。如果你能理解输出的是 undefined,那么我觉得你就可以理解为什么需要 bind this 了。

    那么你可能会问:
    为什么React没有自动的把 bind 集成到 render 方法中呢?
    在 exec 调用回调的时候绑定进去,像这样:

    class Foo {
        sayThis () {
             console.log(this); // 这里的 `this` 指向谁?
         }
    
         exec (cb) {
             cb().bind(this);
         }
    
        render () {
             this.exec(this.sayThis);
      }
    }
    
    var foo = new Foo();
    foo.render(); // 输出结果是什么?
    

    因为 render 多次调用每次都要 bind 会影响性能,所以官方建议你自己在 constructor 中手动 bind 达到性能优化。

    四种事件处理对比

    对于事件处理的写法也有好几种,咱们来进行对比一下:

    1. 直接 bind this 型

    就是像文章开始的那样,直接在事件那里 bind this

    class Foo extends React.Component {
      handleClick () {
        this.setState({ xxx: aaa })
      }
    
      render() {
        return (
          <button onClick={this.handleClick.bind(this)}>
            Click me
          </button>
        )
      }
    }
    

    优点: 写起来顺手,一口气就能把这个逻辑写完,不用移动光标到其他地方。

    缺点: 性能不太好,这种方式跟 react 内部帮你 bind 一样的,每次 render 都会进行 bind,而且如果有两个元素的事件处理函数式同一个,也还是要进行 bind,这样会多写点代码,而且进行两次 bind,性能不是太好。(其实这点性能往往不会是性能瓶颈的地方,如果你觉得顺手,这样写完全没问题)

    2. constuctor 手动 bind 型

    class Foo extends React.Component {
      constuctor(props) {
        super(props)
        this.handleClick = this.handleClick.bind(this)
      }
      handleClick () {
        this.setState({ xxx: aaa })
      }
    
      render() {
        return (
          <button onClick={this.handleClick}>
            Click me
          </button>
        )
      }
    }
    

    优点: 相比于第一种性能更好,因为构造函数只执行一次,那么只会 bind 一次,而且如果有多个元素都需要调用这个函数,也不需要重复 bind,基本上解决了第一种的两个缺点。

    缺点: 没有明显缺点,硬要说的话就是太丑了,然后不顺手(我觉得丑,你觉得不丑就这么写就行了)。

    3. 箭头函数型

    class Foo extends React.Component {
      handleClick () {
        this.setState({ xxx: aaa })
      }
    
      render() {
        return (
          <button onClick={(e) => this.handleClick(e)}>
            Click me
          </button>
        )
      }
    }
    

    优点: 顺手,好看。

    缺点: 每次 render 都会重复创建函数,性能会差一点。

    4. public class fields 型

    这种 class fields还处于实验阶段,据我所知目前还没有被纳入标准,具体可见这里。

    class Foo extends React.Component {
      handleClick = () => {
        this.setState({ xxx: aaa })
      }
    
      render() {
        return (
          <button onClick={this.handleClick}>
            Click me
          </button>
        )
      }
    }
    

    优点: 好看,性能好。

    缺点: 没有明显缺点,如果硬要说可能就是要多装一个 babel 插件来支持这种语法。

    总结

    我平时用的就这四种写法,我这边从代码的美观性、性能以及是否顺手方便对各种写法做了简单的对比。其实每种方法在项目里用都是没什么问题的,性能方面基本上可以忽略,对于美观性和顺手比较主观,所以总体来说就是看大家的偏好咯,如果硬要推荐的话,我还是比较推荐第四种写法,美观而且不影响性能。

    为什么要 setState,而不是直接 this.state.xx = oo

    为啥不能直接修改 state,要 setState 一下。我在想,从 vue 转到 React 可能也会有这种疑问,因为 vue 修改状态都是直接改的。

    如果我们了解 setState 的原理的话,可能就能解答这个问题了,setState 做的事情不仅仅只是修改了 this.state 的值,另外最重要的是它会触发 React 的更新机制,会进行 diff ,然后将 patch 部分更新到真实 dom 里。

    如果你直接 this.state.xx == oo 的话,state 的值确实会改,但是改了不会触发 UI 的更新,那就不是数据驱动了。

    那为什么 Vue 直接修改 data 可以触发 UI 的更新呢?因为 Vue 在创建 UI 的时候会把这些 data 给收集起来,并且在这些 data 的访问器属性 setter 进行了重写,在这个重写的方法里会去触发 UI 的更新。如果你想更多的了解 vue 的原理,可以去看看《 Vue.js 内部运行机制》。

    setState 是同步还是异步相关问题

    1. setState 是同步还是异步?

    我的回答是执行过程代码同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形式了所谓的“异步”, 所以表现出来有时是同步,有时是“异步”。

    2. 何时是同步,何时是异步呢?

    只在合成事件和钩子函数中是“异步”的,在原生事件和 setTimeout/setInterval等原生 API 中都是同步的。简单的可以理解为被 React 控制的函数里面就会表现出“异步”,反之表现为同步。

    3. 那为什么会出现异步的情况呢?

    为了做性能优化,将 state 的更新延缓到最后批量合并再去渲染对于应用的性能优化是有极大好处的,如果每次的状态改变都去重新渲染真实 dom,那么它将带来巨大的性能消耗。

    4. 那如何在表现出异步的函数里可以准确拿到更新后的 state 呢?

    通过第二个参数 setState(partialState, callback) 中的 callback 拿到更新后的结果。

    或者可以通过给 setState 传递函数来表现出同步的情况:

    this.setState((state) => {
        return { val: newVal }
    })
    

    5. 那表现出异步的原理是怎么样的呢?

    我这里还是用最简单的语言让你理解:在 React 的 setState 函数实现中,会根据 isBatchingUpdates(默认是 false) 变量判断是否直接更新 this.state 还是放到队列中稍后更新。然后有一个 batchedUpdate 函数,可以修改 isBatchingUpdates 为 true,当 React 调用事件处理函数之前,或者生命周期函数之前就会调用 batchedUpdate 函数,这样的话,setState 就不会同步更新 this.state,而是放到更新队列里面后续更新。

    这样你就可以理解为什么原生事件和 setTimeout/setinterval 里面调用 this.state 会同步更新了吧,因为通过这些函数调用的 React 没办法去调用 batchedUpdate 函数将 isBatchingUpdates 设置为 true,那么这个时候 setState 的时候默认就是 false,那么就会同步更新。

    最后

    setState 是 React 非常重要的一个方法,值得大家好好去研究一下他的原理。

    展开全文
  • 测试知识重难点

    千次阅读 2019-04-18 17:48:00
    PM(项目主管)、PL(项目经理)、SL(项目小组长)、QA(品质保证人员)、QC(品质控制人员)、SE(系统架构师)、PMO(质量管理部门)、PT(测试工程师)。 38、评审阶段: 需求评审、设计评审、代码评审、测试评审。 39、风险...
  • 前言 本篇文章的作者是来自阿里淘系用户增长前端团队的“亦逊”,18年作为双非本科生通过层层面试,校招进入阿里,今天以过来人的身份给大家分享在面试官问起项目经验时,该如何回答。 说起面试 说起校招面试,大家...
  • 在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见的问法是,说下你最近的(或最拿得出手的)一个项目。根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚至有人说出项目...
  • 涉及内容:项目、网络、数据库、算法题 1. 自我介绍 2. 项目中的有挑战的点(问了大概有五六个问题) 3. 问了下本科啥专业的,学过哪些课程(主要是为了下面面试问题的内容,我说了操作系统和计算机网络学的时间久了...
  • TypeScript进阶 之 重难点梳理

    千次阅读 2020-03-23 12:50:00
    首先推荐下 ts 的编译环境:typescriptlang.org 再推荐笔者收藏的几个网站: Typescript 中文网 深入理解 Typescript TypeScript Handbook TypeScript 精通指南 下面,逐个难点梳理,逐个击破。 可索引类型 关于ts ...
  • android重难点解析

    千次阅读 2015-12-14 21:31:42
    另外在我的OkHttpPlus项目中,构造一个Http请求也是这样的,有可能你只需要设置URL,有可能需要添加请求参数、Http Header等,这个时候建造者模式也是比较合适的。 单例模式 单例在Android开发中经常用到...
  • 前端技术难点

    千次阅读 2020-04-09 10:39:07
    1、前端安全:CSRF、XSS、sql注入 2、前端性能优化:serviceworker、性能分析 3、服务端渲染:nextjs、express、静态资源缓存 4、node中间层的目的:服务端渲染、SEO、内网接口访问、多接口并发、跨域等 ...
  • 项目中碰到的问题,最好说框架本身问题,能体现个人能力,也避免问题太低级被面试官看low,刚好之前有发现一个dubbo的bug,所以这问题应该回答的还可以。 为什么换工作,每轮都会问,这个得想好。 第四轮: 交叉面...
  • web前端面试重点难点问题

    千次阅读 多人点赞 2020-03-24 22:54:17
    //3 详细解答:https://github.com/Wscats/articles/issues/85 其他问题 这些是开放性的问题,根据自己的实际与经验回答 Q:开发过程需注意的地方? Q:有在学习或了解什么新的技术吗? Q:对自己的职业规划? Q:...
  • React 重难点

    2019-09-17 16:51:42
    其实每种方法在项目里用都是没什么问题的,性能方面基本上可以忽略,对于美观性和顺手比较主观,所以总体来说就是看大家的偏好咯,如果硬要推荐的话,我还是比较推荐第四种写法,美观而且不影响性能。 为什么要 ...
  • 这里主要放腾讯面经 一面 0、说说做过的项目(差不多包括了自我介绍) 说一下我表达的重点:我做了AndroidQ的适配;我在项目中使用了新的技术:LiveData、BiometricPrompt;我使用到了设计模式:工厂、简单工厂、...
  • 乐观锁使用 hashmap底层原理 arraylist底层原理 webview如何做资源缓存 hashmap扩容 一张图片100*100的图片在内存中的大小 项目里面的难点(如何解决,解决方案是什么) 一个app发布一个版本后,发现变卡了,你如何...
  • 当我们做一个大一点的项目,需要熟练用到很多相关技术面,甚至会用到组件化技术。如果你长期只使用一些常用的技术点,那么你可能还有很长一段时间要待在小公司搬运代码了。 怎么样搭建知识框架呢? 这里分享的方式是...
  • 而且我认为一个“面经”真正有价值的内容是面试前你是如何学习的,面试中面对不会的题目你是如何回答的,以及面试后的你的感受和总结,而不是冷冰冰的罗列题目。 一、什么是架构师? 曾经有这么个段子: 甲:我已经...
  • “我们的招聘要求又不高,能做项目就行,但为什么就是招不到人?” 很多公司还面临一个问题,招聘的时候这人各方面都不错,但上岗了就是不出活,绩效平平。 要解决上面的这两个问题,需要一个衡量人能力的标准,这个...
  • Q1:如果零基础现在突击考“系统集成项目管理工程师”的话,有什么经验或者学习方法吗? 两点建议:分解目标,逐个击破;常做真题,全面提升。 系统集成考试分为两个部分,一个是IT部分,一个是项目管理部分。 零...
  • web前端面试十大 难点问题

    千次阅读 2020-10-13 11:56:52
    1、什么是闭包?闭包的用途是什么?闭包的缺点是什么? 定义: 闭包是函数和函数内部能访问到的变量的总和。 具体实现:在函数A中声明了函数B,并在函数B中使用了A内部的局部变量或形参,函数B以返回值或对象属性...
  • 前言 文章篇幅较长,建议耐心食用,相信...上上周,他们中有几个生通过微信找我咨询了一些找工作的问题,包括面试会问哪些技术,怎么更好的回答,如何怎么选择工作机会等等。和他们沟通交流中可以明显感觉他们的就业焦
  • 一网打尽react重难点

    2019-11-27 15:25:40
    作者:神奇的Aym ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 网上各种言论说 React 上手比 Vue 难,可能难就难不能深刻理解 JSX,或者对 ES6 的一些特性理解得不够深刻,...
  • 最近在准备面试,然后复习下之前写过的项目,书籍,笔记,文章。一看很多知识点都没有印象,最可拍的是连自己为了防止忘记写的文章竟然都感觉不是自己写的。有些开始怀疑人生了。 好了,废话少说,离金三银四求职...
  • 前言(1),重难点整理

    2021-09-08 17:13:19
    原谅我只记住了这些,这次面试技术上更偏向于js基础知识,问了很多口头判断题,只需要回答yes or no就可以了。 如果有想去向清远墨墨这样的小公司实习的,笔者建议多了解这个公司的相关信息,因为很可能接触到BOSS的...
  • JavasScript重难点知识

    2018-01-03 12:19:47
    这里提一个小点,我们在业务开发过程中,经常会重复用到日期格式化、url参数转对象、浏览器类型判断、节流函数等一类函数,这些工具类函数,基本上在每个项目都会用到,为避免不同项目多次复制粘贴的麻烦,我们可以...
  • 很多人说Android开发前景越来越差了 我觉得这个回答是片面的 首先Android应用开发前景差是在最近两年出现的,也就是从2018开始,从那时起移动端的程序员已经慢慢出现供大于求的局面,本人作为移动端开发,深知这一点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,014
精华内容 2,005
关键字:

如何回答项目中难点