常见面试题

1、String、StringBuffer、StringBulider
在java中提供了这三个类来操作字符串,字符串就是多个字符的数组String是内容不可变的字符串,String底层使用了一个不可变的字符数组。而StringBuilder、StringBuffer是内容可以改变的字符串,底层使用的是一个可变的字符数组。
StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。

2、HashTable和HashMap的区别
hashtable使用synchronized关键字保证了线程安全性,Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null.

3、线程池
Java通过 Executors提供四个静态方法创建四种线程池
newCachedThreadPool() 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool(int)) 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool() 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor() 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
Executors.newWorkStealingPool(int) java8新增,使用目前机器上可用的处理器作为它的并行级别。
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理让更能明确线程池的运行规则,规避资源耗尽的风险.
Executors的弊端如下:

FixedThreadPool和SingleThreadPool
运行的请求队列长度为Integer.MAX_VALUE,可能会堆积大量请求,从而导致OOM。
CachedThreadPool和ScheduledThreadPool
允许创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
| 参数 | 作用|
|-corePoolSize-|-线程池中的常驻线程数-|
| maximumPoolSize| 线程池中能够容纳同时执行的最大线程数,此值必须大于1。 |
|-keepAliveTime-|-多余的空闲线程的存活时间当前线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁只剩下corePoolSize个线程为止。-|
| Unit| keepAliveTime的单位。 |
|-workQueue-|-任务队列,被提交尚未执行的任务。-|
| threadFactory| 表示生成线程池中的工作线程的线程工厂,用于创建线程一般用默认的即可。 |
| handle| 拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize) |

4、线程池的submit方法和execute方法的区别
1.对返回值的处理不同:execute方法没有返回值。submit方法有返回值Future<>。
2.对异常的处理不同:excute方法会抛出异常。sumbit方法不会抛出异常。除非你调用Future.get()。
3. 接受的参数不一样,都可以是Runnable,但submit也可以是Callable

5、设计模式
单例模式:一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。即一个类只有一个对象实例。
工厂模式:根据需要返回我们的对象。是通过专门定义一个类来负责创建其他类的实例,简单工厂模式就是通过一个"全能类",根据外界传递的信息来决定创建哪个具体类的对象。应用比较熟悉的场景就是spring配置文件了。
适配器模式:将一个类的接口转换成客户希望的另外一个接口。通俗地讲,就是在2个类之间做了一个衔接。比如你在调用A类的doSomething方法,实际上内部实现调用了B类的doSomething方法。
代理模式:某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。Java的反射机制,很多地方就用了代理模式来实现。例如spring的AOP。
监听模式:组件(事件源)不处理自己的事件,而是将事件处理托付给外部的处理实体(监听器,这样的事件处理模型称为事件的 授权处理模型。不同的事件,能够交由不同类型的监听器去处理
装饰器模式:简单说就是不改变现有类的结构前提下,扩展它的功能。用别的类来增加原有类的功能。

6、springMVC
Tomcat在启动时加载解析web.xml,找到spring mvc的前端总控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置文件信息。
DispatcherServlet接收到客户端请求,找到HandlerMapping,根据映射规则,获得对应的 HandleExecutionChain对象,然后获得 HandlerAdapter对象。
调用相应处理器中的处理方法,处理该请求后,会返回一个 ModelAndView。
DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的 ViewResolver(视图解析器),根据视图解析器的配置,渲染视图,最后显示给用户。

7、Spring 的两大核心
spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架,主要针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和其他框架组合使用

IOC(Inversion of version) 或 DI (Dependency Injection)
控制反转:它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,
核心原理:它是基于工厂设计模式的Spring IOC的注入

通过属性进行注入,通过构造函数进行注入,
注入对象数组 注入List集合
注入Map集合 注入Properties类型
Spring IOC 自动绑定模式: 可以设置autowire按以下方式进行绑定

按byType只要类型一致会自动寻找,
按byName自动按属性名称进行自动查找匹配.
AOP (Aspect Oriented Programming)
面向切面编程:针对业务处理过程中的切面进行提取,处理过程中的某个步骤或阶段,以降低程序的耦合度。主要用在事务处理,权限控制,日志等方面
核心原理:使用动态代码的方式在执行前后或出现异常时做相应处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值