精华内容
下载资源
问答
  • 面试题总结 —— JAVA高级工程师

    万次阅读 多人点赞 2016-03-03 12:03:31
    面试题总结——JAVA高级工程师 近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们 一、无笔试题 不知道是不是职位...

    面试题总结——JAVA高级工程师

    近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们

     

    一、无笔试题

     

    不知道是不是职位原因还是没遇到,面试时,都不需要做笔试题,而是填张个人信息表格,或者直接面试

     

     

    二、三大框架方面问题

     

    1、Spring 事务的隔离性,并说说每个隔离性的区别

    解答:Spring事务详解
     

    2、Spring事务的传播行为,并说说每个传播行为的区别

    解答:Spring事务详解
     

    3、hibernate跟Mybatis/ ibatis 的区别,为什么选择?

    解答:Hibernate与Mybatis的比较
     

    4、Struts跟Spring mvc的优缺点,让你选会如何选

    解答:Spring MVC 与 Struts的区别
     

    5、简单说说Spring 事务机制

    解答:Spring事务机制
     

    6、Spring 4.0新特性

    解答:Spring4新特性

     

     

     

    三、负载均衡、集群相关

    1、weblogic 负载均衡的原理和集群的配置

    解答:a、WEBLOGIC负载均衡原理    b、负载均衡和集群的配置(参考)
     

    2、Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享 

    解答:配置参考
     

    3、nginx配置文件详解——nginx.conf

    解答:Nginx配置文件详细说明

     

     

     

    四、项目优化相关

    1、web如何项目优化

    解答:这个我整理过一次,web项目性能优化(整理)
     

    2、单例模式有几种? 如何优化?

    解答:单例模式的7中用法
     

    3、简单说说线程池的原理和实现

    解答:线程原理及实现

     

     

     

     

     

    五、并发和安全方面

    1、项目并发如何处理?(我们是web项目)

    解答:高并发量网站解决方案,另外,还有数据库乐观锁,数据库读写分离、使用消息队列、多用存储过程等等
     

    2、简单说说功能权限存在的水平权限漏洞和垂直权限漏洞的场景和解决办法(因为我们目前权限级别就是功能权限)

    解答:
    A、水平权限漏洞,如下图




    假设机构有 用户A和用户B 两个用户,其中A有1、2和3权限 ,  用户B有 2 和3 的权限,这时候假设用户B 知道1,并给自己添加1的权限,这时候就是水平权限漏洞。
    目前解决办法:1、限制入口,让用户B无法编辑自己的权限   2、对用户B无法进行向上扩展。最根本的解决办法是深入到数据权限
    解答:水平权限漏洞和解决办法


    B、垂直权限漏洞
    解答:垂直权限漏洞案例和解决方案
     

    3、平台上的图片如何防盗链

    解答:http下载防盗链原理:http协议的字段referer记录来实现
     

    4、如何区分上传的图片是不是木马?

    解答:1、看上传的图片后缀  2、如何后缀是篡改的,那么每个文件有个魔术数字  文件上传-魔术数字
     

    5、消息队列的原理和实现

    解答:1、消息队列原理     2、深入浅出 消息队列 ActiveMQ

     

     

     

     

     

    六、数据库方面

    1、mysql查询字段区不区分大小写?

    解答:不区分,哪怕值也不区分(我当时还反问了,区不区分大小的应用含义有哪些,面试官没说得出来)
     

    2、简单说说数据库集群和负载均衡、分布式(我不懂这块)

    解答:数据库负载均衡和集群参考参考2
     

    3、存储过程的结构和优点

    解答:大概结构  
    存储过程的优缺点
     

    4、触发器的原理和作用

    解答:参考

     

     

     

     

     

     

    大体就这些,还有一些忘了,等记起来再补充,或者其他兄弟姐妹们遇到了,也可以私聊或者回复给我,希望能帮助到大家~  

     

    个人博客:我的博客

     

     

    展开全文
  • Java高级工程师常见面试题-总结

    千次阅读 多人点赞 2018-07-23 10:03:43
    Java高级工程师常见面试题(一)-Java基础 》 《Java高级工程师常见面试题(二)-Java IO》 《Java高级工程师常见面试题(三)-Java Web》 《Java高级工程师常见面试题(四)-JVM》 《Java高级工程师常见面试...
    展开全文
  • 面试总结——Java高级工程师(三)

    万次阅读 多人点赞 2016-11-08 23:59:36
    面试总结——高级JAVA工程师(二)  。 总而言之该看的还是得看,还学的还是得学。 再次强调,基础很重要!面试技巧同样很重要 ,还是那句话:祝愿各位看官都能找到心仪的工作吧~~  另外,奉劝大家不要频繁...

    面试前面也总结了一和二, 这第三篇可能更偏向于是内心的独白篇和面试技巧总结吧.....

     

    一、独白

         之前也面试别人,现在轮到自己找工作,怎么说呢,每个面试官的看法不一样,面试的方式就不一样,比如我面试别人我喜欢问项目中他用到了那些,然后针对用到的技术去问一些问题,或者说对于某些场景的一些技术实现方案是我特别喜欢问的,比如当你的接口服务数据被人截包了,你如何防止数据恶意提交?    相对来说,Java的底层和基础会问的少一点,当然问的少不是代表不问,而是说侧重点在于你的所做过的项目和你的设计思路如何。当然,懂基础和底层更好,这样能让你知其然,更知其所以然,写出来的代码和程序更具有健壮性和可维护性。所以说,基础还是很重要的。

         现在轮到自己出去面试,怎么说呢,其实还是挺紧张的,原以为自己不会因此紧张或者焦虑,实际上,还是有的,在没找到合适的工作的时候,甚至晚上有点睡不着觉,总觉着有什么事压在心头,睡觉都不安心。既然睡不着,那还是看看资料吧,我有个习惯,睡前看点问题,第二天早上就能想到答案,睡前记点资料,第二天早上就能记得特别深刻,不说废话了,直接进入正题吧。

     

     

    二、面试技巧

    1、背熟你的简历

     

    原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技术都无法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,所以,切记:一定要背好自己的简历,不要求你能全部记下,至少要熟记你最近所待过的两家公司,这两家公司里面你做过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案(这个尤为重要)。

     

    2、深入了解并熟记部分Java基础知识

    原因:大部分公司无论面试初级还是高级,无论是笔试还是面试,都会问到一系列基础题,这些基础题大概涵括 jvm、字符串、集合、线程等等,如果说每一个让你死记硬背你肯定记不住,那么就是理解中记忆了,拿jvm来说 ,如果让你谈谈你对jvm的理解, 那么你首先得知道JVM有哪些结构组成,每个结构用来做什么的,然后考虑一个Java对象从创建到回收,如何途径JVM这些结构的。如果你从这些方面来综合记忆,相信事半功倍,并且你理解的更透彻。 至于如果让你谈集合,举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么同样的方法,你需要理解每一个的结构组成是什么,你才能知道他有什么作用,这样你在平时的用法上会更精炼,而且在面试过程中,也不至于哑口无言。

     

    3、保持自信心和沉重冷静的心态

    原因:面试过程中,自信是少不了的,相信你可以, 面试的路上可以自己对自己说一句: I belive I can !    反正我就是这么做的,自我的心里暗示吧,其实面对面试官的时候,你自信的状态也会让面试官觉得你是个很有底气的人,至少从感觉上会给你打个高分。另外还有就是保持沉重冷静,如果是让你提供技术方案或者说说某个技术原理,没必要一紧张一咕噜的什么都说,你可以对面试官说:我先想想,然后自己组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗?   面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,没关系,大胆的说忘了,或者直接说不知道。 要记住,有部分不知道没关系,如果全都知道,那你应该是CTO级别了(开个玩笑)。

     

    4、尽量记住面试过程中你回答不出来或者回答存在不妥的问题

    原因:面试失败了没关系,毕竟每个公司的要求不一样,问的问题和你擅长的方面可能有所出入,但是请记住一点:面试过程中那些你回答不出来问题,或者你自己感觉回答不太准确的问题,自己记下来,如果不会的,你可以当场问问面试官有没有好的解答,如果面试官不愿意告诉你(一般是基础方面面试官就懒得答你),那么你就自己回家慢慢查资料,如果是某些特定的技术,也可以自己写写案例什么的,毕竟知识点就那么多,问题百变,原理不变,面试也是一个学习知识的过程,让你了解大部分公司目前需要或者要求的技术。这次不知道,下次就知道了

     

    5、去面试之前,最好先了解你要去面试公司的情况(包括产品、项目情况)

    原因:俗话说,知己知彼,百战不殆,面试就是一场战斗,你需要了解你面试公司基本情况,包括岗位要求,这样你就能大概知道你需要面试的这家公司的技术要求情况。 为何让你去了解这家公司的主营产品和项目呢,就是让你大概了解这家公司的一个技术架构的情况,包括你可能对他们的一种实现方式提出质疑和疑惑,相信面试官很愿意帮你解答这些问题的。这样你既图了表现,也学到了知识,何乐而不为。

     

    6、合理安排你的面试时间(如果有多家公司的面试机会,尽量把你想去的公司放到最后去面试)

    原因:估计很多人都不理解这个,可能大部分的人对于如何安排面试时间比较迷茫,随意安排。可是这里有个技巧,如果同时有多个面试机会,你把你最想去的公司放到最末尾去面试,这样你经历过了前面的这些公司筛选,如果成功了是个机会,如果没成功,也是为最后做铺垫。  不过这里就需要考虑两点:1、你需要记住你投简历的公司和基本情况(这说明你不是海投的)    2、如果记不住,那么可以先应答一个时间,后续了解公司信息之后,通过邮件或者其他方式与其约定,调整面试时间。而且建议安排一天的面试公司不要超过两家,最好的是上午一家,下午一家,这样你能有充足的时间调整状态。

     

     

    三、面试题基础总结

    1、 JVM结构原理、GC工作机制详解

    答:具体参照:JVM结构、GC工作机制详解     ,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法  b、可达性分析算法(  这里的可达性,大家可以看基础2 Java对象的什么周期),至于更详细的GC算法介绍,大家可以参考:Java GC机制算法

    2、Java对象的生命周期

    答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:Java 对象的生命周期

     

    3、Map或者HashMap的存储原理

    答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理

     

    4、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

    答:看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果

     

    5、数据库存储日期格式时,如何考虑时区转换问题?

    答:使用TimeStamp ,  原因参照:Java编程中遇到的时区转换问题

     

    6、Java Object类中有哪些方法?

    答:Object有哪些方法

     

    7、HTTP协议,GET和POST 的区别

    答:浅谈HTTP中GET和POST的区别

     

     

    四、线程、设计模式、缓存方面

    1、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

    答:关于SimpleDateFormat安全的时间格式化线程安全问题

     

    2、如何看待设计模式,并简单说说你对观察者模式的理解

    答:1、设计模式有神马用     2、观察者模式类图及实现

     

    3、集群环境中,session如何实现共享

    答:1、Java集群之session共享    2、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其他服务器共享

     

    4、分布式、集群环境中,缓存如何刷新,如何保持同步?

    答:A、缓存如何刷新? 1、定时刷新  2、主动刷新覆盖   ,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可

    B、缓存如何保持同步?  这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现      ,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步

     

    5、一条sql执行过长的时间,你如何优化,从哪些方面?

    答:1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
    2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
    3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
    4、针对数量大的表进行历史表分离(如交易流水表)
    5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步

    6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等

    7、查看mysql执行日志,看看是否有其他方面的问题

    个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑

     

    五、设计方案相关

    面试还会问到一些关于设计方案相关的问题,比如

    1、你的接口服务数据被人截包了,你如何防止数据恶意提交?

    答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了

     

    2、假设服务器经常宕机,你从哪些方面去排查问题?

    答:这个就留个各位看官补充了,可评论回复

     

     

         面试技巧就补充这些,后面如果记得什么在补充,如果有其他小伙伴有其他建议,也可以在评论回复,其他面试问题还包括算法、数据结构、http协议等等,这些等待大家自己去补充学习了,Spring的原理,Spring mvc的原理问的也挺多的,大家有时间可以看看之前的面试总结——高级JAVA工程(一)和面试总结——高级JAVA工程师(二)   。

    总而言之该看的还是得看,还学的还是得学。再次强调,基础很重要!面试技巧同样很重要,还是那句话:祝愿各位看官都能找到心仪的工作吧~~

        另外,奉劝大家不要频繁跳槽,这些知识点能提升固然好,不要盲目跳槽,找工作很累的,而且没有哪家公司喜欢频繁跳槽的员工

        欢迎加群:157797573

     

     

    展开全文
  • Java高级工程师常见面试题(答案)

    万次阅读 多人点赞 2018-05-03 16:55:11
    Java高级工程师常见面试题2017年02月17日 12:46:00阅读数:17280 一、Java基础1. String类为什么是final的。 1.线程安全2.支持字符串常量池数据共享,节省资源,提高效率(因为如果已经存在这个常量便不会再创建,...
    Java高级工程师常见面试题

    一、Java基础

    1. String类为什么是final的。

        1.线程安全2.支持字符串常量池数据共享,节省资源,提高效率(因为如果已经存在这个常量便不会再创建,直接拿来用)

       2. HashMap的源码,实现原理,底层结构。

      

    总的来说,HashMap就是数组+链表(哈希表或者散列函数)的组合实现,每个数组元素存储一个链表的头结点,本质上来说是哈希表“拉链法”的实现。

    HashMap的链表元素对应的是一个静态内部类Entry,Entry主要包含key,value,next三个元素

    主要有put和get方法,put的原理是,通过hash&length-1计算index,此时记作Entry[index]=该元素。如果index相同

    就是新入的元素放置到Entry[index],原先的元素记作Entry[index].next

    get就比较简单了,先遍历数组,再遍历链表元素。

    null key总是放在Entry数组的第一个元素(允许存放一个空键值对的原因)

    解决hash冲突的方法:链地址法

    再散列rehash的过程:确定容量超过目前哈希表的容量,重新调整table 的容量大小,当超过容量的最大值时

    HashMap的容量size乘以负载因子[默认0.75] = threshold 将会触发扩容


    3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。

    queue的实现类: AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue

    4. 描述一下ArrayList和LinkedList各自实现和区别


    5. Java中的队列都有哪些,有什么区别。

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构

    Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。

    Queue的实现
    1、没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口
      内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue
      PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。 
      PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
      ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,          ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。


    2)实现阻塞接口的:
      java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
    五个队列所提供的各有不同:
      * ArrayBlockingQueue :一个由数组支持的有界队列。
      * LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
      * PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
      * DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
      * SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。


    6. 反射中,Class.forName和classloader的区别

    class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
    而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

    Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象


    7. Java7、Java8的新特性(baidu问的,好BT)


    java7有一些比较重要的更新,如异常处理增加了被抑制的异常、捕获多异常、try-with-resource自动释放资源等,还有应用了G1垃圾回收器、switch可以使用String类型、泛型自动判断类型、fork/join框架把任务细分并使用多处理器处理、支持二进制字面量等

    毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器、类库、开发工具和JVM(Java虚拟机)。在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景。

    最最重要的是Java8开始支持了Lambda表达式


    8. Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高

    9. Java内存泄露的问题调查定位:jmap,jstack的使用等等

    10. string、stringbuilder、stringbuffer区别

    11. hashtable和hashmap的区别

    1. HashMap是非线程同步的,HashTable是线程同步的。
    2. HashMap允许null作为键或者值,HashTable不允许
    3. HashTable中有个一个contains方法,HashMap去掉了此方法
    4. 效率上来讲,HashMap因为是非线程安全的,因此效率比HashTable高
    5. hashTable继承Dictionary,而HashMap继承Abstract

    13 .异常的结构,运行时异常和非运行时异常,各举个例子

    14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果

         编译时优化

    15. String 类的常用方法

    16. Java 的引用类型有哪几种

      对象的强、软、弱和虚引用(四种引用)

    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

    ⑴强引用(StrongReference)

    强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。  ps:强引用其实也就是我们平时A a = new A()这个意思。
    ⑵软引用(SoftReference)
    如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。
    软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
    ⑶弱引用(WeakReference)
    弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
    弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
    ⑷虚引用(PhantomReference)
    “虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收
    虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

    ReferenceQueue queue = new ReferenceQueue ();

    PhantomReference pr = new PhantomReference (objectqueue); 
    程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。


    17. 抽象类和接口的区别

    18. java的基础类型和字节大小。

    19. Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题(建议熟悉 jdk 源码,才能从容应答)

    20. 如果不让你用Java Jdk提供的工具,你自己实现一个Map,你怎么做。说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现

    21. Hash冲突怎么办?哪些解决散列冲突的方法?

    开放地址法  插入元素时,如果发生冲突,算法会简单的从该槽位置向后循环遍历hash表,直到找到表中的下一个空槽,并将该元素放入该槽中(会导致相同hash值的元素挨在一起和其他hash值对应的槽被占用)。查找元素时,首先散列值所指向的槽,如果没有找到匹配,则继续从该槽遍历hash表,直到:(1)找到相应的元素;(2)找到一个空槽,指示查找的元素不存在,(所以不能随便删除元素);(3)整个hash表遍历完毕(指示该元素不存在并且hash表是满的)

    拉链法(hashMap采用的是该种方法)

    再散列(双重散列,多重散列) 
       建立一个公共溢出区

    22. HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提升到log(n)咯,用二叉排序树的思路说了一通

    23. rehash

    24. hashCode() 与 equals() 生成算法、方法怎么重写

    如何重写equals()方法

    如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确保自己能写出一个健壮的equals()方法.一定要注意的一点是,在重写equals()后,一定要重写hashCode()方法.具体原因稍候再进行说明.
    我们先看看 JavaSE 7 Specification中对equals()方法的说明:
    • It is reflexive: for any non-null reference value xx.equals(x) should return true.
    • It is symmetric: for any non-null reference values x and yx.equals(y) should return true if and only if y.equals(x) returns true.
    • It is transitive: for any non-null reference values xy, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
    • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
    • For any non-null reference value xx.equals(null) should return false.
    这段话用了很多离散数学中的术数.简单说明一下:
    1. 自反性:A.equals(A)要返回true.
    2. 对称性:如果A.equals(B)返回true, 则B.equals(A)也要返回true.
    3. 传递性:如果A.equals(B)为true, B.equals(C)为true, 则A.equals(C)也要为true. 说白了就是 A = B , B = C , 那么A = C.
    4. 一致性:只要A,B对象的状态没有改变,A.equals(B)必须始终返回true.
    5. A.equals(null) 要返回false.

    相信只要不是专业研究数学的人,都对上面的东西不来电.在实际应用中我们只需要按照一定的步骤重写equals()方法就可以了.为了说明方便,我们先定义一个程序员类(Coder):
    1. class Coder {  
    2.     private String name;  
    3.     private int age;  
    4.     // getters and setters  

    我们想要的是,如果2个程序员对象的name和age都是相同的,那么我们就认为这两个程序员是一个人.这时候我们就要重写其equals()方法.因为默认的equals()实际是判断两个引用是否指向内在中的同一个对象,相当于 == . 重写时要遵循以下三步:
    1. 判断是否等于自身.
    1. if(other == this)  
    2.             return true;  
    2. 使用instanceof运算符判断 other 是否为Coder类型的对象.
    1. if(!(other instanceof Coder))  
    2.             return false;  
    3. 比较Coder类中你自定义的数据域,name和age,一个都不能少.
    1. Coder o = (Coder)other;  
    2.         return o.name.equals(name) && o.age == age;  
    看到这有人可能会问,第3步中有一个强制转换,如果有人将一个Integer类的对象传到了这个equals中,那么会不会扔ClassCastException呢?这个担心其实是多余的.因为我们在第二步中已经进行了instanceof 的判断,如果other是非Coder对象,甚至other是个null, 那么在这一步中都会直接返回false, 从而后面的代码得不到执行的机会.
    上面的三步也是<Effective Java>中推荐的步骤,基本可保证万无一失.

    如何重写hashCode()方法

    在JavaSE 7 Specification中指出,"Note that it is generally necessary to override the hashCode method whenever this method(equals) is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes."

    如果你重写了equals()方法,那么一定要记得重写hashCode()方法.我们在大学计算机数据结构课程中都已经学过哈希表(hash table)了,hashCode()方法就是为哈希表服务的.
    当我们在使用形如HashMap, HashSet这样前面以Hash开头的集合类时,hashCode()就会被隐式调用以来创建哈希映射关系.稍后我们再对此进行说明.这里我们先重点关注一下hashCode()方法的写法.

    <Effective Java>中给出了一个能最大程度上避免哈希冲突的写法,但我个人认为对于一般的应用来说没有必要搞的这么麻烦.如果你的应用中HashSet中需要存放上万上百万个对象时,那你应该严格遵循书中给定的方法.如果是写一个中小型的应用,那么下面的原则就已经足够使用了:
    要保证Coder对象中所有的成员都能在hashCode中得到体现.
    对于本例,我们可以这么写:
    1. @Override  
    2.     public int hashCode() {  
    3.         int result = 17;  
    4.         result = result * 31 + name.hashCode();  
    5.         result = result * 31 + age;  
    6.           
    7.         return result;  
    8.     }  

    其中int result = 17你也可以改成20, 50等等都可以.看到这里我突然有些好奇,想看一下String类中的hashCode()方法是如何实现的.查文档知:

    "Returns a hash code for this string. The hash code for a String object is computed as
     s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     
    using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)"
    对每个字符的ASCII码计算n - 1次方然后再进行加和,可见Sun对hashCode的实现是很严谨的. 这样能最大程度避免2个不同的String会出现相同的hashCode的情况.

    重写equals()而不重写hashCode()的风险

    在Oracle的Hash Table实现中引用了bucket的概念.如下图所示:


    从上图中可以看出,带bucket的hash table大致相当于哈希表与链表的结合体.即在每个bucket上会挂一个链表,链表的每个结点都用来存放对象.Java通过hashCode()方法来确定某个对象应该位于哪个bucket中,然后在相应的链表中进行查找.在理想情况下,如果你的hashCode()方法写的足够健壮,那么每个bucket将会只有一个结点,这样就实现了查找操作的常量级的时间复杂度.即无论你的对象放在哪片内存中,我都可以通过hashCode()立刻定位到该区域,而不需要从头到尾进行遍历查找.这也是哈希表的最主要的应用.

    如:
    当我们调用HashSet的put(Object o)方法时,首先会根据o.hashCode()的返回值定位到相应的bucket中,如果该bucket中没有结点,则将 o 放到这里,如果已经有结点了, 则把 o 挂到链表末端.同理,当调用contains(Object o)时,Java会通过hashCode()的返回值定位到相应的bucket中,然后再在对应的链表中的结点依次调用equals()方法来判断结点中的对象是否是你想要的对象.

    下面我们通过一个例子来体会一下这个过程:
    我们先创建2个新的Coder对象:
    1. Coder c1 = new Coder("bruce"10);  
    2.         Coder c2 = new Coder("bruce"10);  

    假定我们已经重写了Coder的equals()方法而没有重写hashCode()方法:
    1. @Override  
    2.     public boolean equals(Object other) {  
    3.         System.out.println("equals method invoked!");  
    4.           
    5.         if(other == this)  
    6.             return true;  
    7.         if(!(other instanceof Coder))  
    8.             return false;  
    9.           
    10.         Coder o = (Coder)other;  
    11.         return o.name.equals(name) && o.age == age;  
    12.     }  

    然后我们构造一个HashSet,将c1对象放入到set中:
    1. Set<Coder> set = new HashSet<Coder>();  
    2.         set.add(c1);  

    再执行:
    1. System.out.println(set.contains(c2));  

    我们期望contains(c2)方法返回true, 但实际上它返回了false.
    c1和c2的name和age都是相同的,为什么我把c1放到HashSet中后,再调用contains(c2)却返回false呢?这就是hashCode()在作怪了.因为你没有重写hashCode()方法,所以HashSet在查找c2时,会在不同的bucket中查找.比如c1放到05这个bucket中了,在查找c2时却在06这个bucket中找,这样当然找不到了.因此,我们重写hashCode()的目的在于,在A.equals(B)返回true的情况下,A, B 的hashCode()要返回相同的值

    我让hashCode()每次都返回一个固定的数行吗

    有人可能会这样重写:
    1. @Override  
    2.     public int hashCode() {  
    3.         return 10;  
    4.   
    5.     } 
    如果这样的话,HashMap, HashSet等集合类就失去了其 "哈希的意义".用<Effective Java>中的话来说就是,哈希表退化成了链表.如果hashCode()每次都返回相同的数,那么所有的对象都会被放到同一个bucket中,每次执行查找操作都会遍历链表,这样就完全失去了哈希的作用.所以我们最好还是提供一个健壮的hashCode()为妙.

    二、Java IO

    1. 讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。

    2. 讲讲NIO。

    3. String 编码UTF-8 和GBK的区别?

    4. 什么时候使用字节流、什么时候使用字符流?

    5. 递归读取文件夹下的文件,代码怎么实现

    三、Java Web

    1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。

    2. servlet的一些相关问题

    3. webservice相关问题

    4. jdbc连接,forname方式的步骤,怎么声明使用一个事务。举例并具体代码

    5. 无框架下配置web.xml的主要配置内容

    6. jsp和servlet的区别

    四、JVM

    1. Java的内存模型以及GC算法

    2. jvm性能调优都做了什么

    3. 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明

    4. 介绍GC 和GC Root不正常引用。

    5. 自己从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展

    6. jvm 如何分配直接内存, new 对象如何不分配在堆而是栈上,常量池解析

    7. 数组多大放在 JVM 老年代(不只是设置 PretenureSizeThreshold ,问通常多大,没做过一问便知)

    8. 老年代中数组的访问方式

    9. GC 算法,永久代对象如何 GC , GC 有环怎么处理

    10. 谁会被 GC ,什么时候 GC

    11. 如果想不被 GC 怎么办

    12. 如果想在 GC 中生存 1 次怎么办

    五、开源框架

    1. hibernate和ibatis的区别

    2. 讲讲mybatis的连接池。

    3. spring框架中需要引用哪些jar包,以及这些jar包的用途

    4. springMVC的原理

    5. springMVC注解的意思

    6. spring中beanFactory和ApplicationContext的联系和区别

     BeanFactory特点

    BeanFactory常用的实现类是DefaultListableBeanFactory,调用者只需要使用getBean()方法就可以获得指定的引用,无须关心Bean的实例化过程。创建Spring容器的实例时,必须提供Spring容器管理的Bean的详细配置信息。Spring的配置信息通常采用XML配置文件来设置,因此,创建BeanFactory实例时,应该提供XML配置文件作为参数。XML配置文件通常使用Resource对象传入。

    Resource isr = new ClassPathResource("beans.xml");
    //Resource isr = new FileSystemResource("beans.xml");
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    new XmlBeanDefinitionReader(beanFactory).loadBeanDefinition(isr);
    

    ApplicationContext特点

    ApplicationContext常用的实现类是FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotationConfigApplicationContext。如果在Web应用中使用Spring容器,则通常使用XmlWebApplicationContext、AnnotationConfigApplicationContext两个实现类。如果需要使用多个XML配置文件创建Spring容器,可以使用FileSystemXmlApplicationContext或者是ClassPathXmlApplicationContext。

    除了提供BeanFactory所支持的所有功能外,ApplicationContext还有额外的功能

    • 默认初始化所有的Singleton,也可以通过配置取消预初始化。
    • 继承MessageSource,因此支持国际化。
    • 资源访问,比如访问URL和文件。
    • 事件机制。
    • 同时加载多个配置文件。
    • 以声明式方式启动并创建Spring容器。

    由于ApplicationContext会预先初始化所有的Singleton Bean,于是在系统创建前期会有较大的系统开销,但一旦ApplicationContext初始化完成,程序后面获取Singleton Bean实例时候将有较好的性能。也可以为bean设置lazy-init属性为true,即Spring容器将不会预先初始化该bean。


    7. spring注入的几种方式(循环注入)

    8. spring如何实现事物管理的

     set注入(通常也叫属性注入),构造函数注入,接口注入(这个现在基本不用),注解注入(@Autowire)

    9. springIOC

    10. spring AOP的原理

    11. hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解)

     

    12. Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。

    六、多线程

    1. Java创建线程之后,直接调用start()方法和run()的区别

    2. 常用的线程池模式以及不同线程池的使用场景

    3. newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办,底层原理。

    4. 多线程之间通信的同步问题,synchronized锁的是对象,衍伸出和synchronized相关很多的具体问题,例如同一个类不同方法都有synchronized锁,一个对象是否可以同时访问。或者一个类的static构造方法加上synchronized之后的锁的影响。

    5. 了解可重入锁的含义,以及Lock 和synchronized的区别

    1. lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;(具体实现上的区别在《Java虚拟机》中有讲解底层的CAS不同,以前有读过现在又遗忘了。)
    2. synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
    3. lock等待锁过程中可以用interrupt来终端等待,而synchronized只能等待锁的释放,不能响应中断;
    4. lock可以通过trylock来知道有没有获取锁,而synchronized不能;
    5. Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)

    6. 同步的数据结构,例如concurrentHashMap的源码理解以及内部实现原理,为什么他是同步的且效率高

    7. atomicinteger和Volatile等线程安全操作的关键字的理解和使用

    8. 线程间通信,wait和notify

    9. 定时线程的使用

    10. 场景:在一个主线程中,要求有大量(很多很多)子线程执行完之后,主线程才执行完成。多种方式,考虑效率。

    11. 进程和线程的区别

    12. 什么叫线程安全?举例说明

    13. 线程的几种状态

    14. 并发、同步的接口或方法

    15. HashMap 是否线程安全,为何不安全。 ConcurrentHashMap,线程安全,为何安全。底层实现是怎么样的。

    16. J.U.C下的常见类的使用。 ThreadPool的深入考察; BlockingQueue的使用。(take,poll的区别,put,offer的区别);原子类的实现。

    17. 简单介绍下多线程的情况,从建立一个线程开始。然后怎么控制同步过程,多线程常用的方法和结构

    18. volatile的理解

    19. 实现多线程有几种方式,多线程同步怎么做,说说几个线程里常用的方法

    七、网络通信

    1. http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么。

    2. socket通信,以及长连接,分包,连接异常断开的处理。

    3. socket通信模型的使用,AIO和NIO。

    4. socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞。

    5. 同步和异步,阻塞和非阻塞。

    6. OSI七层模型,包括TCP,IP的一些基本知识

    7. http中,get post的区别

    8. 说说http,tcp,udp之间关系和区别。

    9. 说说浏览器访问www.taobao.com,经历了怎样的过程。

    10. HTTP协议、  HTTPS协议,SSL协议及完整交互过程;

    11. tcp的拥塞,快回传,ip的报文丢弃

    12. https处理的一个过程,对称加密和非对称加密

    13. head各个特点和区别

    14. 说说浏览器访问www.taobao.com,经历了怎样的过程。

    八、数据库MySql

    1. MySql的存储引擎的不同

    2. 单个索引、联合索引、主键索引

    3. Mysql怎么分表,以及分表后如果想按条件分页查询怎么办(如果不是按分表字段来查询的话,几乎效率低下,无解)

    4. 分表之后想让一个id多个表是自增的,效率实现

    5. MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离

    6. 写SQL语句。。。

    7. 索引的数据结构,B+树

    8. 事务的四个特性,以及各自的特点(原子、隔离)等等,项目怎么解决这些问题

    9. 数据库的锁:行锁,表锁;乐观锁,悲观锁

    10. 数据库事务的几种粒度;

    11. 关系型和非关系型数据库区别

    九、设计模式

    1. 单例模式:饱汉、饿汉。以及饿汉中的延迟加载,双重检查

    2. 工厂模式、装饰者模式、观察者模式。

    3. 工厂方法模式的优点(低耦合、高内聚,开放封闭原则)

    十、算法

    1. 使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。(考察高效率,解决产生冲突的问题)

    2. 两个有序数组的合并排序

    3. 一个数组的倒序

    4. 计算一个正整数的正平方根

    5. 说白了就是常见的那些查找、排序算法以及各自的时间复杂度

    6. 二叉树的遍历算法

    7. DFS,BFS算法

    9. 比较重要的数据结构,如链表,队列,栈的基本理解及大致实现。

    10. 排序算法与时空复杂度(快排为什么不稳定,为什么你的项目还在用)

    11. 逆波兰计算器

    12. Hoffman 编码

    13. 查找树与红黑树

    十一、并发与性能调优

    1. 有个每秒钟5k个请求,查询手机号所属地的笔试题(记得不完整,没列出),如何设计算法?请求再多,比如5w,如何设计整个系统?

    2. 高并发情况下,我们系统是如何支撑大量的请求的

    3. 集群如何同步会话状态

    4. 负载均衡的原理

    5 .如果有一个特别大的访问量,到数据库上,怎么做优化(DB设计,DBIO,SQL优化,Java优化)

    6. 如果出现大面积并发,在不增加服务器的基础上,如何解决服务器响应不及时问题“。

    7. 假如你的项目出现性能瓶颈了,你觉得可能会是哪些方面,怎么解决问题。

    8. 如何查找 造成 性能瓶颈出现的位置,是哪个位置照成性能瓶颈。

    9. 你的项目中使用过缓存机制吗?有没用用户非本地缓存

    十二、其他

    1.常用的linux下的命令

    展开全文
  • Java是一门较为复杂的编程语言,想要学的好,就要掌握技巧,以下是为您分享的如何成为Java高级工程师的技巧! 1. 勤看书 Java的学习需要不断的积累,想要系统的学习,找一套完整的视频或者书籍是一个很好的途径,...
  • Java高级工程师常见面试题(一)-Java基础

    千次阅读 多人点赞 2018-06-25 10:41:31
    博主其他相关文章:《Java高级工程师常见面试题-总结》 1. String类为什么是final的。 多线程安全,将字符串对象保存在字符串常量池中共享效率高 2. HashMap的源码,实现原理,底层结构。 HashMap基于哈希表的 ...
  • java高级工程师个人简历模板

    千次阅读 2020-05-26 21:13:45
    java 高级工程师个人简历模板 姓 名: 简历模板 国 籍: 中国 个人照片 目前住地: 所在地 民 族: 族 户 籍 地: 所在户籍 身高体重: XXX cm  XX kg  婚姻状况: 未婚 年 龄: XX 岁 求职...
  • 博主其他相关文章:《Java高级工程师常见面试题-总结》 1. 讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。 基于字节的io操作: 基于字符的io操作: IO常用类 文件流:FileInputStream...
  • Java高级工程师技能要求参考

    千次阅读 2021-06-11 09:37:26
    Java 高级工程师 喜马拉雅: 职位描述 职责描述: 负责面向亿级别的内容和亿级别的用户的运营中台相关研发工作,为不同业务线提供支持,提升资源使用效率与运营效率 ; 善于分析业务需求并给出解决方案; 快速定位...
  • 非常经典java高级工程师高新简历.pdf

    热门讨论 2013-03-05 23:41:29
    ( 非常经典java高级工程师高新简历.pdf )j2ee高级工程师高新个人简历,有了这份简历找工作就变得很简单
  • 面试总结——Java高级工程师(二)

    万次阅读 多人点赞 2016-10-25 23:52:50
    时运不济,才到16年10月份,公司资金紧张,不得已又...一、Java底层基础题 1、SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是DispatcherServlet , 一个请求经过DispatcherServlet...
  • 最近招聘java高级工程师的几点感想

    千次阅读 2019-03-30 20:39:10
    背景 知乎上的如何看待 2019 年 JAVA ...谈几点面试感受,以java高级工程师为例,差不多阿里p5到p6的水平吧。 我们期望的是 java 基础要好,有OO思想 2.分布式要有一定了解,能基本匹配公司技术栈 熟悉线上问...
  • 博主其他相关文章:《Java高级工程师常见面试题-总结》 1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。 cookie 和session 的区别: 1、cookie数据存放在客户的浏览器上,...
  • 一个Java高级工程师的进阶之路

    千次阅读 2017-07-27 20:26:55
    想必Java新手们都想知道如何成为一个Java高级工程师,千锋教育小编整理了一下Java高级工程师必须具备的一些专业技能供大家参考,希望可以帮到大家! 宏观方面 Java要想成为Java(高级)工程师肯定要学习Java。一般...
  • Java高级工程师应该具备的知识点
  • Java高级工程师常见面试题(四)-JVM

    千次阅读 2018-06-25 19:04:09
    博主其他相关文章:《Java高级工程师常见面试题-总结》 1. Java的内存模型以及GC算法 1.JVM内存模型 1.1程序计数器 程序计数器是众多编程语言都共有的一部分,作用是标示下一条需要执行的指令的位置,分支、...
  • 阿里java高级工程师面试100题

    万次阅读 多人点赞 2017-08-10 21:22:25
    1,java堆,分新生代老年代,新生代有Eden,from surviver,to surviver三个空间,堆被所有线程共。eden内存不足时,发生一次minor GC,会把from survivor和eden的对象复制到to survivor,这次的to survivor就变成...
  • 博主其他相关文章:《Java高级工程师常见面试题-总结》 1. Java创建线程之后,直接调用start()方法和run()的区别 调用run会在当前线程中执行方法,调用start会开启一条新线程来执行方法。 2. 常用的线程池模式...
  • 非常经典java高级工程师高新简历(三套_含项目介绍)j2ee高级工程师高新个人简历,有了这份简历找工作就变得很简单
  • Java高级工程师面试题总结及参考答案 一、面试题基础总结 1、 JVM结构原理、GC工作机制详解 答:具体参照: JVM结构、GC工作机制详解 ,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾...
  • 面试题总结——JAVA高级工程师 近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们 一、无笔试题 ...
  • Java高级工程师必备技术栈

    千次阅读 多人点赞 2021-03-06 23:24:22
    1 Java基础知识 包括异常处理、反射、注解、序列化等。 2 Java集合 数据集合框架以及继承关系。 3 JVM原理 包括JVM的架构、内存管理、垃圾回收、字节码、类加载机制等。 学会这本神书 《深入理解Java虚拟机》 你就...
  • Java高级工程师面试题目汇集

    千次阅读 2015-01-18 01:45:20
    Java高级工程师面试题目汇集(关于Struts,Spring,Hibernate三大框架的面试)  1.Hibernate工作原理及为什么要用? 工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session...
  • 想成为Java高级工程师,有哪些要求呢? 1.Core Java,就是Java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如...
  • 面试题总结——JAVA高级工程师 近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们 一、无笔试题 不知道是不是...
  • java 高级工程师要求

    万次阅读 2018-02-26 14:25:46
    从事java后端开发4年及以上,具有根据业务需求进行独立设计的能力 熟练使用Spring及SpringMVC开发 熟练使用常用持久层框架Mybatis\Hibernate 熟悉java多线程及并发线程池使用 熟练使用Mysql基本操作,有一定sql...
  • 面试题总结——JAVA高级工程师近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们一、无笔试题不知道是不是职位原因还是没...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,819
精华内容 34,727
关键字:

java高级工程师

java 订阅