zhoupj / Thinking

0 stars 0 forks source link

面试题汇总 #5

Open zhoupj opened 7 years ago

zhoupj commented 7 years ago
  1. spring
    http://ifeve.com/spring-interview-questions-and-answers/

  2. 前端
    https://github.com/h5bp/Front-end-Developer-Interview-Questions

  3. java
    http://www.importnew.com/10980.html

zhoupj commented 7 years ago

spirng

什么是Spring IOC 容器,有哪些优势?

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

spring AOP 的理解

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

解释Spring支持的几种bean的作用域。

Spring框架支持以下五种bean的作用域:

singleton : bean在每个Spring ioc 容器中只有一个实例。 prototype:一个bean的定义可以有多个实例。 request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。 session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 缺省的Spring bean 的作用域是Singleton.

srping bean 生命周期

见:http://www.cnblogs.com/zrtqsk/p/3735273.html

spring事务默认是哪个级别,都有哪些级别

http://blog.csdn.net/liangxw1/article/details/51197560

zhoupj commented 7 years ago

Spring MVC

session和cookie有什么区别?

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

more->http://blog.csdn.net/fangaoxin/article/details/6952954/

你遇到过乱码问题吗? 怎么解决的?

http://blog.csdn.net/kalision/article/details/46441081/

如何解决POST请求中文乱码问题,GET的又如何处理呢?(和上一个类似)

在web.xml中加入:

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

以上可以解决post请求乱码问题。对于get请求中文参数出现乱码解决方法有两个: 修改tomcat配置文件添加编码与工程编码一致,如下:

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一种方法对参数进行重新编码:

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

SpringMVC与Struts2的主要区别?

①springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。 ②springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。 ③Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。 Jsp视图解析器默认使用jstl。

spring mvc 工作流程

见:https://github.com/zhoupj/Thinking/wiki/spring_mvc

Spring工作流程描述

  1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
  3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
    1. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
  4. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
  5. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
  6. ViewResolver 结合Model和View,来渲染视图
  7. 将渲染结果返回给客户端。

Spring工作流程描述 为什么Spring只使用一个Servlet(DispatcherServlet)来处理所有请求? 详细见J2EE设计模式-前端控制模式 Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler? 符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。

zhoupj commented 7 years ago

Servlet

web.xml 中的过滤器(拦截器)Filter与监听器Listener的作用和区别?

http://blog.csdn.net/pg_guo/article/details/9118633

java 中 过滤器、监听器、拦截器 解释

1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等. 2.监听器:这个东西在c/s模式里面经常用到,他会对特定的事件产生产生一个处理。监听在很多模式下用到。比如说观察者模式,就是一个监听来的。又比如struts可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。 3.java的拦截器 主要是用在插件上,扩展件上比如 hivernate spring struts2等 有点类似面向切片的技术,在用之前先要在配置文件即xml文件里声明一段的那个东西。

zhoupj commented 7 years ago

Java

jvm,jre,jdk 区别

JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。

Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。

java 中一个类如何继承多个类?

java 不能继承多个类。

HashMap和Hashtable有什么区别?

HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点: HashMap允许键和值是null,而Hashtable不允许键或者值是null。 Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。 一般认为Hashtable是一个遗留的类。

string,stringbuilder,Stringbuffer 解释

相信大家都知道StringBuffer、StringBuilder,但是这两个的用法都差不多,到底有什么区别呢,这也是面试的时候问的比较多的一道题,这里我就来说说,这两个的区别结合String来说~

  String:查看源码得知,String类的声明是:public final,所以可以很清楚的知道,fianl的话是改变不了的,所以,如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串,可想而知,一旦遇到复杂的操作,用String是多么低效率的事啊!

  所以,一般涉及到字符串操作的,我们一般使用StringBuffer或者StringBuilder,但是这两者都又有什么区别呢,下面我来说说:

  查看源码可以得知:

    StringBuffer和StringBuilder都集成了AbstractStringBuilder,而StringBuffer大部分方法都是synchronized,也就是线程安全的,而StringBuilder就没有,所以,我们查看API可以知道,StringBuilder可以操作StringBuffer,但是StringBuffer不可以操作StringBuilder,这也是线程的原因;

    所以,可想而知,StringBuffer的效率肯定没有StringBuilder,因为StringBuffer要维持同步锁,这肯定要消耗部分资源,下面这个例子就可以充分证明这三者之间的关系:

Java中的两种异常类型是什么?他们有什么区别?

Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。这里有Java异常处理的一些小建议。

如何用已有的map类实现一个map lru 算法

public class LRUCache<K, V> extends LinkedHashMap<K, V> {

    private int cacheSize;

    public LRUCache(int cacheSize) {
        super(32, (float) 0.75, true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > cacheSize;
    }
}

java 减少GC开销的措施有哪些

  根据GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:

(1)不要显式调用System.gc()   此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。这里特别需要说明的是,在代码中显示的调用System.gc(),并不一定能够进行GC,这个我们可以通过finalize()方法进行验证,即主动调用System.gc(),并不一定每次都调用finalize()方法,具体可以参考博客final finally finalize 的区别中的代码实例。finalize()方法的特征是在对象被回收之前, 首先调用finalize()方法。

(2)尽量减少临时对象的使用   临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。

(3)对象不用时最好显式置为Null   一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。

(4)尽量使用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)   由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如 Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer 是可变长的,它在原有基础上进行扩增,不会产生中间对象。

(5)能用基本类型如Int,Long,就不用Integer,Long对象   基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。什么情况下需要使用Integer?这个视具体情况而定,比如类型转换,如果要求整形能够方便的转换成字符串类型,那么如果是Integer i=30,则直接可以视同String str=i.toString();来进行类型转换,但是如果使用的是int i=30,则没有i.toString()方法。

(6)尽量少用静态对象变量   静态变量属于全局变量,不会被GC回收,它们会一直占用内存。

(7)分散对象创建或删除的时间   集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片, 从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC 的机会。

more-》http://blog.csdn.net/xuchuangfeng/article/details/51881595

JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区

进程和线程之间有什么不同?

一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。

为什么wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用?

当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

. 为什么Thread类的sleep()和yield()方法是静态的?

Thread类的sleep()和yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。

什么是ThreadLocal?

ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。

每个线程都会拥有他们自己的Thread变量,它们可以使用get()\set()方法去获取他们的默认值或者在线程内部改变他们的值。ThreadLocal实例通常是希望它们同线程状态关联起来是private static属性。在ThreadLocal例子这篇文章中你可以看到一个关于ThreadLocal的小程序。

more->http://blog.csdn.net/dreamthen/article/details/26685725

你了解哪些设计模式

单例模式有哪些实现方式 ?

zhoupj commented 7 years ago

javascript

body中的onload()函数和jQuery中的document.ready()有什么区别?

onload()和document.ready()的区别有以下两点:

1、我们可以在页面中使用多个document.ready(),但只能使用一次onload()。 2、document.ready()函数在页面DOM元素加载完以后就会被调用,而onload()函数则要在所有的关联资源(包括图像、音频)加载完毕后才会调用。

Jquery中有哪几种类型的选择器?

从我自己的角度来讲,可以有3种类型的选择器,如下:

1、基本选择器:直接根据id、css类名、元素名返回匹配的dom元素。 2、层次选择器:也叫做路径选择器,可以根据路径层次来选择相应的DOM元素。 3、过滤选择器:在前面的基础上过滤相关条件,得到匹配的dom元素。

ajax是什么以及有哪些优点和缺点呢?

AJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。 Ajax包含下列技术: 基于web标准(standards-basedpresentation)XHTML+CSS的表示; 使用 DOM(Document ObjectModel)进行动态显示及交互; 使用 XML 和 XSLT 进行数据交换及相关操作; 使用 XMLHttpRequest 进行异步数据查询、检索; 使用 JavaScript 将所有的东西绑定在一起。

Ajax应用程序的优势在于:

  1. 通过异步模式,提升了用户体验
  2. 局部刷新,优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

jquery中$.get()提交和$.post()提交有区别吗?

答: 1 $.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。 2 get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。 3 get方式传输的数据大小不能超过2KB 而POST要大的多 4 GET 方式请求的数据会被浏览器缓存起来,因此有安全问题

ajax如何实现跨域请求 ?,jsonp原理?

http://www.qixing318.com/article/simply-describe-the-difference-between-json-with-json-as-well-as-the-actual-combat.html

javascript.null和undefined的区别?

null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。 undefined: (1)变量被声明了,但没有赋值时,就等于undefined。 (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。 (3)对象没有赋值的属性,该属性的值为undefined。 (4)函数没有返回值时,默认返回undefined。 null: (1) 作为函数的参数,表示该函数的参数不是对象。 (2) 作为对象原型链的终点。

行内元素有哪些?块级元素有哪些?CSS的盒模型?

块级元素:div p h1 h2 h3 h4 form ul 行内元素: a b br i span input select Css盒模型:内容,border ,margin,padding

javascript的typeof返回哪些数据类型

Object number function boolean underfind;

js 闭包 理解

闭包就是能够读取其他函数内部变量的函数。

谈谈This对象的理解。

this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。 但是有一个总原则,那就是this指的是调用函数的那个对象。 this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象

escape()、encodeURI()、encodeURIComponent()区别详解

http://www.cnblogs.com/tylerdonet/p/3483836.html

encodeURIComponent/encodeURI 前端编码后,后台出现乱码改如何解决

解决方法一:

JavaScript:

window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext));

Java:

searchtext=java.NET.URLDecoder.decode(searchtext,"UTF-8");

为什么要两次编码的原因:后台java代码给searchtext赋值的时候,本身已经使用了一次解码,不过解码的结果依然不对。所以我们可以在页面上进行两次编码操作,这样后台自动的那次就可以抵消掉一次,然后在使用searchtext=java.Net.URLDecoder.decode(searchtext,"UTF-8");进行一次解码就好了。

解决方法二:

另外还有一种方法是JavaScript进行一次编码,后台java处理时换种想法就好了:

java代码:

String s = new String(request.getParameter("name").getBytes("ISO8859-1"), "UTF-8");

zhoupj commented 7 years ago

你看过哪些后端的书?

你看过哪些前端的书?

你期望着什么样的工作?

你有什么问题问我?

zhoupj commented 7 years ago

Mysql

数据库事务

事务的:原子性、一致性、隔离性、持久性

数据库隔离级别

事务隔离级别(transaction isolation levels):隔离级别就是对对事务并发控制的等级。ANSI/ ISO SQL将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE READ)、读已提交(READ COMMITED)、读未提交(READ UNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。 串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。 可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。 读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。 读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。

mysql 分页写法,数据量大的时候如何优化?

limit, 子select。 索引,

mysql存储引擎有哪些?如何修改mysql存储引擎?

MyISAM indexed sequential access method (有索引的顺序访问方法) MyISAM 具有检查和修复表格的大多数工具。表格可以被压缩,而且支持全文收索 不是事务安全的,而且不支持外键。 MEMORY 也是以前的(HEAP) 该类型表存储在内存中,表的索引是哈希分布的。 merge 这些表为了查询目的,把myisam 表集合作为单个表,因此你可以在某些操作系统中避开最大文件大小的限制。 archive 这种类型的表只支持,insert ,select 不支持delete,update,replace ,不使用索引。 csv 这些表保存在服务器的单个文件中,它包含了用逗号间隔的数据。

innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,比myisam慢。 修改mysql存储引擎alter table tablename type = innodb;

SQL语句如何优化

1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3)很多时候用 exists 代替 in 是一个好的选择 4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤

MySQL原生支持的备份方式有哪些,并说出其优缺点?

(1) 直接拷贝数据文件,必须是MyISAM表,且使用flush tables with read lock;语句,优点是简单方便,缺点是须要锁写,且只能在同版本的MySQL上恢复使用 (2) mysqldump,导出的是SQL语句,所以可以跨版本恢复,但是需要导入数据和重建索引,恢复用时会较长,如果是MyISAM表,同样需要锁表,如果是InnoDB表,可以使用--single-transaction参数避免此问题

在创建和使用索引时,有哪些要注意的地方,有什么规则?

避免索引过多,会影响写性能 给筛选效果低的字段加索引,几乎无效,如性别、状态标志等 每条查询执行时,只会使用一个索引,有需要时应该创建复合索引 复合索引使用时遵守“从左到右”原则,严禁左百分号 不要在索引字段上有运算操作和使用函数,将无法使用索引

如何分析一条SQL语句的执行性能,关注哪些信息?

不论性能如何,不要有子查询和嵌套SQL,尽量不要有join查询 使用explain命令,观察type列,可以知道是否是全表扫描,和索引的使用形式,观察key可以知道使用了哪个索引,观察key_len可以知道索引是否使用完成,观察rows可以知道扫描的行数是否过多,观察extra可以知道是否使用了临时表和进行了额外的排序操作

复合索引的使用问题

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

两个或更多个列上的索引被称作复合索引。 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。 所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。 如:建立 姓名、年龄、性别的复合索引。

create table test( a int, b int, c int, KEY a(a,b,c) );

优: select from test where a=10 and b>50 差: select from test where a50

优: select from test order by a 差: select from test order by b 差: select * from test order by c

优: select from test where a=10 order by a 优: select from test where a=10 order by b 差: select * from test where a=10 order by c

优: select from test where a>10 order by a 差: select from test where a>10 order by b 差: select * from test where a>10 order by c

优: select from test where a=10 and b=10 order by a 优: select from test where a=10 and b=10 order by b 优: select * from test where a=10 and b=10 order by c

优: select from test where a=10 and b=10 order by a 优: select from test where a=10 and b>10 order by b 差: select * from test where a=10 and b>10 order by c

binlog 与redo log 区别

1、首先2者都是记录数据的改变,不同的是,binlog是记录所有数据的改变信息,而innodb的redo log只是记录所有innodb表数据的变化。 2、binlog是记录已经提交完毕之后的dml以及ddl sql语句,而innodb redo log是正在执行中的dml以及ddl语句 3、binlog可以作为恢复数据使用 redo log可以作为异常down机或者介质故障后的数据恢复使用 4、在db文件目录下,也分属于不通的日志文件中。

innodb_flush_log_at_trx_commit和sync_binlog参数详解

http://blog.csdn.net/thundermeng/article/details/50448614

binlog,redo log,undo log区别 http://blog.csdn.net/xhjcehust/article/details/52551188

zhoupj commented 7 years ago

MVN

Maven有哪些优点和缺点

优点如下: 简化了项目依赖管理: 易于上手,对于新手可能一个”mvn clean package”命令就可能满足他的工作 便于与持续集成工具(jenkins)整合 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。 maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等 缺点如下:

maven是一个庞大的构建系统,学习难度大 maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。

Maven坐标

一般maven使用[groupID,artifactId,version,packaging]来表示一个项目的某个版本,有时还会使用classifier来表示项目的附属构建,常见的附属构建有javadoc和sources包。

Maven常见的依赖范围有哪些?

compile:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。 test:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。 provided:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。 runtime:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。 system: 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。 import: 用于一个dependencyManagement对另一个dependencyManagement的继承。

Maven的生命周期

maven有三套生命周期,分别为:

1、clean 周期:主要用于清理上一次构建产生的文件,可以理解为删除target目录 2、默认周期,主要阶段包含:

process-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中, compile 编译src/main/java下的java文件,产生对应的class, process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中, test-compile 编译src/test/java下的java文件,产生对应的class, test 运行测试用例, package 打包构件,即生成对应的jar, war等, install将构件部署到本地仓库, deploy 部署构件到远程仓库

3、site周期

主要阶段包含

site 产生项目的站点文档 site-deploy 将项目的站点文档部署到服务器 五、我们经常使用“Mvn Clean Package”命令进行项目打包,请问该命令执行了哪些动作来完成该任务? 在这个命令中我们调用了maven的clean周期的clean阶段绑定的插件任务,以及default周期的package阶段绑定的插件任务 默认执行的任务有(maven的术语叫goal, 也有人翻译成目标,我这里用任务啦):

maven-clean-plugin:clean-> maven-resources-plugin:resources-> maven-compile-plugin:compile-> mavne-resources-plugin:testResources-> maven-compile-plugin:testCompile-> maven-jar-plugin:jar

依赖的解析机制

解析发布版本:如果本地有,直接使用本地的,没有就向远程仓库请求。 解析快照版本:合并本地和远程仓库的元数据文件-groupId/artifactId/version/maven-metadata.xml,这个文件存的版本都是带时间戳的,将最新的一个改名为不带时间戳的格式供本次编译使用。 解析版本为LATEST,RELEASE,过于复杂,且解析的结果不稳定, 不推荐在项目中使用,感兴趣的同学自己去研究,简而言之就是合并groupId/artifactId/maven-metadata.xml找到对应的最新版本和包含快照的最新版本。

插件的解析机制

当我们输入”mvn dependency:tree”这样的指令,解析的步骤为: 解析groupID:maven使用默认的groupID:”org.apache.maven.plugins”或者”org.codehaus.mojo” 解析artifactId(maven的官方叫做插件前缀解析策略) 合并该groupId在所有仓库中的元数据库文件(maven-metadata-repository.xml),比如maven官方插件的元数据文件所在的目录为orgapachemavenplugins,该文件下有如下的条目

Maven Dependency Plugin dependency maven-dependency-plugin

通过比较这样的条目,我们就将该命令的artifactId解析为maven-dependency-plugin 解析version 如果你在项目的pom中声明了该插件的版本,那么直接使用该版本的插件,否则合并所有仓库中groupId/artifactId/maven-metadata-repository.xml,找到最新的发布版本。

对于非官方的插件,有如下两个方法可以选择: 1)使用groupId:artifactId:version:goal 来运行,好长~~ 2)在Settings.xml中添加pluginGroup项,这样maven不能在官方的插件库中解析到某个插件,那么就可以去你配置的group下查找啦。

多模块如何聚合

配置一个打包类型为pom的聚合模块,然后在该pom中使用元素声明要聚合的模块

对于一个多模块项目,如果管理项目依赖的版本

通过在父模块中声明dependencyManagement和pluginManagement, 然后让子模块通过元素指定父模块,这样子模块在定义依赖是就可以只定义groupId和artifactId,自动使用父模块的version,这样统一整个项目的依赖的版本。

一个项目的依赖来源于不同的组织,可能这些依赖还会依赖别的Jar包,如何保证这些传递依赖不会引起版本冲突。

使用<dependency&gt的元素将会引起冲突的元素排除。

常见的Maven私服的仓库类型。

(宿主仓库)hosted repository, (代理仓库)proxy repository, (仓库组)group repository

如何查询一个插件有哪些目标(Goal)

mvn help:describe -Dplugin=groupId:artifactId

zhoupj commented 7 years ago

mybatis

什么是ORM?

答:对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。

mybatis 和hibernate 区别

IBatis和MyBatis在细节上的不同有哪些

在sql里面变量命名有原来的#变量# 变成了#{变量}
原来的$变量$变成了${变量}, 原来在sql节点里面的class都换名字交type 原来的queryForObject queryForList 变成了selectOne selectList
原来的别名设置在映射文件里面放在了核心配置文件里

讲下MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存, 一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的, 使用二级缓存属性类需要实现Serializable序列化接 口(可用来保存对象的状态),可在它的映射文件中配置