1、Java面向对象
- 面向对象的三大基本特征:
- 封装
- 继承
- 多态
- 面向对象的编程思想就是把事物看作一个整体,从事物的特征(属性)和行为(方法)两个方面进行描述。
- 面向对象的过程就是找对象、建立对象、使用对象、维护对象的关系的过程
2、面向过程
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。
3、线程的安全
线程安全就是保证多个线程同时对某一对象或资源进行操作时不会出错.比如我们购物,下订单前某商品库存数为2,两个用户同时对该商品进行下单购买,系统会记录商品库存总数,如果不加以并发控制,那么就会出现某个用户对当前库存总数的脏读的情况.
线程安全问题出现的3个必要条件:
- 多线程环境
- 多线程共享同一资源
- 对资源进行非原子性操作
保证线程安全的常用方法:
- Synchronized:保证方法内部或代码块内部资源或数据的互斥访问(哪里需要Synchronized加哪里).达到某资源在同一时间最多只能有一个线程访问的效果.
- java.util.concurrent.atomic:提供一列类,包括:AtomicBoolean,AtomicInteger,AtomicLong类,使用这些类来声明变量或资源时可以保证对其操作时具有原子性,以此达到线程安全的效果.
4、cookie与session的区别
- Cookie可以存储在浏览器或者本地,Session只能存在服务器
- session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
- Session比Cookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
- Session占用服务器性能,Session过多,增加服务器压力
- 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。
5、Vue的生命周期
Vue生命周期是指vue实例对象从创建之初到销毁的过程,vue所有功能的实现都是围绕其生命周期进行的,在生命周期的不同阶段调用对应的钩子函数可以实现组件数据管理和DOM渲染两大重要功能。
6、MVC与MVVM的区别
-
MVVM
通过双向数据绑定,View 和 Model 之间的同步工作完全是自动的,因此开发过程中不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
- 低耦合
- 可重用性
- 双向数据绑定,它实现了View和Model的自动同步
-
MVC
Controller负责将Model的数据用View显示出来。
- 耦合度低(运用MVC的应用程序的三个部件是相互独立的,改变其中一个不会影响其他两个);
- 重用性高(多个视图可以使用同一个模型)
- 生命周期成本低
- 部署快(业务分工明确)
- 可维护性高
-
MVVM和MVC都是一种设计思想。MVVM与MVC最大的区别就是:它实现了View和Model的自动同步(当Model属性改变时,不用手动操作Dom元素去改变View的显示。而是改变属性后,该属性对应View的显示会自动改变)。
7、说一下事务
事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。
8、mysql的索引
- 普通索引(INDEX):最基本的索引,没有任何限制
- 唯一索引(UNIQUE):与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
- 主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。
- 全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间。
- 联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
9、索引的缺点
1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
10、mysql的优化
- SQL语句及索引的优化
- SQL语句优化
- 尽量避免使用子查询
- 用IN来替换OR
- 读取适当的记录LIMIT M,N,而不要读多余的记录
- 禁止不必要的Order By排序
- 总和查询可以禁止排重用union all
- 避免随机取记录
- 将多次插入换成批量Insert插入
- 只返回必要的列,用具体的字段列表代替 select * 语句
- 区分in和exists
- 优化Group By语句
- 尽量使用数字型字段
- 优化Join语句
- 索引优化
- 最佳左前缀法则
- 不在索引列上做任何操作
- 存储引擎不能使用索引中范围条件右边的列
- 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致))
- mysql在使用负向查询条件(!=、<>、not in、not exists、not like)的时候无法使用索引会导致全表扫描
- is null, is not null 也无法使用索引,在实际中尽量不要使用null(避免在 where 子句中对字段进行 null 值判断)
- like 以通配符开头(
%abc..
)时,mysql索引失效会变成全表扫描的操作 - 少用or,在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效
- 在组合/联合索引中,将有区分度的索引放在前面
- 使用前缀索引
- SQL 性能优化 explain 中的 type:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。
- SQL语句优化
- 数据库表结构的优化
- 系统配置的优化
- 硬件的优化