一、JAVA基础
1. 列出JAVA中所有基本数据类型,并说明这些数据类型占用的字节数??
答案:
java的原始数据类型,也可以叫java的基本数据类型,一共就8个,分别是:byte、short、int、long、boolean、char、float、double
byte 1个字节
boolean 1个字节
char 2个字节
short 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
2.continue和 break有什么区别?
答案:
break和continue都是用来控制循环结构的。
- break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
- continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
- 区别:continue只终止本次循环,break则完全终止循环
3.i++和++i的区别?
- i++ 理解为:先用i值后加1, 比如int j=i++; 如果i的初值是1,那么表达式i++的整体值就是1,然后,i的值就变成了2,最后执行赋值运算,将i++整体的值1,赋值给j,j为1。
- ++i 理解为:先加1后用i值,比如int j=++i;如果i的初值是1,首先i增加1为2,然后用i的值2最为++i整体表达式的值,最后进行赋值运算,将++i表达式的值2赋值给j,j为2。
注意:这两个表达式在计算时,=号赋值计算,都是最后发生的,是非常常见的考点。
二、OOP
1.面向对象的特征有哪些方面?
答案:三大特性是:封装,继承,多态
- 所谓封装,也就是把客观事物抽象封装成类。封装是面向对象的特征之一。
- 简单的说,一个类就是一个封装了数据以及操作这些数据的算法。
- 对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
- 所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。
- 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
- 子类是对父类功能的扩展
- 实际开发中父类往往是从子类泛化而来,父类中的属性和方法是从子类中抽象来的。
- 所谓多态就是指一个父类具体子类实例的相同方法执行出不同表现。
- 多态机制使具有不同对象可以共享相同的外部接口方法。
- 这意味着,可以通过相同的方式调用具体对象功能不同方法。
2.静态变量和实例变量的区别?
答案:
- 在语法定义上的区别:
- 静态变量前要加static 关键字,而实例变量前则不加。
- 在程序运行时的区别:
- 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量。
- 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
3.Overload(重载)和Override(重写)的区别?
答案:
- 重写必须继承,重载不用。
- 重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
- 重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
- 重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常
4.多态的表现形式有哪些?
答案:重写和重载。向上造型
5.abstract class和interface有什么区别?
答案:
- 含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。
- abstract class类中定义抽象方法必须在具体子类中实现。
- 如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
- 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
6.接口是否可以继承接口?抽象类是否可以实现(implements)接口? 抽象类是否可以继承具体类?
答案:
- 接口可以继承接口,可以继承多个接口
- 抽象类可以实现接口,可以实现多个接口
- 抽象类可以继承具体类,但只能继承一个类
抽象类和接口的区别有哪些?
-
抽象类中可以没有抽象方法;接口中的方法必须是抽象方法;
-
抽象类中可以有普通的成员变量;接口中的变量必须是 static final 类型的,必须被初始化,接口中只有常量,没有变量。
-
抽象类只能单继承,接口可以继承多个父接口;
-
Java 8 中接口中会有 default 方法,即方法可以被实现。
面试官:抽象类和接口如何选择?
- 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。
- 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。
7.GC是什么?GC的作用
答案:
- GC是垃圾收集的意思
- Java提供的GC功能可以自动监测回收不被引用的对象,释放其占用的内存,
- 垃圾收集器会自动进行管理。
- 如果要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),这些方法会通知GC尽快进行内存垃圾回收。
- 在对象使用以后要及时释放其引用,有利于垃圾回收,可以有效的防止内存泄露。
三、JAVASE
0. Array 和 ArrayList 有什么区别?什么时候该应 Array 而不是 ArrayList 呢?
答:它们的区别是:
- Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
- Array 大小是固定的,ArrayList 的大小是动态变化的。
- ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
1.说出ArrayList,LinkedList的储存性能和特性?
答案:
- ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除慢。
- LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取插入的速度快,而中部插入和读取慢.
2.HashMap 和 Hashtable 的区别
答案:
- 历史原因:Hashtable 是陈旧API,HashMap 是Java 1.2 引进的Map 接口的一个实现
- 同步性:Hashtable 是线程安全的,也就是说是同步的,而HashMap 是线程序不安全的,不是同步的。由于同步检查所以Hashtable性能稍慢。
- 值:HashMap 可以插入一个null的key-value
3.List、Map、Set三个接口,存取元素时,各有什么特点?
答案:
- List特点:元素有顺序,元素可重复
- Set特点:元素无顺序,元素不可重复(注意:元素虽然无顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
- Map特点:元素按键值对存储,无顺序
4.队列和栈是什么,列出它们的区别?
答案:
- 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
- 栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
- 队列先进先出(FIFO),栈先进后出(FILO)。
5.String与StringBuffer的区别,StringBuffer和StringBuilder的区别是什么?
答案:
- String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。
- 由于字符串链接会自动创建StringBuilder对象,为了避免复杂字符串拼接时候大量创建StringBuilder对象,可以利用StringBuilder优化字符串链接操作。
- StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
标签: String StringBuffer StringBuilder
6.String类能不能被继承,为什么?
答案:
不能被继承,因为String类是final类,final修饰的类是不能被继承
7.“==”和“equals”的区别
答案:
==
是值比较,对于引用类型变量==
是判断引用的值是否是同一个对象地址值,如果是相同对象其内容也一定是相同的- equals方法判断的是对象的内容是否相同,由于其默认方法采用的
==
进行引用比较,所以需要重写为按照对象内容比较是否相同。
8.HashSet 和 HashMap 区别?
答案:
- HashMap :实现Map接口;使用hash算法,里面的数据是无序的;并且存储的是键值对;
- HashSet :实现了Set接口;内部封装了HashMap,故也是无序的;HashSet本质就是HashMap,数据存储到HashSet的Key部分,Value部分被屏蔽不使用了。
10.描述栈,队列中元素的出入顺序。
答案:
- 栈的数据结构是,先进后出(FILO),也可以说是后进先出
- 队列的数据结构是,先进先出(FIFO)
11.Comparable和Comparator接口是干什么的?列出它们的区别。
答案:
- Comparable接口
- 实现Comparable接口类表示这个类型的对象可以进行比较大小的。 这种可以比较大小的对象可以进行自然排序。
- Comparator接口
- 比较器用于实现对象任意属性进行比较大小。
- 在排序时候可以通过指定属性比较器实现任意属性排序。
- 在排序时候Comparable接口用于进行自然排序,而Comparator接口进行自定义排序,自定义排序更加灵活方便而常用。
- 设计上Comparable不推荐使用,因为对程序本身具有侵入性。
12.Java中异常处理机制?
答案:
- Java异常是一个消息传播机制,如果不被处理将继续传播并且打断当前程序的执行。
- Java使用面向对象的方式来传播异常消息,发生的每个异常被封装到一个异常对象,该对象中包含有异常的信息。
- Java中使用try catch finally 语法捕获处理异常消息。
13.创建线程有几种不同的方式?
答案:
在应用开发中有三种方式可以用来创建线程:
- 继承Thread类,并且创建对象。
- 实现Runnable接口,将Runnable接口的具体对象作为参数创建Thread对象。
- 另外也可以使用Executer创建并重用线程
14.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
答案:
可以进入其他非synchronized的方法,synchronized的方法不可以的!
- Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor)
- 当一个线程访问对象的synchronized方法时,将在对象上锁,方法不能并发执行。
- 此时其他任何线程都得阻塞等待到当前线程方法执行结束后,才能有机会执行方法。
- 也就是说线程排到一个接着一个执行 synchronized的方法。
16.请描述TCP。
答案:
TCP是传送控制协议
- 是面向连接的可靠数据传输协议,TCP会确保数据会可靠的传输到对方.
- 使用步骤:先建立可靠连接—利用连接中的双向通讯流传输数据-----通讯结束以后,需要关闭连接.
- java利用Socket和ServerSocketAPI封装了TCP通讯过程,利用这两个类即可实现TCP通讯。
- HTTP通讯的底层是TCP协议。
17.java中多线程是什么?
答案:
- Java中并发运行多个流程的能力。每一个流程称为一个线程。
- Java的Thread API封装了线程控制过程。
- 创建线程对象后调用start方法就可以将线程提交到操作系统执行。
- 线程最终是由操作系统调度执行的。
线程池有了解吗?
答:java.util.concurrent.ThreadPoolExecutor 类就是一个线程池。客户端调用 ThreadPoolExecutor.submit(Runnable task) 提交任务,线程池内部维护的工作者线程的数量就是该线程池的线程池大小,有 3 种形态:
- 当前线程池大小 :表示线程池中实际工作者线程的数量;
- 最大线程池大小 (maxinumPoolSize):表示线程池中允许存在的工作者线程的数量上限;
- 核心线程大小 (corePoolSize ):表示一个不大于最大线程池大小的工作者线程数量上限。
- 如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队;
- 如果运行的线程等于或者多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不是添加新线程;
- 如果无法将请求加入队列,即队列已经满了,则创建新的线程,除非创建此线程超出 maxinumPoolSize, 在这种情况下,任务将被拒绝。
面试官:我们为什么要使用线程池?
答:
- 减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
- 可以根据系统的承受能力,调整线程池中工作线程的数目,放置因为消耗过多的内存,而把服务器累趴下(每个线程大约需要 1 MB 内存,线程开的越多,消耗的内存也就越大,最后死机)
18.线程进程的基本概念、线程的基本状态以及状态之间的关系
答案:
- 一个线程是进程的一个顺序执行流程。一个进程中的全部线程共享同一个堆空间。线程本身有一个供程序执行时的栈,一个进程中可以包含多个线程。
- 新建、就绪、运行状态、阻塞状态、死亡状态
- 新建状态:利用NEW运算创建了线程对象,此时线程状态为新建状态,调用了新建状态线程的start()方法,将线程提交给操作系统,准备执行,线程将进入到就绪状态。
- 就绪状态:由操作系统调度的一个线程,没有被系统分配到处理器上执行,一旦处理器有空闲,操作系统会将它放入处理器中执行,此时线程从就绪状态切换到运行时状态。
- 运行状态:线程正在运行的过程中,碰到调用Sleep()方法,或者等待IO完成,或等待其他同步方法完成时,线程将会从运行状态,进入到阻塞状态。
- 死亡状态:线程一旦脱离阻塞状态时,将重新回到就绪状态,重新向下执行,最终进入到死亡状态。一旦线程对象是死亡状态,就只能被GC回收,不能再被调用。
在 Java 中有以下 3 种方法可以终止正在运行的线程:
- 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。
- 使用 stop() 方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用。
- 使用 interrupt 方法中断线程。
sleep和wait的区别
- sleep是线程中的方法;但是wait是Object中的方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程。
- sleep方法不会释放锁(lock),但是wait会释放,而且会加入到等待队列中。
- sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
- sleep必须捕获异常,在 任何地方使用;wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用
sleep(1000)和wait(1000)的区别:
Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争。1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。
wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码。 如果锁被其他线程占用,则等待其他线程释放锁。
注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。
run() 方法和 start() 方法有什么区别?
答:start() 方法会新建一个线程并让这个线程执行 run() 方法;而直接调用 run() 方法只是作为一个普通的方法调用而已,它只会在当前线程中,串行执行 run() 中的代码。
19.XML解析技术有哪些?它们的区别是什么?
答案:
常见的有SAX,DOM,DOM4J
- SAX:SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。
- DOM:DOM的利用SAX进行读取的,读取以后缓存到内存中成为DOM对象,处理大型文件时内存耗用较高。
- DOM4J:由于DOM API使用过于繁琐,JAVA的开源组织开发了DOM4J,底层封装了DOM,提供JAVA Bean风格的API,使用非常简洁。
20.什么是节点流,什么是过滤流,并且说出常用的节点流和过滤流?
答案:
- 节点流:有明确的数据源,从数据源读取基础的字节数据,或向数据源写入字节数据。
- 过滤流:依赖于其他流,不能单独使用,并且都提供了高级功能,使用起来更加方便。
- FileInputStream FileOutputStram
- BufferedInputStream BufferedOutputStream
- ObjectInputStream ObjectOutputStream
21.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法?
答案:
- BufferedReader只能连接在其他字符流上,所以属于字符流,其底层需要依赖于其他的字符流,或者字节流。
- BufferedReader提供了字符缓冲功能,能够一定程度上的提升IO性能。
- 提供了经典的方法readLine()方法,可以从目标流中,读取一行文本。
22.字符流和字节流的区别?并且他们的父类叫什么?
答案:
- JAVA中最基本的流是字节流,任何流的底层都是字节流。
- 字符流是以字符为单位进行读写的流,大部分的实现类是高级流,其底层一定基于字节流,字符流在字节流基础之上,扩展了字符编码解码功能。
- 字节流的抽象父类:InputStream OutputStream
- 字符流的抽象父类:Reader Writer
23.什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?
答案:
- 对象序列化,将对象中的数据编码为字节序列的过程。
- 反序列化;将对象的编码字节重新反向解码为对象的过程。
- JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵守如下约定。
- 被序列化的对象类型需要实现序列化接口,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。
- 为了保持序列化过程的稳定,建议在类中添加序列化版本号。
- 不想让字段放在硬盘上就加transient
24.简述HashMap的工作原理?
答案:
- HashMap是面向查询优化的数据结构,查询性能优异。
- 在其内部利用数组存储数据。
- 插入数据时,先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查是否以存在重复的Key,如果不重复直接存储到数组中,如果重复就作为链表存储到散列桶中。
- 插入的数据和数组容量的比值大于加载因子则进行数组扩容,并重新散列,默认的加载因子为“0.75”。
- 查询时,先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查到Key的位置,如果找到返回Key对应的Value,否则返回Null。
- 由于利用Key的HashCode直接计算出数据的存储位置,由于直接确定数据的存储位置,相对于其他查找方式,查询效率非常高。
25.什么是反射机制?
Java 动态执行机制,可以实现动态执行功能:
- 反射提供了在运行时判断任意一个对象所属的类型,并可以检查解析类型的内部结构。
- 反射可以动态加载类型,并能够动态创建对象
- 反射可以动态访问对象的属性。
- 反射可以动态执行对象的方法。
- 利用反射API还可以动态的访问,不可见的属性和方法
26.哪里用到反射机制?
- JDBC中,利用反射动态加载了数据库驱动程序。
- Web服务器中利用反射调用了Sevlet的服务方法。
- Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
- 很多框架都用到反射机制,注入属性,调用方法,如Hibernate、Struts2、Spring。
27.反射机制的优缺点?
- 优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
- 缺点:对性能有影响,这类操作总是慢于直接执行java代码。
28. 讲一下三次握手,四次挥手
三次握手:
(tcp协议)在进行面向连接的数据传输前进行传输连接的过程
1.客户端向服务器发送连接请求(问是否可以连接)
2.服务器接收到连接请求进行确认,返回报文
3.客户端收到回复,进行连接建立
四次挥手:
在进行面向连接的数据传输时,断开连接的过程
1.主动方发送报文,告诉被动方要断开连接
2.被动方返回报文,告知收到请求,准备断开
3.被动方再次发送报文给主动方,告知准备完毕可以断开
4.主动方发送报文进行断开
29. io流把一个text文件的内容打印出来
inputStream = new FileInputStream(“D:/hello.java”); // 使用文件输入流读取文件数据(String 或 File对象)
fileInputStream = new InputStreamReader(inputStream); // 衔接字符流与字节流,将字节转字符
br = new BufferedReader(fileInputStream); // (缓冲字符输入流)------块读文本数据,按行读取str = br.readLine() // 返回一行字符串(不包括最后的换行符)
=====================================================================================
一、Web前端阶段
1. HTML是什么意思?
答案:
- 超文本标记语言
2. 什么是HTML5?
答案:
- HTML5是最新的HTML标准。
- HTML5 文档定义为:
- 新增多媒体标签: video audio
- 新标签 canvas header nav footer 等
3. 前端页面有哪三层构成,分别是什么?作用是什么?
答案:
- 结构层 Html 用于定义网页布局和显示内容
- 表示层 CSS 对html进行美化和修饰
- 行为层 js 对html和css动态交互和控制
4. CSS引入的方式有哪些?
答案:
- 内联 内部 外链
5. $(this)
和 this
关键字在 jQuery 中有何不同?
答案:
$(this)
返回值为当前 jQuery 对象,可以利用这个特点,实现连续的调用方法。this
代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的执行方法的当前对象,this不能调用 jQuery 方法
6. jQuery中 append() 和 appendTo() 方法的区别是什么?
答案:
- 都被用来向元素内部追加内容。
- append():向每个匹配的元素内部追加内容。
- appendTo():把所有匹配的元素追加到另一个指定的元素元素集合中。
7. 请描述$("#p")
,$(".p")
,("p")
分别选择到什么对象集合?
答案:
$("#p")
————#id id选择器, 选择id
为p
唯一的元素$(".p")
————.class 类选择器, 选择class
包含p
的一组元素$("p")
————elelment 元素选择器, 选择全部的<p>
元素, 是一组元素
8. JavaScript window.onload 事件和 jQuery ready 函数有何不同?
答案:
window.onload
要等待 DOM 被创建,还要等到包括大型图片、音频、视频在内的所有外部资源都完全加载。- jQuery
$(document).ready()
函数只需对 DOM 树的等待,而无需对图像或外部资源加载的等待,从而执行起来更快。 - 使用 jQuery
$(document).ready()
的另一个优势是你可以在网页里多次使用它,浏览器会按它们在 HTML 页面里出现的顺序执行它们
9. jQuery 里的 each() 是什么函数?你是如何使用它的?
答案:
- each() 函数就像是 Java 里的一个 Iterator,它允许你遍历一个元素集合。
- 可以遍历数组或者一组jquery选择的 dom 对象。
二、数据库阶段
1. 怎么优化数据库的查询?
答案:
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 应尽量避免在 where 子句中使用!=或<>操作符。
- 应尽量避免在 where 子句中对字段进行 null 值判断。
- 应尽量避免在 where 子句中使用 or 来连接条件。
- 下面的查询也将导致全表扫描:“select id from t where name like ‘%abc%’” 若要提高效率,可以考虑全文检索。
- in 和 not in 也要慎用,否则会导致全表扫描,很多时候用 exists 代替 in 是一个好的选择。
- 应尽量避免在 where 子句中对字段进行表达式操作。
- 应尽量避免在where子句中对字段进行函数操作。
2. 在数据库中条件查询速度很慢的时候,如何优化?
答案:
- 建索引
- 减少表之间的关联
- 优化sql,尽量让sql利用索引定位数据,不要让sql做全表查询
- 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
- 利用分页查询减少返回的数据量
3. 数据库中事务是什么,有哪些特性?
答案:
- 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序单元(unit)。
- 事务通常由SQL语言或编程语言发起并控制
- 特性:
- 事务是恢复和并发控制的基本单位。
- 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
4. sql语句关键词的执行顺序。
答案:
- FROM 子句, 组装来自不同数据源的数据
- WHERE 子句, 基于指定的条件对记录进行筛选
- GROUP BY 子句, 将数据划分为多个分组
- 使用聚合函数进行计算
- 使用 HAVING 子句筛选分组
- 计算所有的表达式
- 使用 ORDER BY 对结果集进行排序
5. 数据库有哪几种约束类型?
答案:
- 五种
- 主键约束 PRIMARY KEY
- 外键约束 FOREIGN KEY
- 唯一约束 UNIQUE
- 检查约束 CHECK
- 非空约束 NOT NULL
6. 简述数据库执行计划?
答案:
- SQL语句发送到数据库后需要翻译为执行计划,SQL语句到功能是利用执行计划执行实现的。
- 数据库在执行完全一样的SQL语句时候会重用相同的执行计划。
- 有 ?参数的SQL语言会重用相同的执行计划。
7.数据库建立索引常用的原则是什么?什么情况下不适合建立索引?
答案:
- 在大数据量的表上建立索引才有意义
- 在where子句或是连接条件上经常引用的列上建立索引
- 很少或从不引用的字段和逻辑型的字段,如男或女(是或否)等不要建立索引
三、JDBC阶段
1. 数据连接池的工作机制是什么? 有什么优点?
答案:
- J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
- 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
- 如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
- 当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
- 当链接数量达到连接池最大值时候,池驱动程序将不再创建新连接,只能等等连接空闲以后重用已有的连接。
优点:连接少的时候可以服用
2. 写出JDBC连接数据库的6个步骤?
答案:
- 注册驱动
- 获取连接
- 创建一个Statement语句对象
- 执行SQL语句
- 处理结果集
- 关闭资源
3. JDBC中的Statement 和PreparedStatement的区别?
答案:
- PreparedStatement 继承于 Statement
- Statement 一般用于执行固定的没有参数的SQL
- PreparedStatement 一般用于执行有?参数预编译的SQL语句。
- PreparedStatement支持?操作参数,相对于Statement更加灵活。
- PreparedStatement可以防止SQL注入,安全性高于Statement。
4. 表与表之间有哪些关联关系?
答案:
- 一对一(实际上是特殊的一对多)
- 一对多
- 多对多,需要中间关系表
5. JDBC中大数据量的分页解决方法?
答案:
- 利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。
=====================================================================================
框架阶段面试题
一、SSM
1. JDBC 跟 Mybatis的区别?
答案:
- Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
- Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
- MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
- JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。
2. 简述一下事务以及事务的特性?
答案:
- 事务:事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。
- 事务具有4个特性,缺一不可,即:ACID(原子性、一致性、隔离性和持久性)
- 原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
- 一致性:事务执行时,是从一个一致状态变成另一个一致状态。
- 隔离性:一个事务的执行,不受其他事务(进程)的干扰。
- 持久性:事务一旦提交,对数据库的改变是持久的。
3. 简述Spring事务配置过程?
答案:
- Spring提供了多种事务管理器,将事务的具体工作委托给底层的持久化机制来实现(一般是数据库)。
- Spring为不同的事务提供了一致的编程模型。
- 具体使用时,可以选择使用声明式或者编程式事务。
4. 简述Spring中BeanFactory和ApplicationContext作用?
答案:
- ApplicationContext 是 BeanFactory接口的子接口
- BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
- ApplicationContext是对BeanFactory的扩展,提供了更多的功能
- 国际化处理
- 事件传递
- Bean自动装配
- 各种不同应用层的Context实现
- 结论:开发中尽量使用ApplicationContext 就可以了
5. Spring框架的优点都有什么?
答案:
- 简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
- 解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。
- 支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。
- 集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
- 轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。
6. 构造器注入和 setter 依赖注入,那种方式更好?
答案:
- 每种方式都有它的缺点和优点。
- 构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。
- 如果使用 XML 来描述依赖,Setter 注入的可读写会更强。
- 经验法则是强制依赖使用构造器注入,可选依赖使用setter注入。
7. 依赖注入和工厂模式之间有什么不同?
答案:
- 虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工厂模式更清晰。
- 通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。
- 使用工厂模式,你的类需要通过工厂来获取
8. 列出IOC的3种主要注入方式?
答案:
- 构造方法注入;
- setter属性注入;
- 接口注入。
9. 简述Spring中常用的几种Advice注解?
答案:
- @Before:在方法执行前处理
- @AfterReturning:在方法正常执行后处理
- @AfterThrowing:在方法执行期间抛出异常时处理
- @After:在方法执行前后无论是否有异常也处理
- @Around:在方法前后进行处理
10. 什么是Spring 的AOP,AOP的工作原理是什么?
答案:
- 面向切面编程简称AOP
- Spring AOP 是使用动态代理在运行期间植入增强的功能代码。
- Spring的一个关键的组件就是AOP,其中最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。
- 允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强
11. 什么是IOC/DI,实现原理是什么?
答案:
- IOC Inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理。
- DI:Dependency Injection 依赖注入,指容器通过调用构造器或者set方法来建立对象之间的依赖关系。
12. 简述Spring中常用注解?
答案:
- @Component :标准一个普通的spring Bean类。
- @Repository:标注一个DAO组件类。
- @Service:标注一个业务逻辑组件类。
- @Controller:标注一个控制器组件类。
- @Resource:注入组件
13. 简述SpringMVC的请求流程?
答案:
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户
14. 简述什么是MVC?
答案:
- MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
- 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
- View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
- Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
15. 简单的说一下spring的生命周期?
答案:
- 实例化BeanFactoryPostProcessor实现类
- 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
- 实例化BeanPostProcessor实现类
- 实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
- 执行Bean的构造器
- 执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
- 为Bean注入属性
- 调用BeanNameAware的setBeanName方法
- 调用BeanFactoryAware的setBeanFactory方法
- 执行BeanPostProcessor的postProcessBeforeInitialization方法
- 调用InitializingBean的afterPropertiesSet方法
- 调用的init-method属性指定的初始化方法
- 执行BeanPostProcessor的postProcessAfterInitialization方法
- 执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法
- 容器初始化成功,执行正常调用后,下面销毁容器
- 调用DiposibleBean的destory方法
- 调用的destroy-method属性指定的初始化方法
16. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
答案:
- ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
- ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现
- 开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
17. Spring里面applicationContext.xml文件能不能改成其他文件名?
答案:
- ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。
- 缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。
- 你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置。
18. SpringMVC如何解决线程安全性问题?
答案:
- SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例,从而有可能产生线程安全问题。
- 因此尽量避免在Controller中使用实例变量
- 使用ThreadLocal变量。
19. 什么是事务传播?
答案:
- 事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
20. 介绍一下Spring的事物管理
答案:
- 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
- 开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
- spring提供了几个关于事务处理的类:
- TransactionDefinition //事务属性定义
- TranscationStatus //代表了当前的事务,可以提交,回滚。
- PlatformTransactionManager这个是spring提供的用于管理事务的基础接口。
21. 解释一下Spring AOP里面的几个名词
答案:
- 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
- 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
- 通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
- 切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
- 引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
- 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
- AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
- 织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
22. SpringMVC如何实现文件上载步骤?
- RFC1867 规定了HTTP文件上载协议
- 客户端
- form标签中使用属性 ENCTYPE=“multipart/form-data” METHOD=POST
- 使用 input type=file 标签选择文件
- 服务器端
- 导入commons-fileupload 组件
- 配置文件上载处理器
- 在控制器方法声明MultipartFile 类型变量接收上载文件。
23. SpringMVC如何实现Excel文件下载?
- 利用 Apache POI API生成Excel
- 在控制器中设置 ContentType 为Excel文件类型
- 在控制器中设置 Content-Disposition 设定下载文件名
24. Spring和SpringMVC的区别
- Spring是轻量级的IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。
- Spring他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
- Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc是其中一个开源项目。
二、AJAX
1. 什么是Ajax?
答案:
- Ajax的全称是Asychronous JavaScript And XML(异步JavaScript和XML);
- 是一种用来改善用户体验的技术,其实质是利用浏览器内置的一种特殊对象(即ajax对象)异步地向服务器发送请求,服务器返回部分数据,浏览器利用这些数据修改当前页面,整个过程页面无刷新,不打断用户的请求。
2. 请谈一下Ajax的优点?
答案:
- 通过异步模式,提升了用户体验
- 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
- Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
- Ajax可以实现动态不刷新(局部刷新)
3. 简要描述Ajax应用的工作流程。
答案:
- 在基于Ajax的Web程序中,在用户行为和服务器端多了一层Ajax引擎,它负责处理用户的行为,并转化为对服务器的请求。
- 同时它接收服务器端的返回信息,经过处理后显示给用户。
- 由于Ajax在后台以异步的方式的工作,用户无需等待服务器的处理,可以进行并发工作,这就在用户界面层次中更为接近了CS架构的客户端平台。
4. Ajax包括哪些关键技术?
答案:
- JavaScript脚本语言;
- 可扩展标记语言(XML);
- 文档对象模型(DOM);
- 级联样式表(CSS);
- XMLHttpRequest对象。
5. 常用的Ajax框架有哪些?
答案:
- WebORB for Java,Echo 2
- DWR,SWATO
- The AJAX JSP Tag Library
- The Ajax-JSF
6. Ajax的核心对象是什么?
答案:
- Ajax的核心对象是XMLHttpRequest对象。
7. 请写出创建XMLHttpRequest对象的javascript函数?
答案:
function createXmlHttpRequest(){
if(window.ActiveXObject){
return new ActiveXObject(“Microsoft.XMLHTTP”);
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
}
三、综合题目
1. 常用的设计模式有哪些,简单描述下其应用场景?
答案:
- 单例模式。
- 单例模式是一种常用的软件设计模式。
- 在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
- 应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
- 工厂模式。
- 工厂模式主要是为创建对象提供了接口。
- 应用场景如下:
- 在编码时不能预见需要创建哪种类的实例。
- 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
- 策略模式。
- 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
- 应用场景如下。
- 一件事情,有很多方案可以实现。
- 我可以在任何时候,决定采用哪一种实现。
- 未来可能增加更多的方案。
- 策略模式让方案的变化不会影响到使用方案的客户。
- 观察者模式。
- 观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
- 应用场景如下:
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
- 迭代器模式。
- 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
- 应用场景如下:
- 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
- 模板方法模式。
- 模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
- 应用场景如下:
- 对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。
2. 对象分配规则?(GC算法)
答:
- 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
- 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
- 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
- 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
- 空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。