adams速度函数Java⾼级⼯程师⾯试题总结及参考答案
前⾔:不到原⽂出题,作者如有看到,联系我声明。
Java⾼级⼯程师⾯试题总结及参考答案
⼀、⾯试题基础总结
1、 JVM结构原理、GC⼯作机制详解
答:具体参照: ,说到GC,记住两点:1、GC是负责回收所有⽆任何引⽤对象的内存空间。 注意:垃圾回收回收的是⽆任何引⽤的对象占据的内存空间⽽不是对象本⾝,2、GC回收机制的两种算法,a、引⽤计数法 b、可达性分析算法( 这⾥的可达性,⼤家可以看基础2 Java 对象的什么周期),⾄于更详细的GC算法介绍,⼤家可以参考:
2、Java对象的⽣命周期
答:创建阶段 、 应⽤阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:
3、Map或者HashMap的存储原理
答:HashMap是由数组+链表的⼀个结构组成,具体参照:
4、当数据表中A、B字段做了组合索引,那么单独使⽤A或单独使⽤B会有索引效果吗?(使⽤like查询如何有索引效果)
答:看A、B两字段做组合索引的时候,谁在前⾯,谁在后⾯,如果A在前,那么单独使⽤A会有索引效果,单独使⽤B则没有,反之亦然。同理,使⽤like模糊查询时,如果只是使⽤前⾯%,那么有索引效果,如果使⽤双%号匹配,那么则⽆索引效果
5、数据库存储⽇期格式时,如何考虑时区转换问题?
答:使⽤TimeStamp , 原因参照:
6、Java Object类中有哪些⽅法?
答:
7、HTTP协议,GET和POST 的区别
答:
⼆、线程、设计模式、缓存⽅⾯
1、SimpleDataFormat是⾮线程安全的,如何更好的使⽤⽽避免风险呢西班牙历史战绩
答:
2、如何看待设计模式,并简单说说你对观察者模式的理解
python websocket框架答:1、 2、
3、集环境中,session如何实现共享
答:
1、
2、,还有⼀种⽅案就是使⽤⼀个固定的服务器专门保持session,其他服务器共享
4、分布式、集环境中,缓存如何刷新,如何保持同步?
答:
A、缓存如何刷新? 1、定时刷新 2、主动刷新覆盖 ,每个缓存框架都有⾃带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有⾃带的过期机制,另外主动刷新覆盖时,只需获取对应的key进⾏数据的覆盖即可
B、缓存如何保持同步? 这个redis有⾃带的集同步机制,即复制功能,具体参考: ,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:
easyui datagrid 某行不让选5、⼀条sql执⾏过长的时间,你如何优化,从哪些⽅⾯?
答:
1、查看sql是否涉及多表的联表或者⼦查询,如果有,看是否能进⾏业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进⾏分表查询,单表查询之后的结果进⾏字段整合mysql查询面试题及答案
3、如果以上两种都不能操作,⾮要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量⼤的表进⾏历史表分离(如交易流⽔表)
5、数据库主从分离,读写分离,降低读写针对同⼀表同时的压⼒,⾄于主从同步,mysql有⾃带的binlog实现 主从同步
6、explain分析sql语句,查看执⾏计划,分析索引是否⽤上,分析扫描⾏数等等
7、查看mysql执⾏⽇志,看看是否有其他⽅⾯的问题
个⼈理解:从根本上来说,查询慢是占⽤mysql内存⽐较多,那么可以从这⽅⾯去酌⼿考虑
三、三⼤框架⽅⾯问题
1、Spring 事务的隔离性,并说说每个隔离性的区别
解答:
2、Spring事务的传播⾏为,并说说每个传播⾏为的区别
解答:
3、hibernate跟Mybatis/ ibatis 的区别,为什么选择?
解答:
4、Struts跟Spring mvc的优缺点,让你选会如何选
解答:
5、简单说说Spring 事务机制
解答:
6、Spring 4.0新特性
解答:
四、负载均衡、集相关
1、weblogic 负载均衡的原理和集的配置
解答:
2、Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享
解答:
3、nginx配置⽂件详解——f
解答:
五、项⽬优化相关
1、web如何项⽬优化
解答:这个我整理过⼀次,
2、单例模式有⼏种? 如何优化?
解答:
3、简单说说线程池的原理和实现
解答:
六、并发和安全⽅⾯
1、项⽬并发如何处理?(我们是web项⽬)
解答:,另外,还有数据库乐观锁,数据库读写分离、使⽤消息队列、多⽤存储过程等等数据库工程师考试报名
2、简单说说功能权限存在的⽔平权限漏洞和垂直权限漏洞的场景和解决办法(因为我们⽬前权限级别就是功能权限)
解答:
A、⽔平权限漏洞,如下图
假设机构有 ⽤户A和⽤户B 两个⽤户,其中A有1、2和3权限 , ⽤户B有 2 和3 的权限,这时候假设⽤户B 知道1,并给⾃⼰添加1的权限,这时候就是⽔平权限漏洞。
⽬前解决办法:1、限制⼊⼝,让⽤户B⽆法编辑⾃⼰的权限 2、对⽤户B⽆法进⾏向上扩展。最根本的解决办法是深⼊到数据权限
解答:
B、垂直权限漏洞
解答:
3、平台上的图⽚如何防盗链
解答:
4、如何区分上传的图⽚是不是⽊马?
解答:1、看上传的图⽚后缀 2、如何后缀是篡改的,那么每个⽂件有个魔术数字
5、消息队列的原理和实现
解答:
七、数据库⽅⾯
1、mysql查询字段区不区分⼤⼩写?
解答:不区分,哪怕值也不区分(我当时还反问了,区不区分⼤⼩的应⽤含义有哪些,⾯试官没说得出来)
2、简单说说数据库集和负载均衡、分布式(我不懂这块)
解答: ,
3、存储过程的结构和优点
解答:
4、触发器的原理和作⽤
解答:
⼋、Java底层基础题
1、SpringMVC的原理以及返回数据如何渲染到jsp/html上?
答:Spring MVC的核⼼就是 DispatcherServlet , ⼀个请求经过 DispatcherServlet ,转发给HandlerMapping ,然后经反射,对应Controller及其⾥⾯⽅法的@RequestMapping地址,最后经ModelAndView和ViewResoler返回给对应视图 。 具体可参考:
2、⼀个类对象属性发⽣改变时,如何让调⽤者知道?
答: ,即在set⽅法改变属性时,触发 ,这种模式也可以理解为观察者模式,具体查看:
3、重写equals为何要重写hashCode?
答:判断两个对象是否相等,⽐较的就是其hashCode, 如果你重载了equals,⽐如说是基于对象的内容实现的,⽽保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,⽽hashCode却不⼀样。 hashcode不⼀样,就⽆法认定两个对象相等了
4、谈谈你对JVM的理解?
答: Java语⾔的⼀个⾮常重要的特点就是与平台的⽆关性。⽽使⽤Java虚拟机是实现这⼀特点的关键。Java编译器只要⾯向JVM,⽣成JVM能理解的代码或字节码⽂件。Java源⽂件经编译成字节码程序,通过JVM将每⼀条指令翻译成不同平台机器码,通过特定平台运⾏。
JVM执⾏程序的过程 :I.加载。class⽂件 ,II.管理并分配内存 ,III.执⾏垃圾收集
JRE(java运⾏时环境)由JVM构造的java程序的运⾏环境
具体详情:
5、Mysql的事物隔离级别?
答:Mysql的事物隔离级别 其实跟 Spring的事物隔离级别⼀样,都是1、Read Uncommitted(读取未提交内容), 2、Read Committed(读取提交内容),3、Repeatable Read(可重读),4、Serializable(可串⾏化) 具体参照:
6、Spring的原理
答:Spring的核⼼是IOC和AOP ,IOC是依赖注⼊和控制反转, 其注⼊⽅式可分为set注⼊、构造器注⼊、接⼝注⼊等等。IOC就是⼀个容器,负责实例化、定位、配置应⽤程序中的对象及建⽴这些对象间的依赖。简单理解就是:JAVA每个业务逻辑处理⾄少需要两个或者以上的对象协作进⾏⼯作,但是每个对象在使⽤它的合作对象的时候,都需要频繁的new 对象来实现,你就会发现,对象间的耦合度⾼了。⽽IOC的思想是:Spring容器来管理这些,对象只需要处理本⾝业务关系就好了。⾄于什么是控制反转,就是获得依赖对象的⽅式反转了。
AOP呢,⾯向切⾯编程,最直接的体现就是Spring事物管理。⾄于Spring事物的相关资料,就不细说了,参考:
7、谈谈你对NIO的理解
答:IO是⾯向流,NIO是⾯向缓冲 ,这⾥不细讲了,具体参照:
8、ArrayList和LinkedList、Vector的区别?
答:总得来说可以理解为:.
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList⽐较占优势,因为ArrayList要移动数据
Vector和ArrayList类似,但属于强同步类,即线程安全的,具体⽐较参照:
9、随便说说⼏个单例模式,并选择⼀种线程安全的
答:单例的类别:懒汉、饿汉、枚举、静态内部类、双重校验锁 等等 , 选择线程安全我选最后⼀种,双重校验锁。 具体实现⽅式参照:
10、谈谈红⿊树
答:算法和数据结构⼀直是我薄弱之处,这⽅⾯说⾃⼰补吧,成效不⼤,这⾥我就推荐⼀个:
11、举例说说⼏个排序,并说明其排序原理
答:这⾥我就不细说了,⼤家⾃⼰看看
12、Mysql索引的原理
答:索引的作⽤⼤家都知道,就是加快查询速度,但是原理,我说不上来,这⾥直接看吧:
13、序列化的原理和作⽤
答:Serialization(序列化)是⼀种将对象以⼀连串的字节描述的过程;反序列化deserialization是⼀种将这些字节重建成⼀个对象的过程,主要⽤于HTTP或者WebService接⼝传输过程中对象参数的传播,具体可参看:
九、并发及项⽬调优
1、说说线程安全的⼏种实现⽅式?
答:什么是线程安全? 我的理解是这样的,⼀个对象被多个线程同时访问,还能保持其内部属性的顺序性及同步性,则认定为线程安全。实现线程安全的三种⽅式:被volatile、synchronized等关键字修饰,或者使⽤urrent下⾯的类库。 ⾄于前两者的关系,参考:
2、⽅法内部,如何实现更好的异步?
答:我们知道异步其实就是让另⼀个线程去跑,那么如何创建线程? 第⼀种直接new Thread ,第⼆种new ⼀个实现Runnable接⼝的实现类。 第三种,通过线程池来管理创建等 ,这⾥说到更好的实现异步,那就是说我们在⽅法内部避免频繁的new 线程,就可以考虑线程池了。 那么线程池如何创建? 这⾥可以new ⼀个线程池,但是需要考虑单例,或者在程序初始启东时,就创建⼀个线程池,让他跑着,然后在具体⽅法的时候,通过线程池来创建线程,实现异步
3、项⽬中为何要⽤缓存?如何理解nginx + tomcat + redis 集缓存?
答1:最直接的表现就是减轻数据库的压⼒。避免因为数据读取频繁或过⼤⽽影响数据库性能,降低程序宕机的可能性
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论