面试准备01
JavaSE
面向对象的特征
封装:是指把对象的属性进行私有化,同时提供方法供外界调用
继承:是使用已存在的类作为基础建立新的类,新的类继承父类的所有属性和方法,也可以添加新的属性和方法,优点是提高代码重用、提高程序维护性、提高开发效率
多态:在程序运行时才决定引用变量是哪个具体类,实现方式有继承和接口
集合容器
整体关系结构
List, Set, Queue, Map 四者区别
List
:有序的、可重复的。Set
:无序的、不可重复的。Queue
:队列,有序的、可重复的。Map
:使用键值对(key-value)存储,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。
List的实现类
Arraylist
:Object[]
数组,线程不安全Vector
:Object[]
数组,线程安全LinkedList
: 双向链表,线程不安全
Set的实现类
- HashSet:无序的,唯一的,底层使用HashMap保存元素
- LinkedHashSet:是HashSet的子类,通过LinkedHashMap实现
- TreeSet:有序的,唯一的,就是红黑树,不允许null
Queue的实现类
- PriorityQueue:
Object[]
数组实现二叉堆 - ArrayQueue:
Object[]
数组+双指针
Map的实现类
- HashMap:数组+链表+红黑树
- LinkedHashMap:继承自HashMap,增加了双向链表
- HashTable:数组+链表,线程安全,效率低
- TreeMap:红黑树
Thread多线程
进程与线程
进程:是程序的一次执行过程,是系统运行程序的基本单位,进程与进程不共享资源,较耗费资源
线程:是比进程更小的执行单位,多个线程共享进程的堆和方法区,有自己的程序计数器、虚拟机栈和本地方法栈,耗费资源少
线程的创建方式
- 继承Thread类,重写run方法,start方法启动
- 实现Runnable接口,重写run方法,start方法启动
- 实现Callable接口,实现call方法,使用FutureTask类来包装Callable对象,使用FutureTask对象作为Thread对象的target创建并启动新线程,调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
- 通过线程池创建
线程的安全问题
synchronized关键字
synchronized关键字可以保证修饰的方法或代码块儿在任意时刻只能有一个线程执行
可以修饰示例方法、静态方法、代码块
Lock
Lock是实现手动上锁的类,使用步骤:创建锁、加锁、解锁
ThreadLocal
ThreadLocal变量可以存储当前线程的一些数据
线程池
使用线程池的优点
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性
创建线程池的方式
- 通过构造方法实现,ThreadPoolExecutor
- 通过工具类Ececutors的静态方法
JDBC连接池
Druid连接池、c3p0等
IO流
整体结构
常用API类
LocalDate、LocalDateTime、Date、String、StringBuffer(线程安全效率低)、StringBuilder(线程不安全效率高)、Object、Math、File、Enum、Pattern、Collections、
异常
异常分类
常见运行时异常
空指针异常、数组下边越界异常、类型转换异常、参数异常、算术异常、类找不到异常、方法找不到异常、连接异常
http状态码
分为五类
1xx(消息)、2xx(成功)、3xx(重定向)、4xx(请求错误)、5xx(服务器错误)
常见
200:正常
304:重定向
401:协议格式出错
403:没有权限
404:未找到资源
500:服务器程序错误
503:服务器繁忙
常用设计模式
单例模式
保证一个类只有一个实例
Spring中bean的默认作用域是单例的
工厂模式
将目的将创建对象的具体过程屏蔽隔离起来
简单工厂 : 根据传入原料,加工不同的产品
工厂方法: 不同的产品需要创建不同的具体工厂
抽象工厂: 不同的产品创建不同的工厂的同时,工厂可以生产某个产品需要的组件。
spring中创建bean对象的工厂
代理模式
隐藏对已有功能访问,客户端通过代理对象的访问,完成对于已有功能的访问
静态代理:需要创建抽象接口、目标类、代理类,目标类和代理类实现同一个接口
动态代理:在内存中产生虚拟的代理类和代理类的实例
jdk的动态代理:产生虚拟的目标类接口的实现类,从而产生代理对象
cglib的动态代理:产生目标类虚拟的子类,从而产生代理对象
spring的aop和springMVC的拦截器通过动态代理实现
装饰模式
类似于代理模式,都是实现对原有功能的扩展增强
java的io流使用了装饰模式
适配器模式
将已有的数据转化为用户希望的格式
springMVC中处理器的适配器,就是将Controller中方法的返回值统一转换为ModelAndView
JavaEE
jsp的内置对象
request:请求对象,存储客户端向服务端发送的请求信息
response:响应对象
session:会话对象
application:全局对象
page:当前jsp页面对象
pageContext:页面容器对象
out:负责向客户端输入内容
config;配置对象
请求转发、请求包含、重定向
请求转发是把请求从一个servlet转发到另一个servlet,由另一个servlet处理请求并返回,forward
请求包含是一个servlet使用了另一个servlet,请求和另一个servlet不产生直接关系,include
重定向是指servlet返回给浏览器一个新的目标地址,让浏览器访问新的地址,redirect
servlet中文乱码
手动指定相应格式与字符集
response.setHeader("Content-Type", "text/html;charset=utf-8");
servlet的生命周期
init:初始化,servlet对象创建时执行,最初执行且只执行一次
service:处理请求,客户端发送几次请求就会被调用几次
destroy:销毁,servlet对象销毁前调用,最后执行且只执行一次
cookie与session
cookie是存储在浏览器的数据,浏览器发起请求时会带着cookie
session是存储在服务器内存的,主要是为了同一浏览器多次访问时共享数据
第一次访问时创建,超时自动销毁,也可以手动销毁
过滤器
javaWeb三大组件之一(servlet、filter、listener)
在请求到来后servlet接收前执行
可以实现登录访问限制、编码处理等功能
监听器
监听器属于观察者模式
实现
创建监听器:实现接口,重写方法
注册监听器:贾昂监听器与事件源绑定
执行监听器:自动执行
八大监听器
事件源是三大域:ServletContext、HttpSession、ServletRequest
三大域各有生命监听器和属性监听器,还有两个session感知监听器
ajax
Ajax 的核心是 XMLHttpRequest 对象,并使用该对象的open和send方法发送请求,默认是异步的
jquery中使用load方法加载数据,常用 . g e t 和 .get和 .get和.post
ajax常用来发送异步请求,实现页面的局部刷新
跨域解决方法:
- 相应头信息中加入Access-Control-Allow-Origin,注解@CrossOrigin
- 利用script可以跨域的特点,常使用ajax跨域,数据类型为jsonp
反射
Class clz = Class.forName("java.lang.String"); //获取类
Apple apple = (Apple)clz.newInstance(); //实例化
Constructor constructor = clz.getConstructor(); //实例化2
Apple apple = (Apple)constructor.newInstance();
Field[] fields = clz.getFields(); //获取方法
Field[] fields = clz.getDeclaredFields(); //获取属性
name.setAccessible(true); //取消范围修饰符检查
xml解析
导包使用
mysql事务隔离
acid,原子、一致、隔离、持久
读未提交、读已提交、可重复读(默认)、可串行化
jdbc
JAVA语言用于访问数据库的api
使用步骤:载入驱动、定义连接、建立连接、创建statement对象、执行查询或更新、结果处理、关闭连接
事务:手动setAutoCommit设置为false开启事务,commit提交