Java开发工程师(实习)-面试总结

2019-04-14 22:08发布

class="markdown_views prism-atom-one-light">

前言

本人目前是个大三的学生,最近一直在准备面试,就在今天上午电面试了两家内推的公司(闪电购,二维火),这两家公司都在杭州,本来他们要我去现场面的,因为来回不方便,然后就和他们HR谈了谈是否能够先电面,幸运的是她们给了我电面的机会。

2018.6.26 杭州-闪电购

这两家公司面试时间都为今天上午10点,首先9:40时二维火的HR先打电话给我,叫我10:00要保持电话的畅通。然后9:55左右,闪电购的电话打给我了,然后我们就开始电面了…
问了以下内容(有些记不起来了)
  1. 在学校的经历,项目经历
  2. 框架方面
    解决乱码?
    Json,如何在spring mvc中配置?
    如何免密登录?
    聊一聊分布式架构?
  3. core java
    抽象类,接口区别?
    HashMap实现原理?
    集合:ArrayList,LinkedList?
    拦截器,过滤器?
    多线程共享资源同步?
4.你还要什么想要问的么 总之,我和面试官还是聊得比较可以,基本上我都答出来了最后他应该是打算让我过去了,让我去做他们的营销模块,让我等通知…

2018.6.26 杭州-二维火

刚面完闪电购后,没过多久,二维火来电话了。这个面试大概快面了1个小时左右,不过问的东西也是比较多的。
问了以下内容(有些记不起来了)
  1. 在学校的经历,项目经历
    介绍你的项目,及你干了哪些模块
  2. 问技术了(问的顺序不记得了)
    数组扩容机制:原理
    消息队列:应用场景
    Dubbo: 实现方式
    Mybatis:动态sql
    mysql查询优化,分库分表如何实现
    你会怎么设计数据库表(原则3大范式)
    索引,要怎么设
    HashMap底层原理 怎么实现安全:CurrentHashMap
    ArrayList,LinkedList,Vector区别?
    场景:登录,如何做好安全机制,数字签名,token,shiro
    场景:多线程,100个请求,服务端负载10个,如何解决:queue
    多线程如何同步共享资源
    分布式架构中,介绍一个你做的模块
    Spring,spring mvc 谁的范围更大一些
    jdk动态代理,cglib,如何在spring修改动态代理,jdk,cglib代理的区别
    乱码问题:如何在web.xml中配置
    拦截器,过滤器的区别,及如何实现
    Aop,拦截器的区别,日志功能
    Log4j ,slf4j,java自带的日志
    抽象类,接口区别
    重写和重载的区别
    Jdk信号量?
    bean装配方式,有什么区别?
    Solr,搜索引擎?
    你知道我们公司是干什么的么?
面试完后,我也是后知后觉,发现自己口干舌燥了,哈哈哈。不过在最后还是得到了面试官的肯定。其中我有一些技术不是很了解,然后面试官简单的告诉了我,让我可以在这方面加强点。这个面试官还是非常好的,然后没多久,立马就接到了二维火HR的电话,她们刚收的面试官的反馈信息,让我找个时间去她们公司见个面,交流交流。

大脑充电

  1. 数组扩容机制:
    Arrays.copyOf()不仅仅只是拷贝数组中的元素,创建一个新的数组对象。
    System.arrayCopy只拷贝已经存在数组元素。
    System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));
    original - 源数组。
    0 - 源数组中的起始位置。
    copy - 目标数组。
    0 - 目标数据中的起始位置。
    Math.min(original.length, newLength) - 要复制的数组元素的数量。
    从速度上看:System.arraycopy > clone > Arrays.copyOf > for
  2. 消息队列:
  3. mysql查询优化:
    1:查询语句where 子句使用时候优化或者需要注意的
    2:like语句使用时候需要注意
    3:in语句代替语句
    4:索引使用或是创建需要注意
    1.避免全表扫描,首先应该考虑在where,order by涉及的列上建立索引
    2.尽量避免where的子句对null值判断,i=,<>否则将导致引擎放弃使用索引而对全表进行扫描Select from where num is null //我们可以设置默认值为0
    3.用具体的字段代替*,不要返回用不到的字段
    4.避免在where子句中使用or来连接条件,否则导致放弃使用索引而进行全表扫描。可以使用 union 或者是 union all代替。
    5.很多时候用exists 代替 in是一个很好的选择。
    索引创建需注意:
    索引固然可以提高查询效率->降低insert,update的效率(会重建索引或是修改索引)
    所以索引的创建要慎重,视情况而定。一个表中数量最好不要超过6个 导致全表扫描
    in,not in慎用->betweenLike ‘%李%’ ->考虑全文索引比如solr或是luncene
    Hash/Btree索引区别?
    索引帮助mysql获取数据的数据结构,常见的2种索引
    Innodb,MYISAM引擎:Btree
    Mermory:Hash
    Hash:某类->hash->hash数组 (一次定位,效率高,btree经过多次磁盘io)
    但是有好多缺点:不能查询范围,排序方面,hash大量重复效率低
    Btree:
    MyIsam:数据文件和索引是分开的,非聚集索引

  1. 数字签名:
    签名认证是对非对称加密技术与数字摘要技术的综合运用
    带有秘钥(公,私)的消息摘要算法,私:签名 公:验证
    作用:验证数据的完整性,认证数据来源
  2. Java的三种代理模式
    1.1.静态代理
    1.2.动态代理(JDK代理,接口代理)
    1.3.Cglib代理(基于继承的方式实现)(子类代理)
  3. java Semaphore信号量
    Synchronized,lock:多个线程并发同一资源造成的数据不一致的问题
    Semaphore信号量实现资源的多副本的并发访问控制,一个计数信号量,它的本质是一个”共享锁”。
    Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。
    Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。
    就好比一个厕所管理员,站在门口,只有厕所有空位,就开门允许与空侧数量等量的人进入厕所。多个人进入厕所后,相当于N个人来分配使用N个空位。为避免多个人来同时竞争同一个侧卫,在内部仍然使用锁来控制资源的同步访问。