一、数据库
1.数据库的第三范式是什么?
1NF:数据库表中,设计每一列都不可以再分。
2NF:在满足1NF的前提下,每一行都可以被唯一确定。(不存在两行完全相同)
3NF:在满足2NF的前提下,不存在其它表中的非主键数据。(去掉传递依赖)
实际开发中,由于追求一些查询的性能,那么尽可能快,于是有些时候宁愿多冗余一个字段,避免多连一张表。 为了性能,降范式处理。之后就要小心数据更新。
2.char和varchar的区别?
char类型是定长,如果数据不够长度,就用空格填充。所以,如果java查询出来,可能是带着空格的。char并没有数据库的过多处理,所以它要更快一些。
varchar类型长度是可变的。Java查询出来,完美适配String数据类型。
3.数据库最左前缀原则
指在数据库中对于一个多列联合索引来讲,where的字段一定是完美从索引列的最左字段开始,毫无跳跃性的依次拥有每一个条件列。
index(age,card_no,name,sal)
如果不是依次写,也可以,因为数据库的执行计划会优化它。
4.数据库的事务隔离?
MySQL数据库事务的隔离级别有哪几种?
1、读未提交(MySQL默认)
2、读已提交(Oracle默认)
3、可重复读
4、串行化
二、JavaSE
1.ForEach 循环不支持新增和删除操作
内部是迭代器。 而迭代器里有个计数,这个数如果和此时的集合对不上,就抛异常。 ConcurrentModificationException
2.垃圾回收机制,怎么判断对象是否可以被回收?
1、引用计数器归零。
2、可达性分析,从GC Roots开始出发,如果某对象在引用链上不可达,就是垃圾。
3.进程和线程有什么不同?
进程是程序运行的基本单位
线程是任务的基本单位
一个进程可以包含多个线程
每一个线程必须属于一个进程
4.线程的run()和start()有什么区别?
手动调用run方法其实没有开启线程,只是一个普通的方法调用而已。
调用start方法后,开启线程进入就绪状态,当抢占到CPU以后,开始运行run方法。
三、JavaWeb
1.浏览器禁用cookie了,session还好使么?为什么?
不好使。
Session是要给cookie里存一个JSESSIONID为key的cookie。
如果cookie禁用了,那么Session也就没有了JSESSIONID,因此也就失效了。
2.如何实现跨域?
1、我们可以使用服务器端,返回的http响应报文中的响应头里,设置 Access-Control-Allow-Origin为*。CORS的设置。
2、利用nodejs的服务器,配置代理。也可以实现跨域。
四、框架
1.SpringMVC中,如何自动装配参数的?
SpringMVC利用读取url后跟参数,以及读取请求体的方式,把请求的参数获取到。
DispatcherServlet利用反射技术,读取Controller里面的方法的参数类型、参数名称。
把之前读取到的http参数,传入给Controller的方法。
2.SpringMVC与Struts2的区别是什么?
SpringMVC是基于Servlet的,它设置一个DispatcherServlet,所有的请求都经过它,然后它在根据请求的路径分配给各式各样的Controller的方法。达到各个功能单独执行各个方法的目的。
Struts2是基于Filter的,它设置一个总的Filter过滤所有的请求。它根据请求的路径,分配给各式各样的类的方法。达到各个功能单独执行各个方法的目的。
五、数据结构与算法
1.栈和队列的区别?
它们都是线性表的逻辑结构。 它们定义的进入和出去的元素的规则不一样。
栈:进入的元素直接到栈底,后续进入的元素,依次压着之前进入的元素。 要想出去一个元素,那么只能从栈顶依次出去。 因此它叫先进后出 或者 后进先出。
队列:买东西排队,先到的元素在队列的头部,后来的元素依次进到队列里排队。 想要出去一个元素,那么只能从队列的头部出去。 因此它叫先进先出。
2.简述数组与链表的的异同?
它们都是线性表中的物理结构。
数组是连续的地址空间,根据数组的下标,直接能地址偏移计算到对应的元素上进行访问,时间复杂度是O(1)。 数组长度是固定的。新增或者删除一个元素费劲,因为它要窜动其它元素。
链表是跳跃的地址空间,根据前一个找下一个,因此它的时间复杂度是O(n)。 链表长度是动态的。随时随地都可以新增或者删除一个元素。
3.ArrayList和LinkedList的区别,TreeMap和HashMap的区别?
先说数组与链表的的异同
TreeMap是一颗红黑树。
HashMap是一个数组,数组中的每一个元素是一个链表。Hashmap链表长度为8时转换成红黑树,同样,后续如果由于删除或者其他原因调整了大小,当红黑树的节点小于或等于 6 个以后,又会恢复为链表形态。
六、加密解密
1.Base64编码是什么?哪里用到过?
注:Base64编码过程是3个字符一组的进行,如果原文长度不是3的倍数怎么办呢? 例如我们的原文为Ma
,它不够3个,那么只能在编码后的字符串中补=
了。缺一个字符补一个,缺两个补两个即可,所以有时候你会看见base64字符串结尾有1个或者2个=
哪里用到过?
文件上传,
使用Base64 要小心,URLEncode和Base64的冲突。 +变空格。导致Base64转码失败。
除此之外,可以直接当做String处理。 Base64能否使用get方式提交给服务器?
不能,Base64里有+/=特殊符号,不可以放在url路径上,如果非要放,就用URLEncode转码再放。
Base64一共有多少种字符?
65种 A-Z a-z 0-9 +/=
Base64编码数据的承载效率是多少?
75%
传输效率呢?
C=2字节 C= 000010
37.5%
它其实不适合传比较大的文件。
2.摘要算法是什么?SHA1或者MD5有何实际应用场景?
就是MD5或者SHA1这些不可逆的运算。
1、密码的存储。甚至可以加盐()、多次运算。
注:盐 (Salt) 在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为 "加盐"。
2、进行文件指纹验证,来避免文件被篡改。
3.什么是非对称加密?什么是对称加密?
对称加密算法加密和解密使用的密钥的是相同的,也就是只有一个密钥,加密速度快(相对的)
非对称加密算法有两个密钥,也就是加密和解密所使用的密钥是不同的,密钥成对生成,公钥对外发布,但是对大数据的加解密速度比对称算法慢。
MD5 SHA1为什么不叫加密,只叫摘要?
因为它不可逆。 加密一定对应解密。AES DES