查看原文
其他

Java中级面试题及答案解析(8)

2018-03-26 阿木侠 Java知音


点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

知音专栏

 

Javaweb练手项目源码下载

常用设计模式完整系列篇

100套IT类简历模板下载

Java常见面试题汇总篇


数据库的三大范式


1 、第一范式(1NF)


在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 


所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。


在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式要求数据表中的每一列(每个字段)必须是不可拆分的最小单元。


2、 第二范式(2NF)


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


第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系。


3 、第三范式(3NF) 


满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式(3NF)要求一个数据库表中不包含其它表中已包含的非主关键字信息。简而言之,第三范式要求表中的每一列只与主键直接相关而不是间接相关,表中的每一列只能依赖于主键。




TCP和UDP的区别及其适用场景


首先说一下什么是TCP和UDP:

TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。

UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。


TCP和UDP的区别:

  • TCP面向连接的运输层协议,UDP无连接

  • TCP是可靠交付,UDP是尽最大努力交付

  • TCP面向字节流,UDP面向报文

  • TCP是点对点连接的,UDP一对一,一对多,多对多都可以

  • TCP适合用于网页,邮件等,UDP适合用于视频,语音广播等


TCP和UDP的适用场景:

整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 


当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,比如视频、广播等,这时就可以使用UDP。 




说一下Spring的核心模块


  • Spring Core【核心容器】:核心容器提供了Spring的基本功能。核心容器的核心功能是用IOC容器来管理类的依赖关系。


  • Spring AOP【面向切面】:Spring的AOP模块提供了面向切面编程的支持。SpringAOP采用的是纯Java实现,采用基于代理的AOP实现方案,AOP代理由IOC容器负责生成、管理,依赖关系也一并由IOC容器管理。


  • Spring ORM【对象实体映射】:提供了与多个第三方持久层框架的良好整合。


  • Spring DAO【持久层模块】: Spring进一步简化DAO开发步骤,能以一致的方式使用数据库访问技术,用统一的方式调用事务管理,避免具体的实现侵入业务逻辑层的代码中。


  • Spring Context【应用上下文】:它是一个配置文件,为Spring提供上下文信息,提供了框架式的对象访问方法。


  • Spring Web【Web模块】:提供了基础的针对Web开发的集成特性。


  • Spring MVC【MVC模块】:提供了Web应用的MVC实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型。




(转发)forward与(重定向)redirect的区别


  • forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。

  • redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的URL。


  • forward转发页面和转发到的页面可以共享request里面的数据。  

  • redirect不能共享数据。 

 

  • redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。     

  • forward只能在同一个Web应用程序内的资源之间转发请求。


  • forward是服务器内部的一种操作。       

  • redirect是服务器通知客户端,让客户端重新发起请求。


  • forward一般用于用户登陆的时候根据角色转发到相应的模块。   

  • redirect一般用于用户注销登陆时返回主页面和跳转到其它的网站等。

  • forward效率高。     

  • redirect效率低。




redis常用的五种数据类型


1.String(字符串)

String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。它是Redis最基本的数据类型,一个redis中字符串value最多可以是512M。


2.Hash(哈希)

Redis hash 是一个键值对集合,对应Value内部实际就是一个HashMap,Hash特别适合用于存储对象。


3.List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

底层实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。


4.Set(集合)

Redis的Set是String类型的无序集合,它的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。


5.zset(有序集合)

Redis zset 和 set 一样也是String类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,用来排序。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存