少说废话,直接干货!
面试总结
Java基础
- Hashtable和HashMap的区别。
- 抽象类与接口的区别。
- final关键字的使用和区别。
- 异常分类和处理机制。
- JDK版本区别。
- StringBuilder内部实现机制。
- 反射机制的使用。
- 匿名内部类的使用。
- 泛型的概念和使用。
- 弱引用和虚引用的概念和使用方式。
开源框架
- SpringMVC和Struts2的区别
- Spring IOC和AOP的概念以及实现方式
- Spring事务的管理
- Hibernate与MyBatis的比较
- Hibernate延迟加载的机制
JVM虚拟机
- GC算法有哪些
- 垃圾回收器有哪些
- 如何调优JVM
- 缓存和NoSQL
- 缓存的使用场景
- 缓存命中率的计算
- Memcache与Redis的比较
- 如何实现Redis的分片
- MongoDB的特点
分布式
- zookeeper的用途
- dubbo的用途以及优点
- dubbo的实现原理
- 数据结构和算法
- 单向链表的逆序排列
- 双向链表的操作
- 1亿个整数的倒序输出
- 找出给定字符串中最长回文(回文:abcdcba,两端对称)
网络编程
- Get和Post的区别
- Https协议的实现
- 长连接的管理
- Socket的基本方法
数据库
- inner join和left join的区别
- 复杂SQL语句
- 数据库优化方式
- 数据库拆分方式
- 如何保证不同数据结构的数据一致性
安全
- 什么是XSS攻击,具体如何实现?
- 开放问题:如何保障系统安全?
设计模式
- 写出一个设计模式的类图
- 设计模式的意义是什么
- 写个单例模式的代码
多线程
- 如何避免Quartz重复启动任务
- 线程池满了如何处理额外的请求
- 同一个对象的连个同步方法能否被两个线程同时调用
自己避坑多年总结工作经验梳理,带着大家全面科学地建立自己的技术体系和技术认知!看完求一个收藏
接下来揭晓答案
部分答案
Java基础
HashMap和Hashtable的区别
- HashMap是非线程安全的,Hashtable是线程安全的。
- HashMap的键值都可以为null,Hashtable的键值都不可以为null值。
- HashMap继承自AbstractMap类,Hashtable继承自Dictionary类。
- ps : Properties类继承自Hashtable类。
异常分类和处理机制
分类:
- 运行时异常(Runtime Exception)
- 受检查异常(Checked Exception)
- 运行时异常:
- 必须继承RuntimeException类,
- 定义方法时不必声明会抛出运行时异常。
- 调用方法时不必捕获运行时异常。
受检查异常:
- 不继承自RumtimeException类
- 定义方法时需要抛出可能会抛出的Checked Exception
- 调用方法时需要捕获Checked Exception或者继续向上抛出。
逻辑上:
- 运行时异常:一般不需要或者不知道如何处理此类异常;
- 受检验异常:一般需要知道如何处理可能发生的异常情况。
StringBuilder内部实现机制
- StringBuilder内部有一个字符数组,代码如下
- char[] value; //字符数组int count; //字符串长度
- 每一次append操作都是将新的字符串加入到可变长的字符数组中,长度计算方式与ArrayList类似。调用toString()方法时,new一个String对象即可。
- public String toString() { return new String(value, 0, count);// Create a copy, don't share the array}
- ps: StringBuffer是线程安全的,StringBuilder是非线程安全的。
匿名内部类的使用
- 匿名内部类是没有名字的类,只在某一处被使用,不会被多处调用,一般是某个父类或接口的特定实现。
- 强引用、软引用、弱引用和虚引用
- 强引用: 一般的引用都是强引用,即使OutOfMemory也不会回收这部分被把持的引用内存。
- 软引用(SoftReference): 如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被使用。++软引用可以用来实现内存敏感的高速缓存。++
- 弱引用(WeakReference):弱引用的对象拥有更短暂的生命周期。当垃圾回收期发现只有若引用的对象,不论内存空间足够与否,都会回收它。
- 虚引用():虚引用不会决定对象的生命周期,如果一个对象仅持有一个虚引用,那么它随时可能被回收。++虚引用主要用来跟踪对象被垃圾回收器回收的活动。++
开源框架
- SpringMVC和Struts2的区别
- SpringMVC的方法级别的拦截,Struts2是类级别的拦截;
- SpringMVC是基于Servlet实现Controller,Struts2是基于Filter实现;
- SpringMVC性能和安全性高于Struts2;
- SpringMVC更加组件化和流程化,易于扩展,比如返回JSON通过设置@ResponseBody即可;
- Struts2更加无耦合,比较纯粹,但是需要更多的自行开发的代码以支持更多功能。
Spring事务的管理
- 分类:声明式事务、编程式事务
- 声明式事务:通过统一配置实现事务的统一管理,一般配置TransactionMananger以及相关属性即可。
- 编程式事务(注解方式):在需要事务的方法上配置相关的注解(包括事务类型、回滚策略等)
事务类型:
- PROPAGATION_REQUIRED
- PROPAGATION_SUPPORTS
- PROPAGATION_MANDATORY
- PROPAGATION_REQUIRES_NEW
- PROPAGATION_NOT_SUPPORTED
- PROPAGATION_NEVER
- PROPAGATION_NESTED
事务隔离级别
- ISOLATION_DEFAULT
- ISOLATION_READ_UNCOMMITTED
- ISOLATION_READ_COMMITTED
- ISOLATION_REPEATABLE_READ
- ISOLATION_SERIALIZABLE
Hibernate与MyBatis的比较
- Hibernate完全实现对象关系映射(ORM),MyBatis实现的是SQL Mapping
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。比Hibernate容易掌握,Hibernate门槛较高。
- Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
- Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
- Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
JVM虚拟机
GC算法有哪些
- 引用计数
- 复制
- 标记-清除
- 标记-压缩
- 分代(新生代、老年代、永久代)
垃圾回收器有哪些
- 串行回收器:新生代串行回收器、老年代串行回收器
- 并行回收器:新生代ParNew回收器、新生代ParallelGC回收器、老年代ParallelGC回收器
- CMS回收器:(Concurrent Mark Sweep、并发标记清除)
- G1回收器(1.7以后代替CMS回收器)
如何调优JVM
标准参数:
- -client -server模式
- -Xmn、-Xms、-Xmx
- 监控:jps、jstat、jinfo、jmap、jhat、jstack…
Java 中堆和栈有什么区别?
- JVM 中堆和栈属于不同的内存区域,使用目的也不同。
- 栈常用于保存方法帧和局部变量,而对象总是在堆上分配。
- 栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。
缓存和NoSQL
- 缓存命中率的计算
- 命中缓存次数/(命中缓存次数+未命中缓存次数) = 命中率
Memcache与Redis的区别
- memcache把数据存在内存之中,断电后会挂掉;Redis部分数据持久化在硬盘上,断电不会丢失。
- memcache存的是key-value对,redis支持更多的数据结构和数据类型
- memcache可以使用一致性hash做分布式,redis可以做主从同步
- redis单线程,只使用1个cpu
如何实现Redis的分片
- 使用一致性哈希对数据进行映射
- 实现方式:客户端分片(每个客户端对应一个分片)、代理协助分片、查询路由分片;
- 使用redis集群,如codis(豌豆荚,依赖zookeeper);
分布式
zookeeper的用途
- zookeeper作为分布式应用协调系统,已经用到很多分布式项目中。
- 可以用来完成统一命名服务、状态同步服务、集群管理、分布式应用配置项等管理工作。
zookeeper的主要操作分一下几种:
- 创建节点
- 读取节点数据
- 更新节点数据
- 删除节点
- 监控节点变化
应用场景:
- 统一命名服务,使用create自动创建节点编号;
- 配置管理,多个节点的共享配置,当配置发生变化时,可利用zookeeper让使用这些配置的节点获得通知,进行重新加载等操作。如dubbo服务。
- 集群管理:集群选举主节点,资源定位。
- 共享锁
- 负载均衡
应用项目:
- dubbo服务集群、redis集群、Hadoop集群等
- dubbo的用途以及优点
- Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
数据结构和算法
- 将单项链表逆序排列
- 将单向链表逆序输出,方法有三种:
- 遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法)
- 使用栈来逆序输出
- 直接将链表(指针)逆序然后输出
限于篇幅的原因,很多答案不能全部分享出来,大家可以加下我Q群:809389099,可以在群管理那里获取资料,有什么疑问可以联系我,过段时间更新一下简历的排摆布局!有需要的伙伴可以关注我!