- 封装,继承,多态基本数据类型重载和重写的区别
重载:同一个类中,方法名,参数相同
参数类型,个数,顺序不同
返回值和修饰符可以不同
发生在编译时
重写:发生在父子类中
方法名,参数列表相同
返回子范围,抛出异常的范围小于等于父类
修饰符范围大于等于父类== 和equals
== : 基本类型比较值
引用类型比较地址值
equals:默认比较地址值
被重写时比较内容String,StringBuffer,StringBuilder接口和抽象类的区别?
1)实现:extends ,implements
2)构造函数:抽象类可以有,接口没有
3)抽象类可以有main方法,接口不能
4)接口可多实现,抽象类只能单继承
5)修饰符:接口默认public ,抽象类是任意访问修饰符string 常用的方法
length()
getBytes()
substring()
equals()
split()
charAt()
toLowerCase()
toUpperCase()单例模式?
某个实例在多线程环境下只会被创建一次反射 ?
1)动态获取任意一个类和对象的所有的属性和方法
2)获取Class对象
调用某个对象的 getClass()方法
Person p=new Person();
Class clazz=p.getClass();
调用某个类的 class 属性来获取该类对应的 Class 对象
Class clazz=Person.class;
使用 Class 类中的 forName()静态方法(最安全/性能最好)
Class clazz=Class.forName(“类的全路径”); (最常用)jdk 1.8 新特性
1)Lambda表达式
允许把函数作为一个方法参数
2)接口允许定义默认方法和静态方法
3)函数式接口
有且仅有一个抽象方法的接口叫做函数式接口
可被隐式转换为Lanbda表达式
通常函数式接口上会添加@FunctionalInterface 注解。异常
Error: 无法预期的错误,无法采取恢复操作
Exception: 可恢复的,可捕捉的
1)运行时异常:空指针,下标越界,算数异常,类型转换,传递非法参数 2)编译异常 IO,SQL
- 同步锁,死锁,乐观锁,悲观锁
1)同步锁:同一时间只允许一个线程访问共享数据
2)死锁:多线程时同时被阻塞,他们中的一个或全部全都在等待某个资源释放
3)乐观锁:可同时访问共享数据,在数据提交更新时,才会检测数据是否冲突
- List,Map,Set
1)List 有序,值允许重复
2)Set 无序,不重复,但位置固定
set是根据hashcode来进行数据存储的,这个位置不可控制
3)Map : 散列存储,无序List 有序,可重复
ArrayList:底层数据结构是数组,数据量大非头尾操作时查询快,增删慢
linkedList: 底层数据结构是双向链表,查询慢,增删快Set
HashSet:底层是哈希表
linkedHashSet:底层是链表和哈希表。(插入有序,唯一)
链表保证有序,哈希表保证元素唯一
TreeSet:底层是红黑树(唯一,有序)HashSet如何保证元素的唯一性?
hashCode() 和 equals()TreeSet 如何保证元素排序,元素唯一?
1)自然排序,比较器排序
2)根据比较返回值是否是0来决定元素唯一Map
HashMap:无序
HashTable:线程安全
linkedHashMap:有序,是HashMap的一个子类,保存了记录插入的顺序
TreeMap:能够把它保存的记录根据键排序,默认键值的升序排序
- HashMap的底层原理?
1.8后 数据+链表+红黑树 ,提高了查找效率
默认数组大小为16,负载因子0.75,扩容阈值为12,按2倍大小扩容
当链表中元素超过 8 个后,会将链表转换为红黑树,红黑树节点 <= 6时退化为链表Hash冲突
不同对象算出来的数组下标相同HashMap ,HashTable,ConcurrentHashMap区别
1.
- 线程与进程
线程:
进程:创建线程的方式?
- 继承Thread类,重写 run 方法
实现简单,不可继承其他类实现Runnable 接口 重写run 方法
避免单继承,解耦实现Callable接口 重写 call 方法
可获取线程执行结果的返回值,并可抛出异常使用线程池创建 java.util.concurrent.Executor 接口
//
Thread thread=new Thread();
thread.satart();
- Runnable 接口 run 方法无返回值 ,Callable接口call方法有返回值,支持泛型Runnable接口run方法只能抛出运行时异常,无法捕获处理
Callable 允许抛出异常且可获取异常信息
- 调用start()调用start() 方法可启动线程使得线程进入就绪状态,
run方法只是thread的一个普通方法。在主线程中执行
新建
就绪
运行
阻塞
等待wait
超时
同步阻塞
死亡线程池
管理线程
可重复利用已有的线程继续执行任务
没有创建和销毁是的消耗,提升系统响应速度
- TCP 与 UDP
Tcp:可靠的,基于IP的传输协议Get 和 Post
Get 不安全,数据放在url 中,post的所有操作对用户都是不可见的
get传送的数据量较小cookie 和 session?
cookie 存放在客户端电脑,是一个磁盘文件
对客户端可见,可通过设置属性达到长期有效
session是存放在服务器内存中的一个对象
不可见,关闭窗口session就会失效jsp 和 servlet
jsp编译后就是servleet
jsp侧重视图,servlet主要用于控制逻辑servlet生命周期
对象创建
用户访问
对象销毁Ajax 和 axios
Ajax 交互式,快速动态网页应用的技术
局部刷新,异步访问
axios:异步请求
get,post,put,deleteaxios 怎么解决跨域问题
通过vue接口代理方式
- 三范式
第一范式:1NF 原子性,列或者字段不能再分,要求属性具有原子性,不可再分解;
第二范式:2NF 唯一性,一张表只说一件事,是对记录的惟一性约束,要求记录有惟
一标识,
第三范式:3NF 直接性,数据不能存在传递关系,即每个属性都跟主键有直接关系,
而不是间接关系事务特性
- 原子性一致性隔离性持久性
- 读未提交读已提交可重复读 :mysql默认级别可串行化
加快查找速度,提高数据库的性能
分类:
普通索引
唯一索引
联合索引
- Mybatis
优秀的持久层框架,半ORM框架在 mybatis 中,${} 和 #{} 的区别是什么?(必会)
#{} 是占位符,预编译处理,可有效防止sql注入
${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set
方法来赋值;
Mybatis 在处理{}时,就是把{}替换成变量的值。在 mybatis 中,resultType 和 ResultMap 的区别是什么?(必会)
- 列名和要封装实体属性完全一致的话用resultType不一致用ResultMap ,要配置和表的对应关系
- if 是为了判断传入的值是否符合某种规则,比如是否不为空.where 标签可以用来做动态拼接查询条件,当和 if 标签配合的时候,不用显示的声明类型 where 1 = 1 这种无用的条件foreach 标签可以把传入的集合对象进行遍历,然后把每一项的内容
作为参数传到 sql 语句中.include 可以把大量的重复代码整理起来,当使用的时候直接 include
即可,减少重复代码的编写;适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作
- 默认一级缓存,sqlsession级别二级,手动在mapper中添加标签,实现Serializable序列化接口 开启
作用域是mapper的同一个namespace
- IOC 和 DI
- 掌握对象的创建权,让对象的创建不用区new 可直接从容器中获取DI是控制反转的具体实现
- 构造器注入setter注入注解注入
将哪些与业务无关但对多个对象产生影响的公共行为和逻辑,抽取封装为一个可重用的模块,
在特定的切点作增强处理,并回调原对象的方法AOP中的代理
- JDK代理CGLIB代理
BeanFactory :spring 顶层接口
ApplicationContext:是BeanFactory 的子接口
在启动时把所有Bean实例化spring中用到哪些设计模式
工厂
单例
代理
模板方法
观察者Spring 事务的实现方式和原理通知类型
- 前置通知:before后置通知:after-returning异常通知:after-throwing最终通知:after环绕通知:
- 默认单例,存在线程安全问题解决:避免在bean中定义可变成员变量
- @Component@Scope@PostConstruct,@PreDestroy:@Value@ComponentScan:组件扫描@Bean@PropertySource@Configuration :标识配置类,Spring启动时会自动扫描并加载所有配置类
SpringMVC 执行流程
- 用户发送请求到前端控制器根据请求调用处理映射器查找对应处理方法contriller执行业务代码后返回ModeleAndView到前端控制器前端控制器通过视图解析器进行视图渲染然后响应到用户
拦截器与过滤器
拦截器是基于java的反射机制的,过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖于servlet容器。
拦截器只能对action请求起作用,过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。



