自‘愚’自乐

java面试总结问题

自‘愚’自乐 notes
String,StringBuffer,StringBuilder的区别
  1. 都是通过字符数组来实现的
  2. String是不可变类,而StringBuffer, StringBuilder是可变类
  3. 从执行速度上来讲。总体上是String < StringBuffer < StringBuilder。在某些特殊情况下String 比StringBuffer快,比如:String a= “abc”+“edf”; 比如StringBuffer sb = new StringBuffer(“abc”).append(“edf”);如果要拼接的字符串来自于不同的String对象的话,StringBuffer要优于String。StringBuffer比StringBuilder慢在于StringBuffer的操作是加锁的。
  4. 从线程安全角度来说StringBuffer是线程安全的,而StringBuilder是非线程安全的。
过滤器(Filter)与拦截器(Interceptor),String Aop的区别

都是AOP编程思想的体现,在实现权限检查、日志记录等多种场景下应用。
执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。 1. 实现方式不同:拦截器是基于java的反射机制的,而过滤器是基于函数回调 2. 使用范围不同:过滤器依赖与servlet容器,而拦截器可以不依赖与servlet容器 3. 使用的资源不同:拦截器可以使用spring管理所以组件,用注入的方式注入就能用Filter不行。 4. 作用范围不同:Interceptor拦截器只对DispatcherServlet配置的action请求有作用,Spring AOP拦截器只能拦截Spring管理的Bean(像业务层Service),过滤器几乎对所有请求都有效。

springMVC从接受请求到完成响应的过程

SpringMVC大致流程 1. 用户发起请求到前端控制器。 2. 前端控制器通过处理器映射器查找hander。 3. 处理器映射器返回执行链。 a)hander对象 b)拦截器(集合) 4. 前端控制器通处理器适配器包装,执行hander对象。思考:为什么要通过适配器来执行? 5. 通过模型hander处理业务逻辑。 6. 处理业务完成后,返回ModeAndView对象,其中有视图名称,模型数据。 7. 将视图名称和模型数据返回到前端控制器。 8. 前端控制器通过视图解释器查找视图对象。 9. 视图解释器返回真正的视图。 10. 前端控制器通过返回的视图和数据进行渲染。 11. 返回渲染完成的视图。 12. 将最终的视图返回给用户,产生响应。

多线程
  1. 多线程里能否向主线程抛出异常?
    线程代码不能抛出任何checked异常。所有的线程中的checked异常都只能被线程本身消化掉。:)
  2. 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
    可以用join方法实现。
  3. 在java中wait和sleep方法的不同? 最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。
  4. 线程池
    Java里面线程池的顶级接口是 Executor,不过真正的线程池接口是 ExecutorService。Executors工厂方法提供了几种常用线程池的创建方法。
    1. Executors.newFixedThreadPool (int nThreads):固定大小线程池。
    2. Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)
    3. Executors.newSingleThreadExecutor()(单个线程池)
JDK 1.8 引入的5个新特性
  1. Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:
    • Lambda 表达式,允许像对象一样传递匿名函数
    • Stream API,充分利用现代多核 CPU,可以写出很简洁的代码
    • Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用
    • 扩展方法,现在,接口中可以有静态、默认方法。
    • 重复注解,现在你可以将相同的注解在同一类型上使用多次。
  2. Java8 部分细节修改
    HashMap 使用散列表和红黑树实现。之前只使用了散列表。

sql优化相关
  1. 两个表如果数据量相差不大用in或者exists效果差不多,如果右边表较小用in,反之用exists。永远不要用not in
  2. 避免使用NULL,一旦这个字段中存在null则不能走索引。应该尽量采用给默认值的方式。
  3. 仅可能使用更小的字段,合理设置字段长度。
  4. 不强制需要事物,对查询性能要求较高使用MyISAM表,反之如果要求数据准确需要事物支持用InnoDB
  5. 尽可能将子查询转换为连接查询
  6. 避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。可以使用union all代替
  7. 连续的数据用between不用用in
  8. 避免在where子句中对字段进行函数操作
  9. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
  10. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
自‘愚’自乐
纯粹开心的私人境地