1、简述异常的分类及常见异常
1、Error 严重的错误,程序不必处理,比如内存溢出
2、exception:异常,说明程序发生了不正常的情况,JVM停止了运行
编译时异常: 程序员必须处理,否则编译不能通过
运行时异常:可以不用处理,一般由于操作不当造成
常见的异常:
NullPointerException 空指针异常
ClassNotFoundException 指定类不存在
NumberFormatException 字符串转换为数字异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 数据类型转换异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法不存在异常
2、 File类常用的方法有哪些
getAbsolutePath() 返回此File的绝对路径名字符串
getPath() 返回此File表示的路径字符串
getName() 返回由此File表示的文件或目录的名称
exists() 表示此文件或目录是否实际存在
isFile()判断哪是否是文件
isDirectory():此File表示的是否为目录)
delete():删除由此File表示的文件或目录
mkdirs():创建多级目录
mkdir():创建单级目录
listFiles() 遍历目录
Length() 文件的长度
3、Vector、ArrayList、LinkedList的区别?
ArrayList:底层实现是数组,内存连续,查询快,增删慢,线程不安全,效率高,初始默认长度为10,当空间全部使用之后进行扩容,每次为1.5倍
Vector:底层实现是数组,查询快,增删慢,线程安全,效率低,扩容机制为翻倍;
LinkedList:底层实现是双向链表,内存不连续,增删快,查询慢,线程不安全,效率高;
4、HashMap底层原理
Jdk1.8以前:底层是通过数组+链表实现的,创建hashmap之前会创建一个数组,使用put存放数据时,根据key的hash值,确定其在数组的位置,如果该位置为空将value值放入,如果不为空则生成一个链表,把value值放在链表的头部。使用get方法取值时,会先根据key的hash值,确定其在数组中位置,再遍历链表根据equals方法取出链表中value值。当数组的容量超过当前容量的0.75倍之后,就会自动扩容为原来容量的2倍。
Jdk1.8以后:底层是通过数组+链表+ 红黑树实现的,在之前链表的长度不固定,获取数据速度慢,加入红黑树后,链表长度大于8个之后,会将链表转换为红黑树,极大的降低了时间复杂度,HashMap 线程不安全,有多个线程同时 HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以使用 ConcurrentHashMap
5、String有哪些特性?数组有没有 length()方法?String 有没有 length()方法?
不变性:String 使用final修饰,是只读字符串。对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。
常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
数组没有 length()方法 ,有length的属性用来获取长度。String 有 length()方法,用获取字符串中有多少个字符组成。
6、请介绍下Java集合体系
Java中的集合主要分Map接口和Collection接口
一、Collection是单列集合,它的子接口包括:
List 接口:存取有序、元素可以重复、有索引值,可以使用增强for、迭代器、普通for遍历
1.1 List接口常用实现类有:ArrayList、LinkedList、Vector;
2、Set 接口:存取无序、元素唯一,可以使用增强for、迭代器遍历
2.1 Set接口常用实现类有:HashSet、TreeSet、LinkedHashSet;
二、Map接口定义了存储键值对元素的集合,键唯一、值可以重复,一个键对应一个值
子类有HashMap和HashTable
HashMap:允许null作为键和值,线程不安全,效率高
HashTable:不允许null作为键和值,线程安全,效率低
7、介绍一下JVM
JVM主要包括:类加载器、执行引擎、本地接口、运行时数据区
类加载器:加载类文件到内存,必须符合类文件结构。
执行引擎:负责解释命令
本地接口:本地接口的作用是融合不同的语言为java所用。
JVM的运行时数据区分为五个区域:堆、栈、本地方法栈、方法区、计数器。
栈:每个方法执行的时候都会创建一个栈,用于存放 局部变量表、动态链接。
本地方法栈:是执行本地方法。
堆:堆就是存放对象实例,几乎所有的对象实例都在这里分配内存
方法区:用于存储Java虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等数据。
8、类的加载过程
类的加载分为五个阶段:加载-》检查-》准备-》解析-》初始化
加载:根据查找路径找到相应的 class 文件然后导入;
检查:检查加载的 class 文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:将常量池中的符号引用替换成直接引用。
符号引用就理解为一个标示,而直接引用是直接指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。
9、怎么判断对象是否可以被回收
引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当 计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;
可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。
10、Java创建对象有几种方式?
java中提供了以下四种创建对象的方式:
1. new创建新对象
2. 通过反射机制
3. 采用clone机制
4. 通过序列化机制
11、线程的生命周期?
新建
可运行
锁阻塞
计时等待
无限等待
被终止
12、线程创建方式?
继承Thread类,重写run方法,通过start方法启动新线程, start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法
实现Runnable接口,重写run方法, 如果自己的类已经继承另一个类,就无法再继承 Thread,此时,可以实现一个Runnable 接口
13、线程都有哪些方法
Wait:方法就是线程等待,调用该方法线程进入等待状态,只有调用notify/notifyAll方法将其唤醒继续执行,会释放锁和cpu资源
Sleep:线程休眠,调用后当前线程休眠,线程处于阻塞状态,时间到了继续执行,不会释放锁和cpu资源
Yield:线程让步,释放cpu资源后,其他线程抢夺cpu资源
Join:线程插队,让当前线程先执行,其他线程等待
Interrupt:中断当前线程
Notify:唤醒一个线程
notifyAll:唤醒所有线程
14、@Resource注解和@Autowired注解有什么区别?
两个注解都是为类中的属性赋值
@Autowired注解可以自动为类中的属性赋值值,既可以通过类型注入也可以通过名称注入
@Resource(name="XXX")这个注解有个属性name,name的值必须写UserDao里@Component的值;因为Resource是通过引用的方式注入的,引用的就是UserDao里@Component表示的对象
15、注解的概念?
通过指定的符号和关键字在类,方法,属性上完成特定功能
16、aop增强方式?
前置增强
后置增强
异常增强
最终增强
环绕增强
17、Springmvc 的运行原理?
客户端请求提交到DispatcherServlet(前端控制器)
由DispatcherServlet控制器查询一个或多个HandlerMapping(处理器映射器),找到处理请求的Controller
DispatcherServlet将请求提交到Controller(也称为Handler)
Controller调用业务逻辑处理后,返回ModelAndView(模型视图数据)
DispatcherServlet查询一个或多个ViewResoler(视图解析器),找到ModelAndView指定的视图
视图负责将结果显示到客户端
18、Springmvc 的三大组建及作用?
处理器映射器 解析xml或者注解等 返回请求的处理器(handler)
处理器适配器 执行处理器(handler) 返回ModelAndView
视图解析器 解析视图返回 view
19、Spring MVC的主要组件和作用?
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析 根据视图逻辑名解析成真正的视图(view)
20、列举出 springmvc 的常用注解,至少 3 个及其作用?
@controller 主要负责处理前端控制器(DispatcherServlet )发过来的请求
@RequestMapping 是一个用来处理请求地址映射的注解
@RequestParam 是从 Request 里获取参数值
@Service 用于标注业务层
@Autowired,自动装配
@Resource 通过 name 属性去匹配 bean
@ResponseBody ,会直接返回 json 或者 xml 数据。
@RequestBody 接收json或xml数据
21、如何解决get和post乱码问题?
解决post请求乱码:我们可以在web.xml里边配置一个CharacterEncodingFilter 过滤器。设置为utf-8。
解决get请求乱码有两种方法个:
1)修改tomcat配置文件添加编码和工程编码一致;
2) 另一种方法对请求参数进行重新编码;
22、springMVC是线程安全的吗?
springMVC是线程安全的,因为springmvc是基于方法拦截处理请求,参数的变量全
部是局部变量,并且spring中的bean也是单例模式,所以一般情况下不会产生安全问题。
23、SpringMVC和Struts的区别?
- springmvc框架是基于过滤器,通过servlet分发请求,而struts框架是通过拦截器实现的
- springmvc框架是通过方法实现,是单例 但是struts框架是多例的用成员变量接收参数
24、单例模式有什么特点?
(1)单例类确保自己只有一个实例。
(2)单例类必须自己创建自己的实例。
(3)单例类必须为其他对象提供唯一的实例
25、简述事务四大特性
原子性:事务中的操作要么全部成功要么全部失败
隔离性:并发访问数据库时不能互相干扰
一致性:事务前后数据的完整性保持一致
持久性:事务一旦提交,数据永久发生改变
26、spring的设计模式?
1)工厂模式,BeanFactory用来创建对象的实例。
2) 代理模式,在Aop实现中用到了JDK的动态代理。
3) 单例模式,这个比如在创建bean的时候。
4) 模板方法,用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。