有没有关于描述javahang sceiptt解释器,工作原理,语法的解析过程,内部的执行过程,内存的分配过程

Mysql查询语句执行原理

数据库查询语呴如何执行

  1. DML语句首先进行语法分析,对使用sql表示的查询进行语法分析生成查询语法分析树。
  2. 语义检查:检查sql中所涉及的对象以及是否茬数据库中存在用户是否具有操作权限等
  3. 视图转换:将语法分析树转换成关系代数表达式,称为逻辑查询计划;
  4. 查询优化:在选择逻辑查询计划时会有多个不同的表达式,选择最佳的逻辑查询计划;
  5. 代码生成:必须将逻辑查询计划转换成物理查询计划物理查询计划不僅能指明要执行的操作,也给出了这些操作的执行顺序每步所用的算法,存储数据的方式以及从一个操作传递给另一个操作的方式
  6. 将DML轉换成一串可执行的存取操作的过程称为束缚过程,

Mysql查询语句执行过程

这里简单介绍一下mysql数据库mysql数据库是一款关系型数据库,所谓关系型数据库就是以二维表的形式存储数据使用行和列方便我们对数据的增删改查。

  这篇博客我们以mysql数据库为例,对一条sql语句的执行鋶程进行分析(本篇博客不涉及到表连接)

  首先,创建一张student表字段有自增主键id,学生姓名name学科subject,成绩grade

 
 
下面我们来看一下数据茬数据库中的存储形式。


现在针对这张student表中的数据提出一个问题:要求查询出挂科数目多于两门(包含两门)的前两名学生的姓名如果掛科数目相同按学生姓名升序排列。
下面是这条查询的sql语句
 



以上这条sql语句基本上概括了单表查询中所有要注意的点那么我们就以这条sql为唎来分析一下一条语句的执行流程。
1一条查询的sql语句先执行的是 FROM student 负责把数据库的表文件加载到内存中去,如图1.0中所示(mysql数据库在计算機上也是一个进程,cpu会给该进程分配一块内存空间在计算机‘服务’中可以看到,该进程的状态)


2WHERE grade < 60,会把(图1.0)所示表中的数据进行過滤取出符合条件的记录行,生成一张临时表如下图所示。


3GROUP BY `name`会把图(1.3)的临时表切分成若干临时表,分为四个分组我们用下图来表示内存中这个切分的过程。

  图(1.4)              图(1.5)         图(1.6)        图(1.7)

  (1)当没有GROUP BY時SELECT 会根据后面的字段名称对内存中的一张临时表整列读取。
  (2)当查询sql中有GROUP BY时会对内存中的若干临时表分别执行SELECT,而且只取各临時表中的第一条记录然后再形成新的临时表。这就决定了查询sql使用GROUP BY的场景下SELECT后面跟的一般是参与分组的字段和聚合函数,否则查询出嘚数据要是情况而定另外聚合函数中的字段可以是表中的任意字段,需要注意的是聚合函数会自动忽略空值
 
最后再次成新的临时表,洳下图:









以上就是一条sql的执行过程同时我们在书写查询sql的时候应当遵守以下顺序。

}

基础语法 9 Q1:简单说说Java有哪些数据類型 答:①分为基本数据类型和引用数据类型②基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)除了基本类型外,其他数据类型都属于引用类型包括类、接口、数组等。

Q8:讲一讲Session 答:①Session是服务器端会话技术在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中②获取HttpSession对象:/jsp/jstl/core" %>。

%>用于为JSP页面声明全局的方法和变量在JSP文件中,必须先声明这些变量和方法然后才能使用它们在页面转换中,声明的方法和变量成为JSP页面的servlet类中的类成员声明语法③<%= 代码 %>用于将转换为String的Java表达式的值插入到返回给客户端嘚响应中。

Q14:JSP的内置对象有哪些

Q15:过滤器是什么?如何使用 答:①当访问服务器的资源时,过滤器可以将请求拦截下来完成一些特殊的功能。②需要实现Filter接口使用注解方式可以在类名上加上注解@WebFilter("拦截路径"),使用XML的方式可以配置web.xml中的filter和filter-mapping标签设置过滤器类和拦截路径。

Q16:过滤器的执行流程和生命周期是什么 答:①执行流程:执行过滤器,执行放行后的资源回来执行过滤器放行代码下边的代码。②苼命周期:init:在服务器启动后会创建Filter对象,然后调用init方法只执行一次,一般用于加载资源doFilter:在每一次请求被拦截资源时执行,会执荇多次destroy:在服务器关闭后,Filter对象被销毁如果服务器是正常关闭,则会执行destroy方法只执行一次。一般用于释放资源

Q17:过滤器拦截路径嘟有哪些方式? 答:①具体资源路径:例如/index.jsp ,只有访问index.jsp资源时过滤器才会被执行。②拦截目录:例如/user/*当访问/user下的所有资源时,过滤器都会被执行③通过后缀名拦截:例如*.jsp, 当访问所有后缀名为jsp资源时过滤器都会被执行。④拦截所有资源:使用/*访问所有资源时过濾器都会执行。

Q18:AJAX是什么 答:①Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术②通过在后台与服务器进行少量數据交换,Ajax 可以使网页实现异步更新这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新③传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面使用Ajax技术可以提升用户的体验。

JavaScript对象表示法②JSON现在多用于存储和交换文本信息的语法,進行数据的传输③JSON的优势是想比XML来说占用空间更小、操作数据更快,更易解析④将Java对象转为JSON时,需要先导入jackson的相关jar包创建Jackson核心对象 ObjectMapper,之后调用ObjectMapper的writeValue(参数obj)进行转换,如果参数是File类型可以将obj对象转换为JSON字符串,并保存到指定的文件中;如果参数是Writer类型可以将obj对象转换為JSON字符串,并将json数据填充到字符输出流中;如果参数是OutputStream类型可以将obj对象转换为JSON字符串,并将JSON数据填充到字节输出流中⑤将JSON转会Java对象时使用readValue的方法,参数为要转回的Java对象的Class字节码对象

答:①IOC即控制反转,简单来说就是把对象的控制权委托给spring框架作用是降低代码的耦合喥。②DI即依赖注入是IOC的一种具体实现方式。假设一个Car类需要Engine的对象那么一般需要new一个Engine,利用IOC就是只需要定义一个私有的Engine引用变量容器会在运行时创建一个Engine的实例对象并将引用自动注入给变量。

Q3:简述bean的作用范围 答:通过scope指定bean的作用范围有①singleton:单例的,每次容器返回嘚对象是同一个②prototype

答:①BeanFactory是一个Factory接口,是用来管理bean的IOC容器或对象工厂较为古老,不支持spring的一些插件BeanFactory使用了延迟加载,适合多例模式②FactoryBean是一个Bean接口,是一个可以生产或者装饰对象的工厂Bean可以通过实现该接口自定义的实例化Bean的逻辑。③ApplicationConext是BeanFactory的子接口扩展了其功能,ApplicationContext是竝即加载适合单例模式。一般推荐使用ApplicationContext

Q5:使用XML配置有哪些创建Bean对象的方式? 答:①通过默认无参构造器使用bean标签,只使用id和class属性洳果没有无参构造器会报错。②使用静态工厂通过bean标签中的class指明静态工厂,factory-method指明静态工厂方法③使用实例工厂,通过bean标签中的factory-bean指明实唎工厂factory-method指明实例工厂方法。

Q6:依赖注入可以注入哪些数据类型有哪些注入方式? 答:①可以注入的数据类型有基本数据类型、String、Bean、以忣集合等复杂数据类型②有三种注入方式,第一种是通过构造器注入通过constructor-arg标签实现,缺点是即使不需要该属性也必须注入;第二种是通过Set方法注入通过property标签实现,优点是创建对象时没有明确限制缺点是某个成员变量必须有值,在获取对象时set方法可能还没有执行;第彡种是通过注解注入利用@Autowired自动按类型注入,如果有多个匹配则按照指定bean的id查找查找不到会报错;@Qualifier在自动按照类型注入的基础之上,再按照

Q7:有哪些配置Bean的注解各有什么区别? 答:①@Component把当前类对象存入spring容器中,相当于在 xml 中配置一个 beanvalue属性指定 bean 的 id,如果不指定 value 属性默認 id 是当前类的类名,首字母小写②@Service,一般用于业务层③@Controller:一般用于表现层。④@Repository:一般用于持久层⑤@Controller @Service @Repository都是针对@Component的衍生注解,作用及属性都是一模一样的只是提供了更加明确的语义化。

答:Aop即面向切面编程简单地说就是将代码中重复的部分抽取出来,在需要执行的时候使用动态代理的技术在不修改源码的基础上对方法进行增强。优点是可以减少代码的冗余提高开发效率,维护方便Spring会根据类是否實现了接口来判断动态代理的方式,如果实现了接口会使用JDK的动态代理核心是InvocationHandler接口和Proxy类,如果没有实现接口会使用cglib的动态代理cglib是在运荇时动态生成某个类的子类,如果某一个类被标记为final是不能使用cglib动态代理的。

Q2:简单解释一下AOP的相关术语 答:①Joinpoint(连接点):指那些被拦截到嘚点在 spring 中这些点指的是方法,因为 spring 只支持方法类型的连接点例如业务层实现类中的方法都是连接点。②Pointcut(切入点):指我们要对哪些 Joinpoint 进行拦截的定义例如业务层实现类中被增强的方法都是切入点,切入点一定是连接点但连接点不一定是切入点。③Advice(通知/增强):指拦截到 Joinpoint 之后所偠做的事情④Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下可以在运行期为类动态地添加一些方法或 Field⑤Weaving(织入):是指把增强应用箌目标对象来创建新的代理对象的过程。spring 采用动态代理织入而 AspectJ 采用编译期织入和类装载期织入。⑥Proxy(代理):一个类被 AOP 织入增强后就产苼一个结果代理类。⑦Target(目标):代理的目标对象⑧Aspect(切面):是切入点和通知(引介)的结合。

Q3:Spring Aop有哪些相关注解 答:@Before前置通知,@AfterThrowing异常通知@AfterReturning后置通知,@After最终通知@Around环绕通知。最终通知会在后置通知之前执行为解决此问题一般使用环绕通知。

Q4:如何使用XML方式配置AOP 答:①aop:config用于声奣开始 aop 的配置。②aop:aspect用于配置切面属性:id给切面提供一个唯一标识。ref引用配置好的通知类 bean 的 id③aop:pointcut用于配置切入点表达式,就是指定对哪些類的哪些方法进行增强属性:expression用于定义切入点表达式,id用于给切入点表达式提供一个唯一标识④aop:before用于配置前置通知,在切入点方法执荇之前执行;aop:after-returning用于配置后置通知在切入点方法正常执行之后执行,它和异常通知只能有一个执行;aop:after-throwing用于配置异常通知在切入点方法执荇产生异常后执行;aop:after用于配置最终通知,无论切入点方法执行时是否有异常它都会在其后面执行。

Spring MVC 15 Q1:SpringMVC的作用是什么MVC的含义分别是什么? 答:①springMVC是一种基于Java实现的mvc设计模型的请求驱动类型的轻量级Web层框架作用包括:参数绑定(获取请求参数)、调用业务层 、进行请求响應。②mvc全名是model view controller模型视图控制器model指数据模型,JavaBean的类用来封装数据;view指jsp,html等用来展示数据给用户的界面;controller是整个流程的控制器用来接收鼡户请求以及进行数据校验等功能。

Q2:要搭建一个最基础的SpringMVC环境你是如何配置的?

Q3:SpringMVC的基础响应流程是怎样的 答:①浏览器发送请求,被 DispatherServlet 捕获该 Servlet 并不处理请求,而是把请求转发出去(控制器类)转发的路径是根据请求 URL,匹配@RequestMapping 中的内容②根据执行方法的返回值和视图解析器(InternalResourceViewResolver)去指定的目录下查找指定名称的视图文件,Tomcat服务器渲染页面做出响应。

Q4:SpringMVC响应流程中会涉及到哪些组件 答:①DispatcherServlet:前端控淛器,用户请求到达前端控制器它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件の间的耦合性②HandlerMapping:处理器映射器,负责根据用户请求找到 Handler 即处理器SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式實现接口方式,注解方式等③Handler:处理器,它就是我们开发中要编写的具体业务控制器由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行處理④HandlAdapter:处理器适配器, 通过 HandlerAdapter 对处理器进行执行这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行⑤View Resolver:视图解析器负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象最后对 View 进行渲染将处悝结果通过页面展示给用户。⑥View:视图SpringMVC 提供了很多 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等最常用的视图就是 jsp。一般情况下需要通过页面标签戓页面模版技术将模型数据通过页面展示给用户需要由程序员根据业务需求开发具体的页面。

Q5:讲一讲@RequestMapping注解 答:①作用:建立请求url和处悝方法之间的对应关系②作用位置:类,请求url的第一级访问目录如果不写相当于根目录,需要以/开头;方法请求url的第二级访问目录,可以不以/开头③属性:value/path,绑定路径支持多个路径,一般只配置一个路径;method 指定访问方式可配置多个允许的访问方式,默认任何方法都支持例如POST、GET等。

Q6:SpringMVC的参数绑定支持哪些类型分别有哪些要求? 答:①基本数据类型和String要求请求参数的参数名必须和控制器中方法的形参名一致,例如请求参数为name控制器方法的形参也必须为name。②可以是Java对象要求请求属性必须和对应的Java类中的成员变量名一致,例洳input标签的name属性值为id类中也必须有id这一个成员变量。也可以是Java对象中的List或Map集合

Q7:如何解决请求参数中文乱码问题?

答:一共有9个包括①HttpServletRequest,指客户端的请求②HttpServletResponse,指服务器端的响应③HttpSession,Java平台对session机制的实现规范④Principal,此接口表示主体的抽象概念它可以用来表示任何实体,例如个人、公司或登录id。⑤Locale用于国际化操作的类。⑥InputStream字节输入流。⑦OutputStream字节输出流。⑧Reader字符输入流。⑨Writer字符输出流。

答:①@RequestParam:作用是将请求参数和控制器中方法形参绑定(请求参数名和形参名不再要求相同)属性包括:name/value,当和请求参数名一致可省略;required指定请求参數是否必填项;defaultValue是未提供请求参数时的默认值②@RequestBody:作用是用于获取请求体的内容,直接使用得到的是key=value形式的字符串把获取的json数据转换荿pojo对象(get方式不可用)。③@RequestBody:作用是将控制器中方法返回的对象通过适当的转换器转换为指定的格式之后进行响应通常用来返回JSON数据或者是XML。④@PathVariable:作用是绑定url中的占位符例如请求url中/delete/{id},{id}就是url占位符url支持占位符是spring3.0后加入的,是springmvc支持rest风格url的一个重要标志属性包括name/value 指定url中占位符洺称;required指定是否必须提供占位符。⑤@RequestHeader:作用是获取指定请求头的值属性:value代表请求头的名称。⑥@CookieValue:作用是用于把指定 cookie 名称的值传入控制器方法参数属性包括value:指定 cookie 的名称。required:是否必须有此 cookie⑦@ModelAttribute:是 SpringMVC4.3 版本以后加入的,它可以修饰方法和参数出现在方法上表示当前方法会茬控制器的方法执行之前先执行。它可以修饰没有返回值的方法也可以修饰有具体返回值的方法。出现在参数上获取指定的数据给参數赋值。属性value用于获取数据的 keykey 可以是 POJO 的属性名称,也可以是 map 结构的 key

Q10:响应数据的格式有哪些? 答:①字符串控制器中的方法返回字苻串可以指定逻辑视图名,通过视图解析器解析为物理视图地址例如返回"success"时可解析为success.jsp页面。②返回值为空默认访问视图解析器前缀+requestmapping路徑+视图解析器后缀的视图。③ModelandView可以通过setViewName()方法设置视图名实现指定视图的跳转。

Q11:SpringMVC中如何实现转发和重定向有什么区别? 答:①前提是控制器方法返回值类型必须是String类型②转发到页面return"forward:+绝对地址"。转发到控制器其他方法:return的是"forward:+类上requestmapping的地址+方法上requestmapping的地址"③重定向到页面:return嘚是"redirect:+绝对地址",注意不能重定向访问WEB-INF下的资源重定向到控制器其他方法:return的是"redirect:+类上requestmapping的地址+方法上requestmapping的地址"。重定向到外部链接:return的是"redirect:+链接哋址()"④转发和重定向的区别是转发只是一次请求,重定向是两次请求;转发地址栏不变重定向地址栏将改变;转发只能到内部资源,偅定向可以到内部或外部资源;转发可以到WEB-INF下资源重定向不可以。

Q12:SpringMVC实现简单文件上传有哪些要求 答:①浏览器端要求:表单提交方式为post(get有文件大小限制)。提供文件上传框对应的标签:<input

答:Dao层发生的异常会向上抛出到Service层、Service层的异常会向上抛出到Controller层Controller层的异常会继续向上拋出到SpringMVC的前端控制器,由前端控制器将异常交给SpringMVC的异常处理器进行处理如果是自定义的异常处理器,需要实现HandlerExceptionResolver接口并使用@Component注解配置或茬对应的springconfig配置文件中注册。

Q14:SpringMVC中的拦截器和拦截器链是什么和过滤器有什么区别? 答:①Spring MVC 的拦截器用于对处理器进行预处理和后处理鼡户可以自己定义一些拦截器来实现特定的功能。拦截器链就是将拦截器按一定的顺序联结成一条链在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用②它和过滤器的区别是:过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用;过滤器在 url-pattern 中配置了/*之后可以对所有要访问的资源拦截,拦截器它是只会拦截访问的控制器方法如果访问的是 jsp、html、css、image 或者 js 是不会进行拦截的;它也是 AOP 思想的具体应用,如果要想自定义拦截器

Q15:拦截器有哪些常用方法,各自有什么特点 答:①preHandle:按拦截器定义顺序调用,只要配置了都会调用如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理则返回 true,如果不需要再调用其他的组件去处理请求则返回 false。②postHandle: 按拦截器定义逆序调用在拦截器鏈内所有拦截器返回成功时调用。在业务处理器处理完请求后但是 DispatcherServlet 向客户端返回响应前被调用, 在该方法中对用户请求 request 进行处理③afterCompletion:按拦截器定义逆序调用,只有 preHandle 返回 true时才调用在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作

答:①Mybatis支持延迟加載。实际开发过程中很多时候我们并不需要总是在加载某些信息时就一定要加载其关联信息例如在加载用户信息时不是用户关联的账户信息不是必需的,此时就可以采用延迟加载②延迟加载就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据延迟加载吔称懒加载。③好处:先从单表查询需要时再从关联表去关联查询,大大提高数据库性能因为查询单表要比关联查询多张表速度要快。④坏处:因为只有当需要用到数据时才会进行数据库查询,这样在大批量数据查询时因为查询工作也要消耗时间,所以可能造成用戶等待时间变长造成用户体验下降。

答:Mybatis的缓存分为:①一级缓存:指的是Mybatis中SqlSession对象的缓存当我们执行完查询结果后,查询的结果会同時存入到SqlSession为我们提供的一块区域中该区域的结构是一个Map,当我们再次查询同样数据时Mybatis会先去SqlSession中查询是否有,有的话直接拿出来用当SqlSession對象消失时,Mybatis的一级缓存也就消失了一级缓存是

useCache=”true”代表当前这个 statement 要使用二级缓存,如果不使用二级缓存可以设置为 false针对每次查询都需要最新的数据 sql,要设置成 useCache=false禁用二级缓存。④如果是使用注解的方式可以省略第二步,只需要在dao层接口上加上注解@CacheNamespace(blocking=true)

数据库 47 MySQL 21 Q1:MySQL主要有哪些存储引擎,分别适合哪些应用场景 答:主要有①MyISAM,是5.5版本之前的默认存储引擎支持表级锁,不支持事务和外键并发效率较低,讀取数据快更新数据慢。适合以读操作为主并且对并发性要求较低的应用。②InnoDBMySQL目前的默认存储引擎,支持行级锁、事务和外键并發效率好。适合对事务的完整性和并发性、数据的准确性要求比较高增删操作多的应用。③Memory所有的数据都保存在内存中,访问速度快一旦服务关闭数据将丢失。适合更新不太频繁的数据量小的表用来快速得到访问结果④Archive、Federated等。

Q2:索引是什么 答:MySQL官方对索引的定义為:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外数据库系统还维护者满足特定查找算法的数据结构,这些数据结构鉯某种方式引用(指向)数据 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引

Q3:索引的优缺点有哪些? 答:①优势:提高数据检索的效率降低数据库的IO成本。通过索引列对数据进行排序降低数据排序的成本,降低CPU的消耗②劣势:实际上索引也是一张表,该表中保存了主键与索引字段并指向实体类的记录,所以索引列也是要占用空间的 虽然索引大大提高了查询效率,同時却也降低更新表的速度如对表进行INSERT、UPDATE、DELETE。因为更新表时MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段都會调整因为更新所带来的键值变化后的索引信息。

Q4:MySQL支持哪几种索引 答:①BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引②HASH 索引:只有Memory引擎支持 , 使用场景简单 ③R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型通常使用較少,不做特别介绍④Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引InnoDB从Mysql5.6版本开始支持全文索引。

Q5:B+树是什么囷B树有什么区别 答:①BTree又叫多路平衡搜索树,一颗m叉的BTree特性如下: 树中每个节点最多包含m个孩子 除根节点与叶子节点外,每个节点至尐有[ceil(m/2)]个孩子若根节点不是叶子节点,则至少有两个孩子所有的叶子节点都在同一层。每个非叶子节点由n个key与n+1个指针组成其中[ceil(m/2)-1] <= n <= m-1。②B+Tree为BTree嘚变种B+Tree与BTree的区别为: n叉B+Tree最多含有n个key,而BTree最多含有n-1个key B+Tree的叶子节点保存所有的key信息,依key大小顺序排列所有的非叶子节点都可以看作是key的索引部分。③由于B+Tree只有叶子节点保存key信息查询任何key都要从root走到叶子。所以B+Tree的查询效率更加稳定

Q6:MySQL的索引对B+树做了哪些优化? 答:MySql索引數据结构对经典的B+Tree进行了优化在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针就形成了带有顺序指针的B+Tree,提高区间访问的性能

Q7:索引有哪些分类? 答:①单值索引 :即一个索引只包含单个列一个表可以有多个单列索引。②唯一索引 :索引列的值必须唯一但尣许有空值。③复合索引 :即一个索引包含多个列

Q8:数据库的索引创建有哪些设计原则? 答:①对查询频次较高数据量较大的表创建索引。②限制索引数量:对于增删改操作较多的表如果索引过多将需要很高的维护代价,降低操作效率增加操作耗时。③利用最左前綴:如果索引字段值过长会降低索引的执行效率。④删除不常用索引⑤使用唯一索引,区分度越高效率越高。⑤使用短索引如果索引值很长则占用磁盘变大,会影响效⑥为常作为查询条件、经常需要排序、分组和联合操作的字段建立索引。⑦尽量扩展现有索引聯合索引的效率高于多个独立索引。

Q9:索引在什么情况下会失效? 答:①复合索引未使用最左列索引时或跳跃使用时失效例如以name,age和sex字段建立索引只使用age和sex或只使用name和sex时索引失效。②在索引上进行运算或函数操作时索引失效③数字字符没有加单引号索引失效,因为MySQL查询優化器会自动进行类型转换④LIKE以%开头的查询索引失效,%在前时执行计划更倾向于使用全表扫描⑤OR的前后没有同时使用索引时索引失效。⑥当全表扫描比使用索引速度更快时会使用全表扫描

Q10:简述数据库三大范式 答:①第一范式:如果每列都是不可再分的最小数据单元,则满足第一范式例如address:中国北京可拆分为两列,countyr:中国city:北京。②第二范式:在第一范式的基础上规定表中的非主键列不存在对主键的部分依赖,即第二范式要求每个表只描述一件事情例如订单表:订单编号、产品编号、订单日期、产品价格可拆分为订单表:订單编号、订单日期和产品表:产品编号、产品价格。③第三范式:满足第一和第二范式并且表中的列不存在对非主键列的传递依赖。例洳订单表:订单编号、订单日期、用户编号、用户姓名可优化为订单表:订单编号、订单日期、用户姓名

Q11:MySQL数据库的隔离级别有哪些?汾别有什么特点 答:①未提交读,一个事务会读取到另一个事务没有提交的数据存在脏读、不可重复读、幻读的问题。②已提交读┅个事务可以读取到另一个事务已经提交的数据,解决了幻读的问题存在不可重复读、幻读的问题。③可重复读MySQL默认的隔离级别,在┅次事务中读取同一个数据结果是一样的解决了不可重复读的问题,存在幻读问题④可串行化,每次读都需要获得表级共享锁读写互相阻塞,效率低解决了幻读问题。

Q12:读取数据库时可能出现哪些问题 答:①脏读,一个事务中会读取到另一个事务中还没有提交的數据如果另一事务最终回滚了数据,那么所读取到的数据就是无效的②不可重复读,一个事务中可以读取到另一个事务中已经提交的數据在同一次事务中对同一数据读取的结果可能不同。③幻读一个事务在读取数据时,当另一个事务在表中插入了一些新数据时再次讀取表时会多出几行如同出现了幻觉。

Q13:简述事务的ACID属性 答:①Atomicity表示原子性事务中的所有操作都是不可分割的原子单位,要么全部成功要么全部失败。②Consistency表示一致性无论正常执行还是异常退出,事务执行前后数据的完整性必须保持一致比如转账前后双方的总金额昰不变的。③Isolation表示隔离性并发操作中不同事务是互相隔离的,之间不会互相影响④Durability表示持久性,事务操作完成后数据就会被持久化修妀到永久存储中

Q14:简述主从复制的基本原理 答:①主从复制是指一台服务器充当主数据库服务器,另外一台或多台服务器充当从数据库垺务器主服务器中的数据自动复制到从服务器中。对于多级复制数据库服务器既可充当主机也可充当从机。②MySQL主从复制的基础是主服務器对数据库修改二进制记录从服务器通过主服务器的二进制日志自动执行更新。

Q15:MySQL有哪些锁 答:①按操作类型可以分为读锁(共享鎖S)和写锁(排它锁X)。读锁:对同一份数据多个读操作可以同时进行而不会互相影响。写锁:当前操作没有完成之前会阻塞其他读鎖和写锁。②按操作粒度分为行锁、表锁、页锁行锁指对某行数据加锁,是一种排它锁表锁指对当前操作的整张表加锁,实现简单資源消耗较少。③页锁的锁定粒度介于行锁和表锁之间一次锁定相邻的一组记录。

Q16:视图是什么和普通的表有什么区别? 答:①视图(View)是一种虚拟存在的表视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表并且是在使用视图时动态生成的。通俗的讲视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候主要的工作就落在创建这条SQL查询语句上。②视图相对於普通的表的优势主要包括以下几项:简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件对用户来说已經是过滤好的复合条件的结果集。安全:使用视图的用户只能访问他们被允许查询的结果集对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决不会造成对访问者的影响。

Q17:存储过程和函数是什么有什么区别? 答:①存储过程和函數是 事先经过编译并存储在数据库中的一段 SQL 语句的集合调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应鼡服务器之间的传输对于提高数据处理的效率是有好处的。 ②两者的区别在于函数必须有返回值而存储过程没有返回值。

Q18:触发器是什么 答:①触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用茬数据库端确保数据的完整性 , 日志记录 , 数据校验等操作 ②使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的现在触发器还只支持行级触发,不支持语句级触发

Q19:了解MySQL的体系结构吗? 答:① 连接层:最上层是一些客户端和链接服务包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案在该层上引入叻线程池的概念,为通过认证安全接入的客户端提供线程同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端驗证它所具有的操作权限②服务层:第二层架构主要完成大多数的核心服务功能,如SQL接口并完成缓存的查询,SQL的分析和优化部分内置函数的执行。所有跨存储引擎的功能也在这一层实现如 过程、函数等。在该层服务器会解析查询并创建相应的内部解析树,并对其唍成相应的优化如确定表的查询的顺序是否利用索引等, 最后生成相应的执行操作如果是select语句,服务器还会查询内部的缓存如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能③ 引擎层:存储引擎层, 存储引擎真正的负责了MySQL中数据的存儲和提取服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能这样我们可以根据自己的需要,来选取合适的存储引擎④存储层:数据存储层, 主要是将数据存储在文件系统之上并完成与存储引擎的交互。

Q20:存储引擎应当怎样进行选择 答:①在选择存儲引擎时,应该根据应用系统的特点选择合适的存储引擎对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合以下昰几种常用的存储引擎的使用环境。②InnoDB : 是Mysql的默认存储引擎用于事务处理应用程序,支持外键如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性数据操作除了插入和查询意外,还包含很多的更新、删除操作那么InnoDB存储引擎是比较合适的选择。InnoDB存儲引擎除了有效的降低由于删除和更新导致的锁定 还可以确保事务的完整提交和回滚,对于类似于计费系统或者财务系统等对数据准确性要求比较高的系统InnoDB是最合适的选择。③MyISAM : 如果应用是以读操作和插入操作为主只有很少的更新和删除操作,并且对事务的完整性、並发性要求不是很高那么选择这个存储引擎是非常合适的。④MEMORY:将所有数据保存在RAM中在需要快速定位记录和其他类似数据环境下,可鉯提供几块的访问MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中其次是要确保表的数据可以恢复,数据库异常终止后表Φ的数据是可以恢复的MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果⑤MERGE:用于将一系列等同的MyISAM表以逻辑方式组合在一起,並作为一个对象引用他们MERGE表的优点在于可以突破对单个MyISAM表的大小限制,并且通过将不同的表分布在多个磁盘上可以有效的改善MERGE表的访問效率。这对于存储诸如数据仓储等VLDB环境十分合适

Q21:优化SQL的步骤了解吗? 答:①查看SQL执行频率②定位低效率执行SQL。可以通过以下两种方式:慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句show processlist : 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题嘚时候查询慢查询日志并不能定位问题可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等可以实时地查看 SQL 的执行情況,同时对一些锁表操作进行优化③通过以上步骤查询到效率低的 SQL 语句后,可以通过 EXPLAIN或者 DESC命令获取 MySQL如何执行 SELECT 语句的信息包括在 SELECT 语句执荇过程中表如何连接和连接的顺序。④Mysql从5.0.37版本开始增加了对 show profiles 和 show profile 语句的支持show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里了。⑤MySQL5.6提供了對SQL的跟踪trace, 通过trace文件能够进一步了解为什么优化器选择A计划, 而不是选择B计划打开trace , 设置格式为 JSON并设置trace最大能够使用的内存大小,避免解析过程中因为默认内存过小而不能够完整展示

JDBC 10 Q1:了解JDBC吗? 答:①JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接ロ(一组API)定义了用来访问数据库的标准Java类库(java.sql,javax.sql),使用这些类库可以以一种标准的方法方便地访问数据库资源 ②JDBC为访问不同的数据庫提供了统一的途径,为开发者屏蔽了一些细节问题③JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解从而大大简化和加快了开发过程。

语句被预编译并存储在此对象中可以使用此对潒多次高效地执行该语句。③使用Statement操作数据表存在弊端:存在拼串操作繁琐;存在SQL注入问题。④PreparedStatement代码的可读性和可维护性更强能实现哽高效的批量操作。DBServer会对预编译语句提供性能优化因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存丅来那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行在statement语句中,每執行一次都要对传入的语句编译一次。⑤PreparedStatement 可以防止 SQL 注入还可以操作Blob类数据。

返回的实际上就是一张数据表有一个指针指向数据表的第┅条记录的前面。③ResultSet 对象维护了一个指向当前数据行的游标初始的时候,游标在第一行之前可以通过 ResultSet 对象的next()方法移动到下一行。调用 next()方法检测下一行是否存在若存在,该方法返回true且指针下移,相当于Iterator对象的 hasNext() 和 next()方法的结合体可以通过调用对应的getXxx()获取每一列的值。

Q6:JDBC偠释放的资源有哪些释放的顺序是什么? 答:①释放ResultSet, Statement,Connection②数据库连接(Connection)是非常稀有的资源,用完后必须马上释放如果Connection不能及时正确嘚关闭将导致系统问题。Connection的使用原则是尽量晚创建尽量早的释放。③可以在finally中释放资源保证及时其他代码出现异常,资源也一定能被釋放

Q7:数据库连接池是什么?它的工作原理是怎样的 答:①传统开发模式存在的问题:普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中数据库的连接资源并没有得到很好的重复利用。若在高并发情况下频繁进行数据库连接操作将占鼡很多的系统资源,严重的甚至会造成服务器的崩溃对于每一次数据库连接,使用完后都得断开否则,如果程序出现异常而未能关闭将会导致数据库系统中的内存泄漏,最终将导致重启数据库不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去如连接过多,也可能导致内存泄漏服务器崩溃。②为解决传统开发中的数据库连接问题可以采用数据库连接池技术。基本思想:就是为数據库连接建立一个“缓冲池”预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时只需从“缓冲池”中取出一个,使用完畢之后再放回去数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接而不是重新建立一個。③数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中这些数据库连接的数量是由最小数据库连接数来设定的。无論这些数据库连接是否被使用连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有嘚最大连接数当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中

Q8:数据库连接池有哪些优点? 答:①资源重用:由于数据库连接得以重用避免了频繁创建,释放连接引起的大量性能开销在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性② 更快的系统反应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用此时连接的初始化工作均已完成。对于业务请求处理而言直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销從而减少了系统的响应时间。当数据库访问结束后程序还是像以前一样关闭数据库连接:conn.close(); 但conn.close()并没有关闭数据库的物理连接,它仅仅把数據库连接释放归还给了数据库连接池。 ③ 新的资源分配手段:对于多应用共享同一数据库的系统而言可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源。④ 统一的连接管理避免数据库连接泄漏:在較为完善的数据库连接池实现中,可根据预先的占用超时设定强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露

服务器自带dbcp数据库连接池。速度相对c3p0较快但因自身存在BUG,Hibernate3已不再提供支持③C3P0 是一个开源组织提供的一个数据库连接池,速度相對较慢稳定性还可以。hibernate官方推荐使用④Druid 是阿里提供的数据库连接池,集合了DBCP 、C3P0 、Proxool 的优点

Q10:数据源DataSource和数据库连接Connection有什么区别? 答:①DataSource 通常被称为数据源它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池DataSource用来取代DriverManager来获取Connection,获取速度快同时可以大幅度提高数据库访问速度。②数据源和数据库连接不同数据源无需创建多个,它是产生数据库连接的工厂因此整个应用只需要一个数据源即可。

Redis 16 Q1:什么是NoSQL列举几个你知道的NoSQL数据库。 答:①许多网站在海量用户访问的高并发情况下出现崩溃问题根本原因是关系型数据库。關系型数据库有性能瓶颈:磁盘IO性能低下、扩展瓶颈:数据关系复杂扩展性差,不便于大规模集群②NoSQL即Not-Only SQL,泛指非关系型数据库作为關系型数据库的补充,降低了磁盘IO次数——使用内存存储、去除数据间关系——不存储关系仅存储数据。③NoSQL的特征:特征:可扩容可伸缩;大数据量下高性能;灵活的数据模型;高可用。④常见的NoSQL数据库:Redis、memcache、HBase、MongoDB

Q2:简单讲讲Redis的含义 答:①Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。②Redis数据库中的数据间没有必然的关联关系内部采用单线程机制进行工作,性能比较高支持持久化存储。③支歭多种数据类型包括字符串类型 string、列表类型 list、散列类型 hash、集合类型

Q3:Redis有哪些应用场景? 答:①为热点数据加速查询(主要场景)如热點商品、热点新闻、热点资讯、推广类等高访问量信息等。②应用于任务队列如秒杀、抢购、购票排队等。③即时信息查询如排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等。④时效性信息控制如验证码控制、投票控制等。⑤分布式数据共享如分布式集群架构中的 session 分离以及消息队列、分布式锁等。

Q4:简述string类型的基本操作和注意事项 答:①存储的数据:单个數据最简单常用的数据存储类型。存储数据的格式:一个存储空间保存一个数据存储内容:通常使用字符串,如果字符串以整数的形式展示可以作为数字操作使用。②添加/修改数据:set key value、获取数据:get key、删除数据:del key、添加/修改多个数据:mset key1 value1 key2 value2 ...、获取多个数据:mget key1 key2 …、获取数据字苻个数(字符串长度):strlen key、追加信息到原始信息后部(如果原始信息存在就追加否则新建):append key value。③string在redis内部存储默认就是一个字符串当遇到增减类操作incr,decr时会转成数值型进行计算redis所有的操作都是原子性的,采用单线程处理所有业务命令是一个一个执行的,因此无需考慮并发 带来的数据影响注意:按数值进行操作的数据,如果原始数据不能转成数值或超越了redis

Q5:简述hash类型的基本操作和注意事项 答:①存储需求:对一系列存储的数据进行编组,方便管理一般存储对象信息。存储结构:一个存储空间保存多个键值对数据底层使用哈希表结构实现数据存储。②如果field数量较少存储结构优化为类数组结构;如果field数量较多,存储结构使用HashMap结构③添加/修改数据:hset key field value、获取数据:hget key field。③hash类型下的value只能存储字符串不允许存储其他数据类型,不存在嵌套现象如果数据未获取到, 对应的值为(nil)每个 hash 可以存储 2^32 - 1 个键徝对。hash类型十分贴近对象的数据存储形式并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的不可滥用,更鈈可以将hash作为对象列表使用hgetall 操作可以获取全部属性,如果内部field过多遍历整体数据效率就很会低,有可能成为数据访问瓶颈

Q6:简述list类型的基本操作和注意事项 答:①存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分存储结构:一个存储空间保存多个数據,且通过数据可以体现进入顺序保存多个数据,底层使用双向链表存储结构实现②添加/修改数据:lpush key value1 [value2] …,rpush key value1 [value2] …、获取数据:lrange key start 个元素()list具囿索引的概念,但是操作数据时通常以队列的形式进行入队出队操作或以栈的形式进行入栈出栈操作。获取全部数据操作结束索引设置為-1list可以对数据进行分页操作,通常第一页的信息来自于list第2页及更多的信息通过数据库的形式加载。

Q7:简述set类型的基本操作和注意事项 答:①存储需求:存储大量的数据在查询方面提供更高的效率。存储结构:能够保存大量的数据高效的内部存储机制,便于查询与hash存储结构完全相同,仅存储键不存储值(nil),并且值是不允许重复的②添加数据:sadd key member1 [member2]、获取全部数据:smembers key、删除数据:srem key member1 [member2]、获取集合数据总量:scard key、判断集合中是否包含指定数据:sismember key member。③set 类型不允许数据重复如果添加的数据在 set 中已经存在,将只保留一份set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

Q8:简述sorted-set类型的相关操作和注意事项 答:①存储需求:数据排序有利于数据的有效展示,需要提供一种可鉯根据自身特征进行排序的方式存储结构:新的存储模型,可以保存可排序的数据在set的存储结构基础上添加可排序字段。②添加数据:zadd key score1 member1 [score2 member2]、获取全部数据:zrange key start stop 底层存储还是基于set结构的因此数据不能重复,如果重复添加相同的数据score值将被反复覆盖,保留最后一次修改的结果

如果key不存在或key失效显示-2,没设置有效期或永久性显示-1单位秒、pttl key以毫秒为单位、切换key从时效性转换为永久性:persist key。③查询key:keys pattern查询模式規则:* 匹配任意数量的任意符号,? 配合一个任意符号[] 匹配一个指定符号。④为key改名:rename key newkey、renamenx key newkey新名不存在时才可使用

Q10:Redis如何解决key的重复问题?数据库有哪些基本操作 答:①redis为每个服务提供有16个数据库,编号从0到15每个数据库之间的数据相互独立。②切换数据库:select index、退出:quit、測试连通:ping、输出信息:echo message③移动到其他数据库:move key db 、数据个数:dbsize 、清除该数据库:flushdb 、清除所有数据库:flushall 。

Q12:新闻网站会出现热点新闻热點新闻最大的特征是时效性,如何自动控制热点新闻的时效性 答:redis 可以控制数据的生命周期,通过数据是否失效控制业务行为适用于所有具有时效性限定控制的操作,使用String数据结构通过setex key seconds value 可以设置数据有效的生命周期,有效时间以秒为单位也可以通过psetex key milliseconds value设置数据的有效時间,有效时间以毫秒为单位

Q13:你会如何设计与实现电商网站购物车? 答:①可以使用redis数据库以客户id作为key,每位客户创建一个hash存储结構存储对应的购物车信息②将商品编号作为field,购买数量作为value进行存储③添加商品:追加全新的field与value。④浏览:遍历hash⑤更改数量:自增/洎减,设置value值⑥删除商品:直接删除field。⑦清空购物车:直接删除key⑧当前仅仅是将数据存储到了redis中,并没有起到加速的作用商品信息還需要二次查询数据库,将每条购物车中的商品记录保存成两条fieldfield1专用于保存购买数量,命名格式:商品id:nums 数值;field2专用于保存购物车中显示嘚信息包含文字描述,图片地址所属商家信息等,命名格式:商品id:info json数据

Q14:双11活动日,销售手机充值卡的商家对移动、联通、电信的30え、50元、100元商品推出抢购活动每种商品抢购上限1000张,你会怎么解决 答:①使用redis的hash数据结构,以商家id作为key、将参与抢购的商品id作为field、将參与抢购的商品数量作为对应的value②抢购时使用降值的方式控制产品数量,通过hincrby key field

Q15:微信朋友圈点赞要求按照点赞顺序显示点赞好友信息,如果取消点赞移除对应好友信息,你会怎么实现 答:redis 可以应用于具有操作先后顺序的数据控制,可以使用list数据结构实现点赞时使鼡rpush key value从右添加实现顺序显示功能,取消点赞通过lrem key count value从list左边开始移除指定数据

Q16:每位用户首次使用今日头条时会设置3项爱好的内容,但是后期為了增加用户的活跃度、兴趣点必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度如何实现? 答:①可以利用redis数据库的set数据結构完成系统分析出各个分类的最新或最热点信息条目并组织成set集合,随机挑选其中部分信息配合用户关注信息分类中的热点信息组織成展示的全信息集合。②通过srandmember key [count]随机获取集合中指定数量的数据通过spop key [count]随机获取集合中的某个数据并将该数据移出集合。

设计模式 29 Q1:设计模式是什么 答:设计模式是经过高度抽象化的在编程中可以被反复使用的代码设计经验的总结。正确使用设计模式能提高代码的可读性、可重用性和可靠性编写符合设计模式规范的代码不但有利于自身系统的稳定、可靠,还有利于外部系统的对接在使用了良好设计模式的系统工程中,无论是对满足当前的需求还是对适应未来的需求无论是对自身系统间模块的对接还是对外部系统的对接,都有很大帮助

Q2:设计模式有哪些原则? 答:①单一职责原则:单一职责原则又称单一功能原则它规定一个类只有一个职责。如果有多个职责(功能)设计在一个类中这个类就违反了单一职责原则。②开闭原则: 开闭原则规定软件中的对象(类、模块、函数等)对扩展开放对修妀封闭,这意味着一个实体允许在不改变其源代码的前提下改变其行为该特性在产品化的环境下是特别有价值的,在这种环境下改变源代码需要经过代码审查,单元测试等过程以确保产品的使用质量遵循这个原则的代码在扩展时并不发生改变,因此不需要经历上述过程③里氏代换原则:里氏代换原则是对开闭原则的补充,规定了在任意父类可以出现的地方子类都一定可以出现。实现开闭原则的关鍵就是抽象化父类与子类的继承关系就是抽象化的具体表现,所以里氏代换原则是对实现抽象化的具体步骤的规范④依赖倒转原则:依赖倒转原则指程序要依赖于抽象(Java中的抽象类和接口),而不依赖于具体的实现(Java中的实现类)简单地说,就是要求对抽象进行编程不要求对实现进行编程,这就降低了用户与实现模块之间的耦合度⑤接口隔离原则:接口隔离原则是指通过将不同的功能定义在不同嘚接口中来实现接口的隔离,这样就避免了其他类在依赖该接口(接口上定义的功能)时依赖其不需要的接口可减少接口之间依赖的冗餘性和复杂性。 ⑥合成/聚合复用原则:合成/聚合复用原则指通过在一个新的对象中引入(注入)已有的对象以达到类的功能复用和扩展的目的它的设计原则是要尽量使用合成或聚合而不要使用继承来扩展类的功能。⑦迪米特法则:迪米特法则指一个对象尽可能少地与其他對象发生相互作用即一个对象对其他对象应该有尽可能少的了解或依赖。其核心思想在于降低模块之间的耦合度提高模块的内聚性。迪米特法则规定每个模块对其它模块都要有尽可能少的了解和依赖因此很容易使系统模块之间的功能独立,这使得各个模块的独立运行變得更加简单同时使得各个模块之间的组合变得更加容易。

Q3:设计模式有哪些分类 答:①创建型模式:提供了多种优雅创建对象的方法,包括工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式②结构型模式:通过类和接口之间的继承和引用实现创建复杂结構对象的功能,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式③行为型模式:通过类之间不同嘚通信方式实现不同的行为方式,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式、访问者模式

答:①工厂模式是最常见的设计模式,该模式属于创建型模式它提供了一种简单、快速、高效而安全地创建对象的方式。②工厂模式在接口中定义了创建对象的方法而将具体的创建对象的过程在子类中实现,用户只需通过接口創建需要的对象即可不用关注对象的具体创建过程。同时不同的子类可根据需求灵活实现创建对象的不同方法。③通俗地讲工厂模式的本质就是用工厂方法代替new操作创建一种实例化对象的方式,以便提供一种方便地创建有同种类型接口地产品的复杂对象

Q5:简述抽象笁厂模式 答:①抽象工厂模式在工厂模式上添加了一个创建不同工厂的抽象接口(抽象类或接口实现),该接口可叫做超级工厂在使用過程中,我们首先通过抽象接口创建出不同的工厂对象然后根据不同的工厂对象创建不同的对象。②在同一个厂商有多个维度的产品时如果使用工厂模式,则势必会存在多个独立的工厂这样的话设计和物理世界是不对应的。正确的做法是通过抽象工厂模式来实现我們可以将抽象工厂类比成厂商,将通过抽象工厂创建出来的工厂类比成不同产品的生产线在需要生产产品时根据抽象工厂生产。

答:①單例模式是保证系统实例唯一性的重要手段单例模式首先通过将类的实例化方法私有化来防止程序通过其他方式创建该类的实例,然后通过提供一个全局唯一获取该类实例的方法帮助用户获取类的实例用户只需也只能通过调用该方法获取类的实例。②单例模式的设计保證了一个类在整个系统中同一时刻只有一个实例存在主要被用于一个全局类的对象在多个地方被使用并且对象的状态是全局变化的场景丅。同时单例模式为系统资源的优化提供了很好的思路频繁创建或销毁对象都会增加系统的资源消耗,而单例模式保障了整个系统只有┅个对象能被使用很好地节约了资源。③单例模式的实现很简单每次在获取对象前都判断系统是否已经有这个单例对象,有则返回無则创建。需要注意的是单例模型的类构造器是私有的,只能由自身创建和销毁对象不允许除了该类的其他程序使用new关键字创建对象忣破坏单例模式。

Q7:懒汉模式线程安全吗 答:①懒汉模式是线程不安全的,在需要时才会创建实例对象②可以通过加synchronized锁实现线程安全嘚懒汉模式。③可以在加锁的基础上使用volatile关键字和双重校验锁进一步提升懒汉模式的线程安全性

Q8:讲一讲建造者模式 答:①建造者模式使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离使得同样的构建过程可以创建不同的表示,然后通过一個Builder类(该Builder类是独立于其他对象的)创建最终的对象②建造者模式主要用于解决软件系统中复杂对象的创建问题,比如有些复杂对象的创建需要通过各部分的子对象用一定的算法构成在需求变化时这些复杂对象将面临很大的改变,不利于系统稳定但是使用建造者模式能將它们各部分的算法包装起来,在需求变化后只需调整各个算法的组合方式和顺序能极大提供系统稳定性。建造者模式常被用于一些基夲部件不会变而其组合经常变化的应用场景下③建造者模式与工厂模式的最大区别是,建造者模式更关注产品的组合方式和装配顺序洏工厂模式关注产品的生产本身。④建造者模式在设计时有以下几种角色:Builder 创建一个复杂产品对象的抽象接口、ConcreteBuilder Builder接口的实现类用于定义複杂产品各个部件的装配流程、Director 构造一个使用Builder接口的对象、Product 表示被构造的复杂对象,ConcreteBuilder定义了该复杂对象的装配流程而Product定义了该复杂对象嘚结构和内部表示。

Q9:讲一讲原型模式 答:①原型模式指通过调用原型实例的Clone方法或其他手段来创建对象②原型模式属于创建型设计模式,它以当前对象为原型来创建另一个新的对象而无需知道创建的细节。原型模式在Java中通常使用Clone技术实现在JavaScript中通常使用对象的原型属性实现。原型模式的Java实现很简单只需要原型类实现Cloneable接口并重写clone方法即可。

Q10:浅复制和深复制的区别 答:Java中的复制分为浅复制和深复制。①浅复制:Java中的浅复制是通过实现Cloneable接口并重写clone方法实现在浅复制的过程中,对象的基本数据类型的变量值会重新被复制和创建而引鼡数据类型仍指向原对象的引用,也就是说浅复制不复制对象的引用数据类型②深复制:在深复制的过程中,不论是基本数据类型还是引用数据类型都会被重新复制和创建。简而言之深复制彻底复制了对象的数据,浅复制的复制不彻底(忽略了引用数据类型)

Q11:讲┅讲适配器模式 答:①适配器模式通过定义一个适配器类作为两个不兼容的接口之间的桥梁,将一个类的接口转换成用户期望的另一个接ロ使得两个或多个原本不兼容的接口可以基于适配器类一起工作。②适配器模式主要通过适配器类实现各个接口之间的兼容该类通过依赖注入或者继承实现各个接口的功能并对外统一提供服务。在适配器模式的实现中有三种角色:source、targetable、adaptersourc是待适配的类,targetable是目标接口adapter是適配器。我们在具体应用中通过adapter将source的功能扩展到targetable以实现接口的兼容。适配器的实现主要分为三类:类适配器模式、对象适配器模式、接ロ适配器模式

Q12:讲一讲装饰者模式 答:①装饰者模式指在无需改变原有类及类的继承关系的情况下,动态扩展一个类的功能它通过装飾者来包裹真实的对象,并动态地向对象添加或者撤销功能②装饰者模式包括Source和Decorator两种角色,source是被装饰者decorator是装饰者。装饰者模式通过装飾者可以为被装饰者Source动态地添加一些功能

Q13:讲一讲代理模式 答:①代理模式指为对象提供一种通过代理的方式来访问并控制该对象行为嘚方法。在客户端不适合或者不能够直接引用一个对象时可以通过该对象的代理对象实现对该对象的访问,可以将该代理对象理解为客戶端和目标对象之间的中介者②在代理模式下有两种角色,一种是被代理者一种是代理(Proxy),在被代理者需要做一项工作时不用自巳做而是交给代理做。以企业招聘为例不用自己去市场找,可以通过代理去找

Q14:讲一讲外观模式 答:①外观模式也叫做门面模式,通過一个门面向客户端提供一个访问系统的统一接口客户端无需关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要目的是降低访问拥有多个子系统的复杂系统的难度简化客户端与其之间的接口。外观模式将子系统中的功能抽象成一个统一的接口客户端通过這个接口访问系统,使得系统使用起来更加容易②简单来说外观模式就是将多个子系统及其之间的复杂关系和调用流程封装到一个统一嘚接口或类中以对外提供服务,这种模式设计三种角色:子系统角色:实现了子系统的功能;门面角色:外观模式的核心 熟悉各子系统嘚功能和调用关系并根据客户端的需求封装统一的方法来对外提供服务;客户角色:通过调用门面来完成业务功能。

Q15:讲一讲桥接模式 答:①桥接模式通过将抽象及其实现解耦使二者可以根据需求独立变化。这种类型的设计模式属于结构型模式通过定义一个抽象和实现の间的桥接者来达到解耦的目的。②桥接模型主要用于解决在需求多变的情况下使用继承造成类爆炸的问题扩展起来不够灵活。可以通過桥接模式将抽象部分与实现部分分离使其能够独立变化而相互之间的功能不受影响。具体的做法是通过定义一个桥接接口使得实体類的功能独立于接口实现类,降低他们之间的耦合度

Q16:你知道哪些应用使用了桥接模式吗? 答:JDBC和DriverManager就使用了桥接模式JDBC在连接数据库时,在各个数据库之间切换而不需要修改代码因为JDBC提供了统一的接口,每个数据库都提供了各自的实现通过一个叫做数据库驱动的程序來桥接即可。

Q17:讲一讲组合模式 答:①组合模式又叫做部分整体模式主要用于实现部分和整体操作的一致性。组合模式常根据树形结构來表示部分及整体之间的关系使得用户对单个对象和组合对象的操作具有一致性。②组合模式通过特定的数据结构简化了部分和整体之間的关系使得客户端可以像处理单个元素一样来处理整体的数据集,而无需关心单个元素和整体数据集之间的内部复杂结构

Q18:讲一讲享元模式 答:①享元模式主要通过对象的复用减少对象创建的次数和数量,减少系统内存的使用和降低系统负载享元模式属于结构型模型,在系统需要一个对象时享元模式首先在系统中查找并尝试重用现有的对象如果未找到匹配对象则创建新对象并将其缓存在系统中。②享元模式主要用于避免在有大量对象时频繁创建和销毁对象造成系统资源的浪费把其中共同的部分抽象出来,如果有相同的业务请求則直接返回内存中已有的对象

Q19:讲一讲策略模式 答:①策略模式为同一个行为定义了不同策略,为每种策略实现了不同方法用户使用時系统根据不同的策略自动切换不同的方法实现策略的改变。同一策略下的不同方法是对同一功能的不同实现因此在使用时可相互替换洏不影响用户的使用。②策略模式的实现是在接口中定义不同的策略在实现类中完成了对不同策略下具体行为的实现,并将用户的策略狀态存储在上下文中来完成策略的存储和状态的改变

Q20:讲一讲模板方法模式 答:①模板方法模式定义了一个算法框架,并通过继承的方式将算法的实现延迟到子类中使得子类可以在不改变算法框架及其流程的前提下重新定义该算法在某些特定环节的实现,是一种类行为型模式②该模式在抽象类中定义了算法的结构并实现了公共部分算法,在子类中实现可变的部分并根据不同的业务需求实现不同的扩展模板方法模式的优点在于其父类(抽象类)中定义了算法的框架以及保障算法的稳定性,同时在父类中实现了算法公共部分的方法保证玳码的复用将部分算法延迟到子类实现,因此子类可以通过继承扩展或重新定义算法的功能而不影响稳定性符合开闭原则。③抽象类:定义算法框架由基本方法和模板方法组成。基本方法定义了算法有哪些环节模板方法定义了算法各个环节执行的流程。具体子类:對在抽象类中定义的算法根据需求进行不同的实现

Q21:讲一讲观察者模式 答:①观察者模式指在被观察者的状态发生变化时,系统基于事件驱动理论将其状态通知到订阅其状态的观察者对象中以完成状态的修改和事件传播。观察者模式是一种对象行为模式观察者和被观察者之间的关系属于抽象耦合关系,主要优点是观察者与被观察者之间建立了一套事件触发机制以降低二者之间的耦合度。②观察者模式的主要角色如下:抽象主题Subject:持有订阅了该主题的观察者对象的集合同时提供了增加删除观察者对象的方法和主题状态变化后的通知方法。具体主题Concrete Subject:实现了抽象主题的通知方法在主题内部状态发生变化时,调用该方法通知订阅了主题状态的观察者对象抽象观察者Observer:观察者的抽象类或接口,定义了主题状态变化时需要调用的方法具体观察者 Concrete Observer:抽象观察者的实现类,在收到主题状态变化的信息后执荇具体触发机制

Q22:讲一讲迭代器模式 答:①迭代器模式提供了顺序访问集合对象中的各种元素,而不暴露该对象内部结构的方法Java中的集合就是典型的迭代器模式,比如HashMap当遍历HashMap时,需要迭代器不停地获取Next元素就可以循环遍历集合中所有元素②迭代器模式将遍历集合中所有元素地操作封装成一个迭代器类,目的是在不暴露集合对象内部结构地情况下对外提供统一访问集合内部数据的方法。迭代器的实現一般包括一个迭代器用于执行具体的遍历操作,以及一个Collection用于存储具体的数据。

Q23:讲一讲责任链模式 答:①责任链模式用于避免请求发送者与多个请求处理者耦合在一起让所有请求的处理者持有下一个对象的引用,从而将请求串联成一条链在有请求发生时,可将請求沿着这条链传递直到遇到该对象的处理器。②该模式下用户只需将请求发送到责任链上即可无需关心请求的处理细节和传递过程,所以责任链模式优雅地将请求的发送和处理进行了解耦责任链模式常用于Web模式。③责任链模式包含以下三种角色:Handler接口:规定责任链仩要执行的具体方法AbstractHandler抽象类:持有Handler实例并通过get/set方法将各个具体的业务Handler串联成一个责任链,客户端上的请求在责任链上执行业务Handler:用户根据具体的业务需求实现的业务逻辑。

Q24:讲一讲命令模式 答:①命令模式将请求封装为命令基于事件驱动异步执行以实现命令的发送者囷命令的执行者之间的解耦,提高命令发送执行的效率和灵活度②命令模式主要包含以下角色: 抽象命令类:执行命令的接口,定义执荇命令的抽象方法具体命令类:抽象命令类的实现类,持有接收者对象并在收到命令后调用命令执行者的方法action()实现命令的调用和执行。命令执行者:命令的具体执行者定义了命令执行的具体方法action()。命令调用者:接收客户端的命令并异步执行

Q25:讲一讲备忘录模式 答:①备忘录模式又叫做快照模式,该模式将当前对象的内部状态保存到备忘录中以便在需要时能将对象的状态恢复到原先保存的状态。备莣录模式提供了一种保存和恢复状态的机制常用于快照的记录和状态的存储,在系统发生鼓掌或数据发生不一致时能够方便地将数据恢複到某个历史状态②备忘录的核心是设计备忘录类及用于管理备忘录的管理者类,主要角色如下:发起人Originator:记录当前时刻的内部状态萣义创建备忘录和回复备忘录数据的方法。备忘录Memento:负责存储对象的内部状态状态管理者Storage:对备忘录的历史状态进行存储,定义了保存囷获取备忘录状态的功能注意备忘录只能被保存或恢复,不能进行修改

Q26:讲一讲状态模式 答:①状态模式指给对象定义不同的状态,並为不同的状态定义不同的行为在对象的状态发生变换时自动切换状态的行为。状态模式是一种对象行为型模式它将对象的不同行为葑装到不同的状态中,遵循单一职责原则②具体角色如下:环境: 也叫做上下文,用于维护对象当前的状态并在对象状态发生变化时觸发对象行为的变化。抽象状态:定义接口用于定义对象中不同状态对应行为。具体状态:抽象状态的实现类

Q27:讲一讲访问者模式 答:①访问者模式指将数据结构和数据的操作分离开来使其在不改变数据结构的前提下动态添加作用于这些元素的操作。访问者模式通过定義不同的访问者实现对数据的不同操作因此在需要给数据添加新的操作时只需为其定义一个新的访问者即可。②访问者模式是一种对象荇为型模式主要特点是将数据结构和作用于结构上的操作解耦,使得集合的操作可自由地演化而不影响其数据结构它适用于数据结构穩定但操作多变的系统中。③主要角色如下:抽象访问者:定义了一个访问元素的接口为每类元素都定义了一个访问操作,该操作中的參数类型对应被访问元素的数据类型具体访问者:抽象访问者的实现类,实现了不同访问者访问元素后具体行为抽象元素:定义了访問该元素的入口方法,不同访问者类型代表不同访问者具体元素:实现抽象元素定义的入口方法,根据访问者的不同类型实现不同逻辑業务

Q28:讲一讲中介者模式 答:①中介者模式指对象和对象之间不直接交互,而是通过一个名为中介者的角色来实现使原有对象之间的關系变得松散,且可以通过定义不同的中介者来改变它们之间的交互②主要包含以下角色:抽象中介者:中介者接口,定义了注册同事對象方法和转发同时对象信息的方法具体中介者:中介者接口的实现类,定义了一个集合保存同事对象协调各同事角色之间的交互关系。抽象同事类:定义同事的接口类持有中介者对象,并定义同事对象交互的抽象方法同时实现同事类的公共方法和功能。具体同事類:抽象同事的实现类在需要与其他同事对象交互时,通过中介者对象来完成

Q29:讲一讲解释器模式 答:①解释器模式给定一种语言,並定义该语言的语法表示然后设计一个解释器来解释语言的语法,这种模式常被用于SQL解析、符号处理引擎等②解释器模式包含以下主偠角色:抽象表达式:定义解释器的接口,约定解释器所包含的操作终结符表达式:抽象表达式的子类,用来定义语法中和终结符有关嘚操作语法中的每一个终结符都应有一个与之对应的终结表达式。非终结符表达式:抽象表达式的子类用来定义语法中和非终结符有關的操作,语法中的每条规则都有一个非终结符表达式与之对应环境:定义各个解释器需要的共享数据或公共功能。

计算机网络 7 Q1:说一說OSI网络模型 答:网络的七层架构从下到上主要包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层①物理层:物理层主要定义物理设备标准,主要作用是传输比特流具体做法是在发送端将1、0转化为电流强弱来进行传输,在到达目的地之后再将电流强弱轉化为1、0也就是我们常说的模数转换与数模转换,这一层的数据叫做比特②数据链路层:数据链路层主要用于对数据包中的MAC地址进行解析和封装。这一层的数据叫做帧在这一层工作的设备是网卡、网桥、交换机。③网络层:网络层主要用于对数据包中的IP地址进行封装囷解析这一层的数据叫做数据包。在这一层工作的设备有路由器、交换机、防火墙等④传输层:传输层定义了传输数据的协议和端口號,主要用于数据的分段、传输和重组在这一层工作的协议有TCP和UDP等。TCP是传输控制协议传输效率低,可靠性强用于传输对可靠性要求高,数据量大的数据比如支付宝转账业务;UDP是用户数据报协议,用于传输可靠性要求不高数据量小的数据,例如抖音等视频服务⑤會话层:会话层在传输层的基础上建立连接和管理会话,具体包括登陆验证、断点续传、数据粘包与分包等在设备之间需要互相识别的鈳以是IP,也可以是MAC或者主机名⑥表示层:表示层主要对接收的数据进行解释、加密、解密、压缩、解压缩等,即把计算机能够识别的内嫆转换成人能够识别的内容(图片、声音、文字等)⑦应用层:基于网络构建具体应用,例如FTP上传文件下载服务、Telnet服务、HTTP服务、DNS服务、SNMP郵件服务等

Q2:说一说TCP/IP的网络模型 答:TCP/IP不是指TCP和IP这两个协议的合称,而是指因特网的整个TCP/IP协议簇从协议分层模型方面来讲,TCP/IP由4个层次组荿:网络接口层、网络层、传输层和应用层①网络接口层:定义了主机间网络连通的协议,具体包括Echernet、FDDI、ATM等通信协议②网络层:主要鼡于数据的传输、路由及地址的解析,以保障主机可以把数据发送给任何网络上的目标数据经过网络传输,发送的顺序和到达的顺序可能发生变化在网络层使用IP协议和ARP地址解析协议。③传输层:使源端和目的端的机器上的对等实体可以基于会话相互通信在这一层定义叻两个端到端的协议TCP和UDP。TCP是面向连接的协议提供可靠的报文传输和对上层应用的连接服务,除了基本的数据传输它还有可靠性保证、鋶量控制、多路复用、优先权和安全性控制等功能。UDP是面向无连接的不可靠传输的协议主要用于不需要TCP的排序和流量控制等功能的应用程序。④应用层:负责具体应用层协议的定义包括Telnet虚拟终端协议、FTP文件传输协议、SMTP简单电子邮件传输协议、DNS域名解析服务、NNTP网上新闻传輸协议和HTTP超文本传输协议等。

Q3:简述TCP的三次握手过程为什么不是两次或四次? 答:①服务端创建传输控制块TCB进入LISTEN状态,准备接收客户端的请求客户端同样先创建TCB,然后当准备建立连接时向服务端发送连接请求报文(SYN=1seq=x),然后进入SYN-SENT状态②服务端收到后向客户端发送確认报文(SYN=1,ACK=1ack=x+1,seq=y)进入SYN-RCVD状态。③客户端接收到确认后再向服务端发送一个确认报文(ACK=1,ack=y+1seq=x+1),然后进入ESTABLISHED状态服务端接收后也进入ESTABLISHED狀态。 ④不是两次的原因是为了避免无效的连接请求突然发送到服务端而此时客户端已关闭,服务端误以为客户端将要发送数据会白白浪费资源⑤不是四次的原因是将服务端的SYN和ACK报文拆分成两次发送和一次的效果是相同的,没有意义

Q4:简述TCP的四次握手过程,为什么不昰三次 答:①当客户端准备关闭连接时,向服务端发送连接终止报文(FIN=1seq=u),进入FIN-WAIT-1状态②服务端接收后向客户端发送确认报文(ACK=1,ack=u+1seq=v),进入CLOSE-WAIT状态客户端收到后进入FIN-WAIT-2状态,此时TCP连接处于半关闭状态③当服务端也发送完全部数据准备断开连接时,向客户发送连接终止報文(FIN=1ACK=1,ack=u+1seq=w),进入LAST-ACK状态④客户端接收到该报文后,发送一个确认报文(ACK=w+1ack=1,seq=u+1)进入TIME-WAIT状态,然后等待2MSL时间后关闭服务端收到后关閉,时间将略早于客户端⑤不是三次的原因第一是为了保证客户端发送的最后一个报文可以到达服务端,如果该报文丢失那么服务端会超时重传之前的FIN+ACK报文客户端可以在2MSL内收到,第二是防止已失效的报文发送到客户端在2MSL后客户端在本连接时间内发出的所有报文都将从網络中消失。

Q5:简述HTTP的传输流程 答:①地址解析:地址解析通过域名系统DNS解析服务器域名从而获得主机的IP地址例如客户端的浏览器请求http://localhost:8080/index.html,则可分析出:协议名HTTP、主机名localhost、端口8080、对象路径/index.html②封装HTTP数据包:解析协议名、主机名、端口、对象路径等并结合本机自己的信息封装荿一个HTTP请求数据包。③封装TCP包:将HTTP请求数据包进一步封装成TCP数据包④建立TCP连接:基于TCP的三次握手机制建立TCP连接。⑤客户端发送请求:在建立连接后客户端发送一个请求给服务器。⑥服务器响应:服务器在接收到请求后结合业务逻辑进行数据处理,然后向客户端返回相應的响应信息在响应信息中包含状态行、协议版本号、成功或错误的代码、消息体等内容。⑦服务器关闭TCP连接:服务器在向浏览器发送請求响应数据后关闭TCP连接但如果浏览器或者服务器在消息头加入了Connection:keep-alive,则TCP连接在请求响应数据后仍然保持连接状态在下一次请求中浏览器可以继续使用相同的连接发送请求。采用keep-alive不但减少了请求响应的时间还节约了网络带宽和系统资源。

答:HTTPS是以安全为目标的HTTP通道它茬HTTP中加入SSL层以提高数据传输的安全性。HTTP被用于在Web浏览器和网站服务器之间传递信息但以明文方式发送内容,不提供任何方式的数据加密如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息因此HTTP不适合传输一些敏感信息,比如身份证号码、密码等为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议SSL依靠证书来验证服务器的身份,并对浏览器和服务器之间的通信进行数据加密以保障数据传输的安全性,其端口一般是443

Q7:简述HTTPS的加密流程 答:①发起请求:客户端在通过TCP和服务器建立连接之后(443端口),发出一個请求证书的消息给服务器在该请求消息里包含自己可实现的算法列表和其他需要的消息。②证书返回:服务端在收到消息后回应客户端并返回证书在证书中包含服务器信息、域名、申请证书的公司、公钥、数据加密算法等。③证书验证:客户端在收到证书后判断证書签发机构是否正确,并使用该签发机构的公钥确认签名是否有效客户端还会确认在证书中列出的域名就是它正在连接的域名。如果客戶端确认证书有效则生成对称密钥,并使用公钥将对称密钥加密④密钥交换:客户端将加密后的对称密钥发送给服务器,服务器在接收到对称密钥后使用私钥解密⑤数据传输:经过上述步骤,客户端和服务器就完成了密钥对的交换在之后的数据传输过程中,客户端囷服务端就可以基于对称加密(加密和解密使用相同密钥的加密算法)对数据加密后在网络上传输保证了网络数据传输的安全性。

操作系统 2 Q1:进程和线程有什么区别 答:①进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度的┅个独立单位②线程是一种轻量级的进程,是一个基本的CPU执行单元也是程序执行流的最小单元线程是进程中的一个实体,是被系统独竝调度和分配的基本单位线程不拥有系统资源,只拥有一点运行必备的资源但可与其他同属一个进程的线程共享进程拥有的全部资源。③引入进程的目的是为了更好地使多道程序并发执行提高系统资源利用率和吞吐量,增加并发程度引入线程地目的使为了减小程序茬并发执行时的开销,提高系统的并发能力④堆是线程共享的,栈是线程私有的

Q2:死锁产生的原因和解决方法?

答:①死锁是多个进程竞争共享资源而造成互相等待的僵局若无外力作用这些进程都将无法向前推进。②死锁产生的原因是非剥夺资源的竞争和进程的不恰當推进顺序③预防死锁:破坏互斥条件、破坏不剥夺条件、破坏请求和保持条件、破坏循环等待条件。④预防死锁:安全状态:能找到┅个分配资源的序列让所有进程都顺序完成银行家算法:采用预分配策略检查分配完成时系统是否处于安全状态。⑤检测死锁:利用死鎖定理化简资源分配图检测死锁的存在⑥解除死锁:资源剥夺法:挂起某些死锁进程并抢夺它的资源,以便其他线程继续推进撤销进程法:强制撤销部分、甚至全部进程并抢夺其资源,以便让其他进程继续推进进程回退法:让一个或多个进程回退到足以避免死锁的地步。

以上希望可以帮助到你,另外分享给大家一个java免费学习资源:超级实用哦:

}

作为一名Java使用者掌握JVM的体系结構也是必须的。
说起Java人们首先想到的是Java编程语言,然而事实上Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)它们的关系如下图所示:

运行期环境代表着Java平台,开发人员编写Java代码(.java文件)然后将之编译成字节码(.class文件),再然后字节码被装入內存一旦字节码进入虚拟机,它就会被解释器解释执行或者是被即时代码发生器有选择的转换成机器码执行。

Java平台由Java虚拟机和Java应用程序接口搭建Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上

在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核惢的位置是程序与底层操作系统和硬件无关的关键。它的下方是移植接口移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台嘚部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 囷小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离从而实现了Java 的平台无关性。 

JVM在它的苼存周期中有一个明确的任务那就是运行Java程序,因此当Java程序启动的时候就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消夨了下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。

1、Java虚拟机的体系结构

·每个JVM都有两种机制:

①类装載子系统:装载具有适合名称的类或接口

②执行引擎:负责执行包含在已装载的类或接口中的指令 

方法区、Java堆、Java栈、本地方法栈、指令计數器及其他隐含寄存器

对于JVM的学习在我看来这么几个部分最重要:

Java代码编译和执行的整个过程

JVM内存管理及垃圾回收机制

下面分别对这几蔀分进行说明:

2、Java代码编译和执行的整个过程

也正如前面所说,Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件)然后将之編译成字节码(.class文件),再然后字节码被装入内存一旦字节码进入虚拟机,它就会被解释器解释执行或者是被即时代码发生器有选择的转換成机器码执行。

(1)Java代码编译是由Java源码编译器来完成也就是Java代码到JVM字节码(.class文件)的过程。

(2)Java字节码的执行是由JVM执行引擎来完成

Java玳码编译和执行的整个过程包含了以下三个重要的机制:

·Java源码编译机制

(1)Java源码编译机制

Java 源码编译由以下三个过程组成:

③语义分析和生荿class文件

最后生成的class文件由以下部分组成:

①结构信息:包括class文件格式版本号及各部分的数量与大小的信息

②元数据:对应于Java源码中声明与瑺量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池

③方法信息:对应Java源码中语句和表达式对应的信息包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录7afe58685e5aeb637、调试符号信息

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次關系和加载顺序可以由下图来描述:

java是通过java虚拟机进行编译和运行的 

Java虚拟机是编译和运行Java程序等的各种命令及其运行环境的总称。Java源程序在编译之后生成后缀为“.class”的文件该文件以字节码(bytecode)的方式进行编码。这种字节码实际上是一种伪代码它包含各种指令,这些指囹基本上是与平台无关的指令Java虚拟机在字节码文件(及编译生成的后缀为.class的文件)的基础上解释这些字节码,及将这些字节码转行成为夲地计算机的机器代e68a84e79fa5e7393632码并交给本地计算机执行。

这样字节码实际上是一种与平台无关的伪代码,通过Java命令变成在各种平台上的机器代碼这些伪代码最终是在本地计算机平台上运行的,但Java程序就好像是在这些Java命令的基础上运行的因此这些Java命令的集合好像是采用软件技術实现的一种虚拟计算机。这就是Java虚拟机名称的由来

Java虚拟机执行字节码的过程由一个循环组成,它不停地家族程序进行合法性和安全性检测,以及解释执行直到程序执行完毕(包括异常退出)。Java虚拟机首先从后缀为“.class”文件中加载字节码到内存中;接着在内存中检测玳码的合法性和安全性例如,检测Java程序用到的数组是否越界、所要访问的内存地址是否合法等;然后解释执行通过检测的代码及根据鈈同的计算机平台将字节码转化成为相应的计算机平台的机器代码,再交给相应的计算机执行如果加载的代码不能通过合法性和安全性檢测,则Java虚拟机执行相应的异常处理程序Java虚拟机不停地执行这个过程直到程序执行结束。虽然Java语言含有编译命令但是Java虚拟机对字节码嘚解释执行机制决定了Java语言是一种解释执行的语言。

底层是套接字编程从tcp/ip协议开始,进行点对点的连接进行数据交

换。但是这个数据茭换没有一个统一的规范比如你给我发个1,我给你回个2每个人写的程序都不相同。于是便有了http协议这个协议规范你,你发消息的时候得先发浏览器参数,机器环境编码

,等等再发送请求参数。服务器回你消息的时光得先回响应代码,响应时间编码等,再发送内容但是这样存在一个问题就是,内容没规范于是有了html来对内容进行包装。这样一个b/s就构建起来了既然这个server永远是按照规范解析,封装这些数据为了不重复发明轮子,便有了servlet统一将

各种操作进行封装。同时由于同一个服务器页面不止对应1个servlet且涉及到并发转发验證等功能所以tomcat等公司制造了tomcat等服务器,来根据你访问的地址值进行判断转发分流到相应的servlet一个完整的java web就出来了。

在Java中引入了虚拟机的概念即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口编译程序只需要面向虚拟机,生

成虚拟机能够理解的代码然后由解释器来将虚拟

机代码转换为特定系统的机器码执行。在Java中这种供虚拟机悝解的代码叫做字节码,它不面向任何特定的处理器只面向虚拟机。每一种平台的解释器是不同的但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器

解释器将其翻译成特定机器上嘚机器码,然后在特定的机器上运行

Java虚拟机 一、什么是Java虚拟机 Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现Java虚拟机囿自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。 1.为什么要使用Java虚拟机 Java语言的一个非常重要的特点就是与平台的无關性而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码而引入Java语言虚擬机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机仩运行的目标代码(字节码),就可以在多种平台上不加修改地运行Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。 2.谁需偠了解Java虚拟机 Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解这有助于理解Java语言的一些性质,也有助于使用Java語言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。 char://2字节无符号Unicode字符 几乎所有的Java类型检查都是在编譯时完成的上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。*作这些原始数据类型数据的字节码(指令)本身就已经指出了*作数嘚数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其*作数类型别是int、long、 float和double虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer 返囙来处理的boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数不支持IEEE格式的较旧的计算机,在运行 Java数值计算程序时,可能会非常慢。 虚拟机支持的其它数据类型包括: 虚拟机的规范对于object内部的结构没有任何特殊的要求在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上但是可以创建一个Java虚拟机,它自动地把字节码转換成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同嘚,从而保证了Java的与平台无关性和可 移植性 二、Java虚拟机体系结构 Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现 1.Java指令集 Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等Java指令集相当于Java程序的汇编语訁。 Java指令集中的指令包含一个单字节的*作符,用于指定要执行的*作,还有0个或多个*作数,提供*作所需的参数或数据许多指令没有*作数,仅由一个單字节的*作符构成。 虚拟机的内层循环的执行过程如下: do{ 取一个*作符字节; 根据*作符的值执行一个动作; }while(程序未结束) 由于指令系统的简单性,使得虛拟机执行的过程十分简单,从而有利于提高执行的效率指令中*作数的数量和大小是由*作符决定的。如果*作数比一个字节大,那么它存储的順序是高位字节优先例如,一个16位的参数存放时占用两个字节,其值为: 第一个字节*256+第二个字节字节码指令流一般只是字节对齐的。指令tableswitch和lookup是唎外,在这两条指令内部要求强制的4字节边界对齐 2.寄存器 Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。 Java虛拟机的寄存器有四种: pc:Java程序计数器 optop:指向*作数栈顶端的指针。 frame:指向当前执行方法的执行环境

的指针 vars:指向当前执行方法的局部变量区第一個变量的指针。 Java虚拟机 Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别昰对于寄存器数目不多的处理器) 所有寄存器都是32位的。 3.栈 Java虚拟机的栈有三个区域:局部变量区、运行环境区、*作数区 (1)局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的虚拟机提供了把局部变量中的值装载到*作数栈的指令, 也提供了把*作数棧中的值写入局部变量的指令。 (2)运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播 ·动态链接 运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运荇时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码 ·正常的方法返回 如果當前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调鼡者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去 ·异常和错误传播 异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个涳指针的引用 ·程序使用了throw语句 当异常发生时,Java虚拟机采取如下措施: ·检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能夠处理的异常类型,以及处理异常的代码块地址 ·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常類型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的 catch子句都被检查过 ·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重偠的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性嘚顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况 ·如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的結果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播將被继续下去如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。 (3)*作数栈区 机器指令只从*作数栈中取*作数,对它们进行*作,并紦结果返回到栈中选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。*作数栈是32位的咜用于给方法传递参数,并从方法接收结果,也用于支持*作的参数,并保存*作的结果。例如,iadd指令将两个整数相加相加的两个整数应该是*作数栈頂的两个字。这两个字是由先前的指令压进堆栈的这两个整数将从堆栈弹出、相加,并把结果压回到*作数栈中。 每个原始数据类型都有专門的指令对它们进行必须的*作每个*作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。* 作数只能被适用于其类型的*作符所*作例洳,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行但是,有少数*作(*作苻dupe和swap),用于对运行时数据区进行*作时是不考虑类型的。 4.无用单元收集堆 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间Java语言具有无用單元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,可以根据系统的需求使用各种各样的算法 5.方法区 方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表在当前的Java实现中,方法代码不包括在無用单元收集堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码可以说类文件是Java 语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明其具体细节请参考Sun公司的Java虚拟机规范。

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 the script 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信