从Java基础到数据结构和算法。这套面试题绝对合你胃口

少说废话,直接干货!

面试总结

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,可以在群管理那里获取资料,有什么疑问可以联系我,过段时间更新一下简历的排摆布局!有需要的伙伴可以关注我!

猜你喜欢

转载自blog.csdn.net/Java__world/article/details/89743646