java面试题

sprinfbean的生命周期?

  • Bean的定义

  • Bean的注册

  • Bean的创建

  • Bean的注入

  • Bean的初始化

  • Bean的销毁

数据库的三大范式

1.第一范式1NF:列不可再分

1.每一列属性都是不可再分的属性值,确保每一列的原子性

2.两列的属性相近或2.第二范式(2NF)属性完全依赖于主键
 

2.第二范式(2NF)属性完全依赖于主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键

3.第三范式(3NF)属性不依赖于其它非主属性    属性直接依赖于主键

数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c  属性之间含有这样的关系,是不符合第三范式的。

一条 select 语句的执行过程如上图所示

1、建立连接

连接器会校验你输入的用户名和密码是否正确,如果错误会返回提示,如果正确,连接器会查询当前用户对于的权限。连接器的作用就是校验用户权限

2、查询缓存

MySQL 中有个缓存的概念,当你在执行一条 SQL 查询语句时,MySQL 会先去缓存中查看是否有对应的记录,如果有,则直接返回,如果没有,则取数据库中查询,查询完成后再放入缓存中。这个查询缓存的目的是为了加快 MySQL 查询速度。

这里建议你将这个缓存的选项关闭上,因为在实际项目中,这个查询缓存用处不大,为什么这么说。因为当有 update、或者 delete 语句执行时,这张的表查询缓存就会失效,下次查询还是需要从数据库中查询,所以通常来说查询缓存并不能提高性能。

3、分析器

分析器作用是进行词法分析,语法分析。对于 select 语句而言,MySQL 拿到这条 SQL 语句后,识别出 select 关键词,知道这是一条查询语句,然后再取识别 from 以及表名,识别字段,这个步骤是词法分析。词法分析完成后还需要进行语法分析,也就是判断这条语句的语法是否正确,比如你 select 写成了 selct,那么语法分析就会检验出来

4、优化器

优化器职责是对 sql 语句进行优化,比如这条语句该用什么索引,sql 顺序需不需要调整。

5、执行器

经过上面几部分析,就来到了执行器,开始从数据库查询数据了。查询数据前会校验一下有无权限该表的权限,如果没有则返回错误提示。有权限则开始扫描行,查看是否满足条件,满足条件的结果放入结果集中。
 

基本类型和包装类型的区别

区别:
1.基本类型存储在栈里,包装类型存储在堆里。因为栈的效率更高。
2.包装类是对象,拥有方法和字段,对象的调用是引用对象的地址。
3.基本类型是值传递,包装类是引用传递(即地址值的传递)。
4.向ArrayList,LinkedList中放数据的时候,只能放Object类型的,基本类型放不进去。
5.包装类是不能被继承的,因为被final修饰

有了基本类型为什么还要有包装类?
为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得Java具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作,方便涉及到对象的操作。

基本类型的存在意义和包装类存在的意义
----基本类型存储在栈里,因为栈的效率高,所以保留了基本类型。
----变量的值存储在栈中,方法执行时创建,结束时销毁,因此更加高效。

int Integer
long Long
float Float
double Double
short Short
byte Byte
char ----Character
boolean Boolean

何为线程死锁

线程死锁描述的是这么一种情况:多个线程同时被阻塞,它们中的一个或多个都在等待某个资源被释放,但这个资源又被相互占用着,导致线程被无限期的阻塞,出现程序不能正常的运行的情况而使程序不能正常终止。

产生死锁的四个条件
互斥条件: 该资源任意一个时刻只由一个线程占用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件: 若干进程间形成首尾相接循环等待资源的关系
注意
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件有一个不满足,就不会发生死锁。

如何避免线程死锁
上面讲到只要破坏四个必要条件的其中一个就可以避免线程死锁的发生
破坏互斥条件 : 这个必要条件我们无法破坏,因为我们用锁本身就是想让各个线程之间互斥,保证线程安全。
破坏不剥夺条件 : 在占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它自身所占用的资源。
破坏请求与保持条件 : 一次性申请所有的资源。
破坏循环等待条件 : 采用资源有序分配的基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值