1.面向对象的三大特性:封装,继承,多态
封装:把属性隐藏起来;把尽可能多的东西封装起来,对外提供简介的接口
继承:子类继承父类的特征和行为
多态:同一个行为,不同子类的对象具有不同的表达形式
2.重载和重写的区别
重载:同一个类中定义多个同名的方法,但是他们的参数不可以完全相同;是编译时的多态;对返回值没有要求
重写:子类对父类的方法进行重新定义;是运行时的多态;要求与父类返回值类型相同或者为其子类
3.NIO与BIO的区别
BIO:同步阻塞IO,线程在进行IO操作时不允许进行其他操作,以流的形式处理数据,
NIO:非阻塞型IO,允许线程在进行IO操作时进行其他操作,以块的形式处理数据,性能比较好
个人感觉BIO就是用来HTTP请求的,然后NIO就可以用像WS这种请求使用很合适
4.讲讲list,set,map
- list是有序,可以通过索引访问
- arraylist:基于数组,可以动态扩容,增删效率较低,但是查找效率高
- linkedlist:基于双向链表,增删效率高,查找效率低
- set是无序,去重的,我之前写算法的时候习惯用set的contains判断元素是否存在
- hashset:基于哈希表实现,操作效率高,都是常数级
- treeset:基于红黑树实现,是自然排序的,也可以自定义比较器
- map:kv键值对,键唯一,值可以重复
- hashmap:基于哈希表,允许KV都为null,不保证顺序
- hashtable:在hashmap的基础上实现了线程安全,但由于每个方法上都有synchronize关键字,效率比较低
- treemap:基于红黑树,可以对K排序
- concurrenthashmap:转为并发设计的map,比hashtable性能更好;KV都不允许为null,保证并发的安全性与一致性,避免空指针异常
5.对JVM的了解
stackoverflowerror :递归爆了或者爆栈了
outofmemoryerror:堆内存溢出,内存泄露
调优:堆内设置
6.堆和栈的区别
数据结构上:栈是LIFO,堆是树形结构
存储内容上:栈用于存储局部变量,函数返回的地址,调用函数的参数,里面的东西一般生命周期较短;堆用于存储动态数组,对象实例,里面的东西一般生命周期较长
7.线程池
由线程池管理器,工作队列,线程池线程组成
线程池管理器用于管理线程;工作队列用于存储待执行的任务;线程池进程就是实际执行任务的线程
8.autowired和resourse区别
autowired是bytype,resource是byname
autowired不能注入基本数据类型或字符串等非bean对象
9.讲讲IOC和AOP
IOC就是将对象间的依赖关系的控制权由程序内部移交给程序外部,让spring框架负责
AOP主要是通过动态代理对方法进行拦截处理,将一些无关业务逻辑的部分切出来,方便复用
10.mysql索引的底层原理
主要使用B树或者B+树作为索引结构,依赖于存储引擎的实现。默认的是innodb,他支持事务和外键。另一个常用的是myisam,不支持事务和外键
11.UNION和UNION ALL是区别
都是用于合并两个select语句的结果集的操作符
UNION会去重,UNION ALL不会去重
12.SQL优化
不用select *;优化where,利用索引并且尽量不在索引列上用表达式
标签:存储,UNION,面经,多态,索引,001,线程,IO From: https://www.cnblogs.com/kun1790051360/p/18335726