常见的Java面试题

  1. 泛型用来解决很么问题?
    泛型一般用来解决代码复用的问题。
  2. 什么情况会发生Java堆内存溢出?(java.lang.OutOfMemoryError : Java heap space)
    只要不断的创建对象,且GC Roots到对象之间有可达的路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量限制后会出现内存溢出异常。
  3. 什么情况会发生Java栈内存溢出?
    如果线程请求的栈深度大于虚拟机所允许的最大深度,将会抛出StackOverflowError;如果虚拟机在扩展栈时无法申请到足够的内存空间则会抛出OutOfMemoryError。
  4. 什么是Netty?
    Netty项目是为了快速开发可维护的高性能高可扩展性协议服务器和客户端而努力提供异步事件驱动的网络应用程序框架和工具。换句话说,Netty是一个NIO客户端服务器框架,可以快速轻松地开发诸如协议服务器和客户端之类的网络应用程序。它大大简化了网络编程流程,如TCP和UDP套接字服务器开发。
  5. 请列举struts2中常用的标签库及作用,编写自定义标签的关键步骤。
    控制标签if..else  逻辑循环控制
    调式标签debug 查看当前环境下value stack和stack context中保存的数据
    资源包含标签include  用于包含外部heml或jsp
    date标签 用于格式化日期并输出

    自定义标签关键步骤:在web-INF下新建一个.tld文件
                                            新建java类继承TagSupport类
                                            页面使用
  6. SQL语句的规范
    慎用in和not in,否则导致全表查询。用exists和not exists;
    union all会比union效率高;
    适当使用表的别名和列的别名;
    使用>=代替>,因为≥会直接定位,而>会先定位再去除;
    用where子句代替having子句,避免使用having子句,having只会在检索出所有记录之后才对结果集进行过滤;
    尽量避免在where子句中进行null值判断、使用!=及<>操作符、使用or来连接条件,否则会导致引擎放弃使用索引而进行全表查询;
    使用like语句时,单侧%可以使用索引,避免两侧都有;
    使用group by子句时,尽量在group by前面将数据过滤掉。
    使用视图: (数据量非常大的情况下)  经常被查询的列数据,并且这些数据不被经常的修改,删除。 
  7. java中拦截器和过滤器的区别,并列举各自几种应用场景
         1. 拦截器是基于java的 反射机制 的,而过滤器是基于 函数 回调
         2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
         3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
         4. 拦截器可以访问action 上下文 、值栈里的对象,而过滤器不能访问。
         5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器 初始化 时被调用一次
    面向切面的开发中日志、权限等一些通用的行为,需要用拦截器
    过滤器可以在传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符
  8. 代码走查
    参数检验、代码中杜绝幻数(幻数定义为枚举)、空指针检验(不确定返回集合是否为空,需要进行非空判断)、下标越界(方法传入的数组下标作为参数,要在一开始做下标越界的校验,避免下标越界)、重复代码校验(重复代码要使用重构工具提取重构)、命名规范、注意循环、避免重复造轮子(如果已经有成熟的类库实现了类似功能,要优先使用成熟类库的方法)、多线程环境(注意数据的原子性与可见性等线程安全问题)
    命名规则、注释是否清晰、方法调用是否进行非空判断、关键代码是否做了捕获异常处理、是否使用了日志记录、sql语句优化

猜你喜欢

转载自blog.csdn.net/xiha_zhu/article/details/80213122