(JAVA初级开发)冷门,偏门面试题小结

常用的关系型数据库有哪些?

当前主流的关系型数据库有Oracle、DB2(对大型分布式应用系统尤为适用)、Microsoft SQL Server、Microsoft Access、MySQL等

drop,truncate和delete

delete 支持事务,逐行删除
truncate 不支持事务,是一次性删除数据,执行速度快
drop drop语句将表所占用的空间全释放掉,速度最快

union,union all,except

查询表与表的交集用 union
查询表与表的并集用 union all
查询表与表的差集用 except

数据库中select执行顺序

from>on>join>where>group by>having>select>distinct>union>order by>limit

什么是视图?有什么用?

视图是一个虚拟的表,其内容由查询定义.
作用:
1.简化用户操作(简单性)
可以为常用的sql创建一个视图,这样我们原先需要连多个表,现在只需要操作一个表即可!
2.增加安全性
可以给不同的用户定义不同的视图,这样做屏蔽了底层的表结构,从而更好的保护了数据库安全性!
3.逻辑数据独立性
视图可帮助用户屏蔽真实表结构变化带来的影响,对重构的数据库提供了一定程度的逻辑独立性!

数据库三大范式和五大约束

第一范式(1NF):数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。(e.g:家庭住址(省,市,区))
第二范式(2NF):满足1NF后要求表中的所有列,每一行的数据只能与其中一列相关,即一行数据只做一件事。
只要数据列中出现数据重复, 就要把表拆分开来。
第三范式(3NF):满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)。
要求:能举出具体的例子来表明你真的理解三大范式的规则!!!
五大约束:
1.主键约束(Primay Key Coustraint) 唯一性,非空性;
2.唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个;
3.默认约束 (Default Counstraint) 该数据的默认值;
4.外键约束 (Foreign Key Counstraint) 需要建立两表间的关系;
5.非空约束(Not Null Counstraint):设置非空约束,该字段不能为空。

synchronized 与 lock 的区别

获取Lock对象的方法:Lock lock = new ReentrantLock();
首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
1.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
2.synchronized会自动释放锁,Lock需在finally中手工释放锁(lock.unlock()方法释放锁),否则容易造成线程死锁;
3.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而4.Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
7.Lock锁可以设置等待时间,到了时间自动放弃获取锁

JAVA锁机制(了解即可!)

1、公平锁/非公平锁:
公平锁是指多个线程按照申请锁的顺序来获取锁。
非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,
会造成优先级反转或者饥饿现象。
2、可重入锁:
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。(防止死锁)
3、独享锁/共享锁:
独享锁是指该锁一次只能被一个线程所持有。
共享锁是指该锁可被多个线程所持有。
4、互斥锁/读写锁:
上面讲的独享锁/共享锁就是一种广义的说法,互斥锁/读写锁就是具体的实现。
5、乐观锁/悲观锁:
乐观锁与悲观锁不是指具体的什么类型的锁,而是指看待并发同步的角度。
悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,
悲观锁采取加锁的形式。悲观的认为,不加锁的并发操作一定会出问题。
乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。
乐观的认为,不加锁的并发操作是没有事情的。
从上面的描述我们可以看出,悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。
悲观锁在Java中的使用,就是利用各种锁。
乐观锁在Java中的使用,是无锁编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。
重量级锁是悲观锁的一种,自旋锁、轻量级锁与偏向锁属于乐观锁.
6、分段锁:
7、偏向锁/轻量级锁/重量级锁
8、自旋锁(java.util.concurrent包下的几乎都是利用锁):
自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的
切换阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。

索引的类型及优缺点

1.普通索引:仅加速查询
2.唯一索引:加速查询 + 列值唯一(可以有null)
3.主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
4.组合索引:多列值组成一个索引,专门用于组合索引,其效率大于索引合并
5.全文索引:对文本的内容进行分词,进行搜索
优点:
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,
如果要建立聚簇索引, 那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

数据库索引

数据库索引是数据库管理系统中的一个排序的数据结构,以协助快速查询,更新数据库表中数据,索引的实现通常使用B树(B-tree)以及其变种B+tree(一些高效率的算法)

–使用索引时有些不生效的情况
1、使用like关键字模糊查询时,% 放在前面索引不起作用,只有“%”不在第一个位置,索引才会生效(like ‘%文’–索引不起作用)
2、使用联合索引时,只有查询条件中使用了这些字段中的第一个字段,索引才会生效
3、使用OR关键字的查询,查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会生效,否则索引不生效。
4、尽量避免在where子句中使用!=或<>操作符,否则全表扫描。
5、对查询进行优化,应尽量避免全表扫描,首先应考虑在where以及order by涉及的列上建立索引。
6、应尽量避免在 where 子句中对字段进行表达式操作,否则全表扫描。
7、尽量避免在where子句中对字段进行函数操作,否则全表扫描。
8、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
9、并不是所有的索引对查询都有效,sql是根据表中的数据来进行查询优化的,当索引列有大量数据重复时,sql查询不会去利用索引
10、索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,
  因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,
11、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
  这是因为引擎在处理查询和连接时会 逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
12、mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。
   因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。
13、order by 索引 ,不起作用的问题(除了主键索引之外):
  1、 如果select 只查询索引字段,order by 索引字段会用到索引,要不然就是全表排列;
   2、如果有where 条件,比如where vtype=1 order by vtype asc . 这样order by 也会用到索引!

常见编码集

ISO-8859-1 西欧字符
GBK 国标编码
UNICODE 万国码 统一码
UTF-8

软件设计的开闭原则OCP

开放功能扩展,关闭源码修改。
开闭原则的英文全称是Open Close Principle,缩写是OCP,它是Java世界里最基础的设计原则,
它指导我们如何建立一个稳定的、灵活的系统。
开闭原则的定义是:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是对于修改是封闭的
开闭原则,是一种设计模式,随着面向对象程序设计的思想,应运而生。
开:指的是可以在源代码的基础上进行扩展,比如继承,接口,抽象类等。在JAVA中,之所以用继承,是在可以直接调用类库的前提下,对其功能进行扩展。不需要应用者去了解封装类的内部逻辑就可以做开发。
闭:指不允许对原有的代码进行修改。以免影响其他现有功能,造成功能瘫痪。

SQL优化

1、查询语句中不要使用 *
2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代
3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
4、or 的查询尽量用 union或者union all 代替
(在确认没有重复数据或者不用剔除重复数据时,union all会更好)
5、合理的增加冗余的字段(减少表的联接查询)
6、增加中间表进行优化(这个主要是在统计报表的场景,
后台开定时任务将数据先统计好,尽量不要在查询的时候去统计)
7、建表的时候能使用数字类型的字段就使用数字类型(type,status…),数字类型的字段作为条件查询比字符串的快
8、那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最末尾

分布式环境如何保证session一致性

1.ngnix的iphash可以
2.使用spring-session框架来解决,底层采用重写httpclient保证数据共享
3.使用token令牌代替session功能,把数据存放在redis中,每次从redis中获取数据

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值