前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最全面试宝典-我的春招总结

最全面试宝典-我的春招总结

作者头像
用户7557625
发布2020-07-15 10:26:57
8190
发布2020-07-15 10:26:57
举报

今年上半年经过接近俩个月的紧张面试,终于拿到了满意的offer。春招竞争之难,超乎我的想象。所以劝告各位学弟学妹,一定要把握秋招。俩个月里,基本上面的都是一些大厂以及大一点的公司,笔试面试题也有不少重复,所以就把所以内容总结成一份面试宝典,基本上面试问的技术点八九不离十了,希望可以给大家带来帮助。当然,这些内容主要还是面向校招,对应届生帮助还是非常非常大的,对社招也有很大帮助,因为工作几年以后基础知识肯定已经很多记不清了。内容有点多,希望大家耐心看完,受益匪浅,基本上涵盖所以知识点。

Java基本知识:

1 Java数据类型分为基本数据类型和引 用数据类型

Java的8种基本数据类型包括:byte、int、short、long、float、double、char、boolean。

1字节:byte boolean

2字节:short char

4字节:int float

8字节:long double

自动转换:从下到上

byte→short(char)→int→long→float→double

强制转换:从上到下 (必须 手写代码, 而且会造成精度损失)

double→float→long→int→short(char)→byte

3种引 用数据类型:类、接 口、数组

2 Java是 面向对象的语 言,具有三 大特点:继承,封装和多态

继承:继承是为了了实现代码的复 用,通过extends关键字来实现,每个 子类只有 一个 父类。

封装:封装是指将对象的状态信息隐藏在对象内部,不不允许外部程序直接访问对象内部信息, 而是通过类所提供的 方法来实现对内部信息的操作和访问。(好处就是 用户不不必关 心类是怎么实现的,只需要知道 方法的调 用信息就可以了了,提 高了了代码的维护性)多态: 一个 子类继承了了 父类并且重写了了 父类中的 方法,当 子类对象和 父类对象调 用这个 方法时会产 生不不同的 行行为。(好处就是每个 子类都可以按 自 己的需要重写 父类中的 方法)

3 抽象类的意义?抽象类与接 口的不不同?

抽象类 用来构造 一组 行行为的抽象描述,通过具体的派 生类来实现抽象 方法。使 用抽象类有利利于代码的维护和重 用。

接 口的好处:接 口是 一组功能的规范和标准,通过接 口实现类来实现具体的功能,可以降低代码的耦合性,提 高代码的可维护性,当系统功能变化时,只需要修改接 口实现类就 行行了了。

一个类只能继承 一个抽象类,可以实现多个接 口;

抽象类可以包含具体的 方法,接 口中的所有 方法都是抽象的;

抽象类中可以声明和使 用字段, 而接 口不不能,但可以创建静态的final常量量;

4 自动装箱和 自动拆箱?

自动装箱就是Java编译器 把基本数据类型转化为对应的数据包装类

自动拆箱就是Java编译器 把基本数据类型的包装类转化为对应的基本数据类型

5 方法的重载与重写?

重写是 子类对 父类中可以访问的 方法重新编写, 返回值类型和形参都不不能改变。

重写的好处是 子类可以根据需要,定义属于 自 己的 行行为。重写的 方法不不能抛出 比被重写的 方法更更加宽泛的异常,权限修饰符不不能 比被重写的 方法权限更更 大。

重载是指在 一个类 里里 面,使 用相同的 方法名和不不同的参数列列表重新编写 一个 方法,最常 用的地 方就是构造器 的重载。

6 equals与==的区别?

equals 比较的是引 用对象的值,== 比较的是引 用对象的内存地址。

&与&&的区别?

&和&&都是逻辑运算符号,&& 又叫短路路运算符

&不不管前 面的条件是否正确,后 面都执 行行

&&前 面条件正确时,才执 行行后 面,不不正确时,就不不执 行行js中与=的区别?

==值相等返回true ===值和类型必须相等

7 final,finally,finalize的区别?

final是 一个修饰符,修饰变量量时必须要初始化变量量,在以后的引 用中只能读,不不能修

改;修饰 方法时表示这个 方法可以被重载,但不不能重写。修饰类时表示这个类不不能再派

生出新的 子类。

finally 用于异常处理理时使 用finally修饰的代码块来执 行行清除操作,不不管try修饰的代码块抛

不不抛出异常,finally代码块总会执 行行

finalize是 方法名。finalize 方法是Java提供的在垃圾回收器 清理理对象之前执 行行的, 用来整

理理资源或执 行行其它清除操作。

8 static修饰符的 用法?

static修饰变量量时表示这个变量量是静态变量量,在内存中只有 一个复制,只要静态变量量所在

的类被加载,这个静态变量量就会被分配空间,就可以通过类.静态变量量和对象.静态变量量来

访问了了。静态变量量可以继承。

static修饰 方法时表示这个 方法是静态 方法,不不需要创建对象就可以被调 用,静态 方法可

以被继承,但不不能重写。

static修饰类时只能修饰内部类,这个类不不依赖于外部类,可直接使 用。

9 StringBuffer和String的区别?为什什么StringBuffer拼接 比String快?StringBuffer值可以改变,String值不不能改变 StringBuffer创建对象只能使 用new来初始化,String创建对象可以使 用new,也可以直接

String字符串串的修改拼接,实际上原理理是创建了了 一个StringBuffer,调 用了了StringBuffer的

append 方法,然后调 用了了toString 方法。

StringBuffer是线程安全的, 而StringBuiler不不是线程安全的,StringBuffer的 方法都是线

程同步的, 而StringBuiler的不不是。

执 行行效率: StringBuiler>StringBuffer>String

10 使 用System.out.println(a)打印 一个对象时会输出什什么?

如果这个对象所属的类没有重写toString 方法,就默认执 行行Object类的toString 方法,输出 类名+@+hashCode值,hashCode值是根据这个对象的内存地址通过哈希算法得到的。

如果这个对象所属的类重写了了toString 方法,就输出这个toString 方法的返回值。

11 500个i++怎么实现原 子操作(线程安全)?

i++不不是原 子操作,是线程不不安全的,它分为以下3步:

1.获取i的值

2.执 行行i+1的操作

3.将结果赋值给i

其次就算变量量已经使 用volatile关键字来修饰,只能保证读取全局变量量num值的时候从主

存拿到的是最新的值。但是当多个线程同时操作 自加的时候,如果之前取到的是同 一个

值,再 自加后得到的值是相同的。

解决办法:

1.可以使 用synchronize关键字进 行行同步操作,这种情况需要把volatile去掉。因为synchronize本身就会操作 工作内存和主内存直接的数据同步,此 方式不不再赘述。

2.将i++更更改为线程安全的原 子性操作,使 用AtomicInteger替代i++。就是java.util.concurrent.atomic包中的类AtomicInteger。

12 jdk1.8与jdk1.7的变化?

1 ConcurrentHashMap在1.8做的改进?

取消segments字段,使 用table数组元素作为锁,实现了了对每 一 行行数据进 行行加锁。

将原先table数组+单向链表的数据结构,变更更为table数组+单向链表+红 黑树的结构。 2 HashMap在1.8做的改进?

1.7 里里使 用数组加链表的结构进 行行数据存储,每个数组元素是 一个链表;1.8 里里加 入了了红 黑树结构,当链表 长度超过8时就将链表替换成红 黑树结构。

3 jdk1.8的新特性?

允许给接 口添加 一个 非抽象 方法,需要 用default关键字修饰。

对HashMap和ConcurrentHashMap做了了增强。

13 C 语 言有goto关键字,Java中没有。

14 栈溢出:java.lang.StackOverflowError

15 内存溢出(memory overflow):程序运 行行过程中 无法申请到 足够的内存 而导致的 一种错误。垃圾回收后,仍然 无内存空间容纳新的Java对象的情况。

内存泄露露(memory leak):内存申请后, 用完没有释放,造成可 用内存越来越少,从 而降

低性能。即被分配的对象可达但已 无 用。

加载的类太多的话会引起 方法区内存溢出。

16 Java内存哪些是数据共享的?堆区和 方法区

17 Java的四种引 用?

强引用 弱引用 虚引用 软引用

18 json与xml的区别?

json与xml都是 一种数据交互格式,都使 用unicode编码

xml采 用树形结构来进 行行数据的交互,通 用性 比较好,但解析起来 比较麻烦。

json使 用键值对的形式来进 行行数据的交互,解析起来 比较简单,传输速度 比较快,但是通 用性没有xml好。

(通 用性是指容易易与其它系统进 行行远程交互,数据共享 比较 方便便)

19 IP地址的格式? D类地址称为 广播地址,供特殊协议向选定的节点发送信息时 用E类地址保留留给将来使 用。

网络号全0表示保留留地址,意思是本 网络。

主机号为全0是本 网络地址,全1是当前 子 网的 广播地址。

的最 大整数值,当 用户添加成功后,再从学号池中移除这个学号,如果管理理员没有添加成功就断开连接的话,在监听器 里里会检测到这个学号还存在,就会将这个学号的标志位设为失效的,以后的管理理员想添加学 生的话,会先使 用学号池中失效的学号。

21 浅拷 贝与深拷 贝?

浅拷 贝只是对指针的拷 贝,拷 贝后两个指针指向同 一个内存空间,深拷 贝不不但对指针进 行行拷 贝, 而且对指针指向的内容进 行行拷 贝,经深拷 贝后的指针是指向两个不不同地址的指针。

浅拷 贝会造成内存泄漏漏,因为程序结束时对同 一个内存空间释放了了两次。

22 c语 言 里里的野指针?(空指针可以通过是否指向null判断,野指针不不可以)

野指针是指 一个指针指向已删除的对象或者指向没有访问权限的内存空间,造成原因是指针变量量未初始化,指针释放后之后未置空,指针操作的变量量超过作 用域。

Java内存相关:

1 Java内存区:

五 大区:堆区,JAVA栈区,本地 方法栈区, 方法区,程序寄存器 区堆区存放new出来的对象,释放都由垃圾回收器 回收 方法区存静态变量量和静态 方法

PC寄存器 存储当前要执 行行的指令

Java栈存放 方法调 用信息

本地 方法栈存放 方法的局部变量量

2 堆和栈的区别?

堆空间可以由程序员进 行行分配和释放,存放new出来的对象。栈空间由编译器 自动分配和释放,存放参数或局部变量量等。

3 类加载器

类加载器 负责将class 文件加载到内存中,并 生成对应的class对象。

类加载器 有:根类加载器 ,扩展类加载器 ,系统类加载器 。继承系统加载器 自定义类加载器 。

4 说 一下java中的内存泄漏漏?

内存泄漏漏产 生的原因是申请了了内存空间 而忘记了了释放。就 比如 一个不不再被使 用的对象 一直占据着内存空间,因为这个对象存在引 用,所以垃圾回收器 无法清理理,就造成了了内存泄漏漏。

解决办法就是把没有 用的对象设为null,当 方法执 行行完毕后,这些引 用就会被垃圾回收器 清理理。垃圾回收器 只能解决部分的内存泄漏漏,要解决内存泄漏漏需要有专业的 工具,这些专业 工具从JVM中获得内存信息的 方法有两种:JVM TI和字节码技术。

5 GC垃圾回收器 的流程

当 一个新对象产 生时,需要在JVM内存中的堆区申请 一个空间,堆内存 又划分为四个区,伊甸园区,存活区, 老老年年代区和元空间区。GC流程就是 首先判断伊甸园区是否有空间,有的话就把对象保存在伊甸园区,如果伊甸园区空间不不 足的话,执 行行Minor GC操作进 行行内存清理理,执 行行过后空间还是不不 足的话就判断存活区是否有空间,有的话就把伊甸园区的部分活跃对象放在存活区,然后判断伊甸园区是否有空间,有的话把对象放在伊甸园区,如果还没有空间的话就判断 老老年年代区有没有空间,有就存在 老老年年代区中,没有的话就执 行行Major GC进 行行内存清理理,清理理之后还没有空间的话就产 生OOM异常。

6 GC垃圾回收器 算法?

引 用计数器 算法:有对象引 用就加1,失去引 用就减1,如果为0就回收

可达性分析算法:从GC roots为根节点开始遍历,标记被遍历到的对象,没有被标记的

就代表可以回收的。

标记-清除算法

标记-压缩算法

复制算法

7 JVM参数

Xms 初始堆 大 小 默认值是物理理地址的1/64

Xmx 最 大堆 大 小 默认值是物理理地址的1/4

Xmn 年年轻代 大 小

默认空余堆(可以调整)内存 小于40%时,JVM就会增 大堆直到Xmx的最 大限制,默认空余堆内存 大于70%时,JVM会减少堆直到 Xms的最 小限制

集合相关:

1 说 一下集合?(java.util包 里里)

Java中的集合类主要 用来保存数据,通过Collection接 口和Map接 口派 生出来的。collection接 口下 面有三个 子类接 口List,Set和Queue,常 用的实现类有ArrayList,LinkedList,HashSet,Stack等。Map接 口派 生出来的集合类 用来存储具有KV模式的键值对,常 用的实现类有HashMap,Hashtable。

2 HashSet实现原理理?(线程不不安全,元素值可以是null)

HashSet集合存 入 一个元素时, 首先调 用这个对象的hashCode() 方法来得到该对象的hashCode值,根据HashCode值来判断元素的存储位置。如果这个位置有元素的话,通过equals 比较,如果返回true就不不存了了,返回false就散列列到其它地址。

3 HashMap的实现原理理?

HashMap的存储内容是具有映射关系的KV键值对,内部是使 用数组加链表的形式来实现数据的存储,通过K值和hashcode() 方法来判断值存在数组中的下标,(hashcode()的实现 方法是根据hash算法,然后我做的时候是k值是Integer类型的,hashcode()的计算 方法

是k值对数组 长度取模)然后遍历这个下标的数组元素存储的链表,通过equals() 方法来判断是否有相同的k值,如果有,就把原来的值覆盖掉,没有就插在链表的末尾,这样做的好处是结合了了数组存储和链表存储的优点,既可以快速查询元素,也可以快速插 入和删除元素。

4 ArrayList与LinkedList的区别?

ArrayList内部使 用数组来实现数据的存储,适 用于快速的查询元素

LinkedList内部使 用链表来实现数据的存储,适 用于快速的插 入和删除元素

5 HashMap与Hashtable的区别?

HashMap允许键和值是null,Hashtable不不允许键或者值为null

Hashtable是线程安全的,适合多线程环境, 而Hashtable不不是线程安全的,适合单线程

环境

6 List,Set和Map区别?

Set集合中的对象不不按特定 方式排序,并且没有重复对象。排序 方式有默认排序和定制排

序,定制排序需要实现Comparator接 口。

List集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置

检索对象。

Map集合中的元素都包含 一对键对象和值对象,键对象不不可以重复,值对象可以重复。

7 concurrentHashMap实现原理理:

ConcurrentHashMap是Java并发包中提供的 一个线程安全且 高效的HashMap实现,内部使 用了了分段锁,主 干是个Segment数组。Segment继承了了ReentrantLock,是 一种可重 入锁,在ConcurrentHashMap, 一个Segment就是 一个 子哈希表,Segment 里里维护了了 一个HashEntry数组,并发环境下,对不不同Segment的数据进 行行操作不不 用考虑锁竞争的。

8 Java并发包中?

java.util.concurrent

9 集合中hashcode与equals为什什么要同时重写?

因为对于集合中基于hash算法存放数据的集合中 比如HashMap,HashSet之类的, 用equals() 方法只能判断元素的值是否相等,不不能判断元素的唯 一性。只有当equals返回true,hashcode 方法返回值相等时才能判断这两个元素完全相等。HashMap存 入数据时就是按这种机制实现的。

10 什什么是阻塞队列列?

阻塞队列列就是会对当前线程产 生阻塞的队列列,通常 用于 生产者消费者模型中。当 一个线程从 一个阻塞队列列中取元素时,如果阻塞队列列为空的时候,那么线程就会被阻塞直到队列列中有了了元素时才会被唤醒。常 用的有ArrayBlockingQueue,LinkedBlockingQueue 11 ArrayList和vector的区别?

Vector是线程安全的,ArrayList不不是线程安全的,ArrayList的性能 比Vector好。

自动扩容时Vector会将它的容量量翻倍, 而ArrayList只增加50%的 大 小

线程进程相关:

1 说 一下进程与线程的区别?

进程就是正在运 行行的程序,负责了了这个程序的内存空间分配,代表了了内存中的执 行行区域线程就是在 一个进程中负责 一个执 行行路路径。

一个进程可以有多个线程,但 至少有 一个线程。

2 线程的实现 方法

继承Thread类重写run() 方法

实现Runnable接 口重写run 方法

实现Callable接 口重写call 方法

使 用线程池调 用Executors类的静态 工 厂 方法创建 一个ExecutorService对象

3 runnable接 口与callable接 口的区别?

Callable可以有 一个返回值, 而Runnable不不可以。

Callable能够抛出异常, 而Runnable不不可以。

Callable和Runnable都可以应 用于线程池。 而Thread类只 支持Runnable.

4 线程如何实现同步(如何实现线程安全)

使 用同步代码块 synchronized(this.account){}

使 用同步 方法 同步 方法就是使 用 synchronized关键字来修饰某个 方法加锁 使 用Lock类创建锁

建 立副本:使 用ThreadLocal类为每 一个线程建 立 一个变量量的副本,各个线程间独 立操作,互不不影响。

5 同步代码块和同步 方法的区别?

同步 方法是对类的对象的所有 方法加同 一把锁,同时执 行行多个 方法时要等到前 一个 方法执 行行完释放锁之后才会执 行行后 一个 方法,同步代码块是对对象的某 一个 方法加上特定的锁,对象的不不同 方法只要加上不不同的锁就可以同时被访问。

6 线程死锁

当两个线程都有 自 己的锁 而且相互等待对 方释放锁时就会发 生死锁。会导致线程都 无法执 行行,程序 一直停留留在发 生死锁的地 方 无法继续执 行行。

7 wait 和 sleep有什什么区别?

wait 方法释放资源也释放锁。是Object类的 方法sleep 方法释放资源但不不释放锁。是Thread类的 方法 8 volatile与synchronized的区别?

volatile只能使 用在变量量级别;synchronized则可以使 用在变量量、 方法、和类中

volatile只能实现变量量的修改可 见性,不不能保证原 子性; 而synchronized则可以保证变量量

的修改可 见性和原 子性

volatile不不会造成线程的阻塞;synchronized可能会造成线程的阻塞

9 Lock和Synchronized的区别?

Lock 支持更更精细的锁控制,可以对 一个对象的不不同 方法分别加不不同的锁,Synchronized是对象级别的,对象的所有 方法加的都是同 一把锁。

10 为什什么要 用线程池?

因为每执 行行 一个任务我们就要启动 一个线程,这对于 小型应 用是可 行行的,但对于 大型应 用, 比如 高并发的web服务器 ,需要启动 大量量的线程,线程的创建与销毁都会消耗 大量量的的资源,因此就需要写 一个类,来具体的管理理线程,就是线程池,它内部已经创建了了若 干个线程,我们将需要执 行行的任务提交给线程池,线程池就会安排空闲的线程来执 行行任务,执 行行完毕后就调 用sleep() 方法使线程休眠,等有新的任务时再使 用notify 方法唤醒线程,提 高线程的复 用。

11 线程池框架的三个组成部分?

ThreadPoolExecutor: 线程池实现类,会动态创建多个线程,并发执 行行提交的多个任务;

worker: 是 一个Runnable实现类,内部会创建 一个线程, 一直循环不不断执 行行任务;workQueue:这是 一个阻塞队列列,当任务数超过内部线程数时,这时候提交的任务将会放 入阻塞队列列中,等待空闲线程执 行行;

12 线程池的使 用步骤?

通过Executors 工 厂创建 一个线程池ExecutorService

通过继承Runnable或者Callabe创建需要线程池执 行行的任务

调 用线程池ExecutorService的sumbit提交创建的任务,线程池会 自动执 行行任务可以通过shutdown 方法关闭线程池

13 线程池中的主要的类?

Executor接 口

ExecutorService接 口

AbstractExecutorService抽象类ThreadPoolExecutor类

ScheduledThreadPoolExecutor类

14 什什么是守护线程?

守护线程是 一种辅助线程,具有最低的线程优先级,当所有的前台线程都执 行行完毕后,守护线程会 自动消失。调 用Thread对象setDaemon(true) 方法可将指定线程设置成守护线程。

15 Java中有 几种线程池?

CachedThreadPool():创建 一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中。

FixedThreadPool(int nThreads):创建 一个可重 用的、具有固定线程数的线程池。SingleThreadExecutor():创建 一个只有单线程的线程池,它相当于newFixedThreadPool 方法时传 入参数为1。 ScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它可以在指定延迟后执 行行线程任务。corePoolSize指池中所保存的线程数,即使线程是空闲的也被保存在线程池内。

SingleThreadScheduledExecutor():创建只有 一条线程的线程池,它可以在指定延迟后执 行行线程任务。

16 线程间的通信 方式?

(1) 用Sychronized和Lock来实现同步

(2) 使 用wait和notify 方法

(3) 管道通信:通过管道,将 一个线程中的消息发送给另 一个

17 线程池的参数?

1、corePoolSize:核 心线程数

2、queueCapacity:任务队列列容量量(阻塞队列列)

3、maxPoolSize:最 大线程数

4、 keepAliveTime:线程空闲时间

反射机制相关:

1 说 一下反射机制(java.lang.reflect)

反射机制就是java程序在运 行行时,对于任何 一个类和对象,我们可以通过反射机制动态

的获取它的属性和 方法。

它的具体实现步骤是:

首先获得类或对象的Class对象 (getClass 方法或Class.forName 方法)

然后通过Class对象调 用getDeclaredMethods 方法和getDeclaredFields来得到对象的各种 方法和各种属性,如果操作的是对象的话,我们还可以将这些属性设置为可 见的, 用来得到对象的各种属性值。

然后我利利 用反射机制的例例 子主要是做了了 一个简单的ORM 工具和把对象转化成JSON字符

串串

ORM 工具的实现:就是把JDBC的编程步骤封装在 一个类 里里 面, 用来连接数据库,然后

向类中的 方法传 入 一个对象,通过反射机制把对象映射成sql语句句,再执 行行这些sql语句句。

可以实现对数据库的增删查改。

将对象转化成JSON数据格式,就是通过反射机制和字符串串的拼接来完成的Mybatis的底层实现应 用的也是反射机制

2 什什么是ORM 工具?(java.sql)

Java是 面向对象的编程语 言,操作的是对象,数据库是通过sql语句句来实现增删查改的,要使 用Java语 言实现对数据库的操作要 用到ORM 工具将对象映射成sql语句句,再使 用JDBC编写代码来连接数据库。 3 ORM 工具有三种

Hibernate Mybatis JdbcTemplate

Hibernate拥有完整的JavaBean对象与数据库的映射结构,可以 自动 生成sql语句句, 而mybatis仅有基本的字段映射,它需要 手写sql语句句来实现对象到对象数据的映射,所以mybatis在数据库的移植性上不不如Hibernate, 而且Hibernate也拥有完整的 日志系统。

但是在灵活性上,mybatis要远远强于Hibernate,mybatis的sql语句句都是写在xml配置 文件 里里的,维护起来 比较 方便便, 而且需求变动的话,sql语句句修改起来也 比较 方便便。

4 说 一下JDBC

JDBC的全称是Java DataBase Connectivity

是java提供的 一套访问数据库的API,可以通过JDBC连接到数据库,再通过结构化的sql

语句句来完成对数据库的查询和更更新。

JDBC的编程步骤:

第 一步是通过Class.forName()来加载数据库驱动

第 二步是通过DriverManager类的getConnection() 方法获取数据库连接第三步是通过Connection对象创建Statement对象

第四步是通过Statement对象的executeQuery 方法和executeUpdate 方法执 行行sql语句句,如果执 行行的是查询语句句,会返回 一个ResultSet对象,解析这个对象可以获得查询结果。(getObject 方法)

5 PreparedStatement和Statement的区别?

PreparedStatement与Statement都是接 口,PreparedStatement继承了了Statement,可以使 用占位符,预编译sql语句句。可以防 止sql注 入攻击, 而且执 行行sql语句句的效率 比Statement 高,因为sql语句句被预编译并且存储在 PreparedStatement 对象中,可以传 入不不同的参数值实现多次利利 用。

异常处理理机制相关:

1 说 一下Java异常处理理机制?

Throwable是所有异常的 父类,它有两个 子类Error类和Exception类,Error类表示Java运 行行时产 生系统内部错误,是程序 无法控制和解决的;Exception类 又分为运 行行时异常和 非运 行行时异常,运 行行时异常有 比如空指针异常,数组越界异常等; 非运 行行时异常有IO中断异常,找不不到 文件等异常。

Java中可以使 用throws将异常直接抛出,但这是消极的处理理异常的 方式;所以通常使 用 try catch finally语句句块来捕捉并处理理异常,将可能出现异常的代码放在try语句句块中, 一

旦发 生异常就根据捕捉到的异常的类型执 行行对应的catch语句句块来处理理异常, 而finally语

句句块不不管有没有异常发 生总会被执 行行,通常 用来关闭 文件或者释放空间。

(捕捉到异常后就处理理异常,然后继续往下执 行行,不不会再执 行行try语句句块中出现异常后 面的

操作)

数据结构与算法相关:

1 说 一下链表,栈和队列列, 二叉树?

链表是 一种数据结构,它的每个节点都包含了了 一个数据区和 一个指针区,数据区 用来存放数据,指针区 用来指向下 一节点,这样多个节点就构成了了 一条链表。优点是可以快速的增加和删除节点。

栈和队列列的区别?

栈和队列列都可以存取数据,但栈是先进后出,队列列是先进先出。

二叉树是 一种数据结构,由根节点和它的 子节点构成,每个节点有 一个数据域 用来保存数据,有两个指针域分别指向左节点和右节点。

二叉树的 用法:通过构造 二叉排序树可以实现数组排序, 二叉排序树就是树的左节点值都 小于它的根节点的值,右节点值都 大于根节点的值。通过中序遍历可以得到 一个有序序列列。

2 排序算法原理理

冒泡排序:冒泡排序就是对于 一个数组,通过n次遍历,每次遍历将相邻的数组元素两两 比较,如果前 一个数 比后 一个数 大,就交换数据,这样就实现了了从 小到 大的排序。选择排序:选择排序就是对于 一个数组,通过n次遍历,每次遍历找到剩余元素的最 小值,将这个最 小值放在已排好的元素的后 面。

快排:就是使 用 一个指针指向某 一个元素,然后先从后往前找到第 一个 比它 小的元素,交换元素值,然后再从前往后找到第 一个 比它 大的元素,再交换元素值。然后使 用递归或者 非递归的 方法重复这些操作,只到元素被排好序。

堆排序:把要排序的n 个数看作是 一棵顺序存储的 二叉树,调整它们的存储序号,使它成为 一个 小根堆,将堆顶元素输出,得到n个元素中最 小的元素。然后对剩下的n-1个元素按同样的 方法递归。(堆中某节点的值总是不不 大于或不不 小于其 父节点的值)

归并排序:先把n个元素拆分为 一个个独 立的区间,再利利 用区间两两合并的 方法直到产 生 一个顺序序列列。

插 入法:就是对于数组中的任意 一个元素,从前 面开始找到第 一个 比它 大的元素,如果存在的话就把这个元素插 入到 比它 大的元素的位置。

二分法:就是对于数组中的任意 一个元素,将它前 面的元素看成 一个区间,把这个元素插 入到这个区间中。

3 算法复杂度和稳定性?

时间复杂度:

快速排序 O(n2)

冒泡排序 O(n2)

选择排序 O(n2)

插 入排序 O(n2)

堆排序 O(nlog2n)

归并排序 O(nlog2n)

空间复杂度:

快速排序 O(nlog2n)

其它都是O(1)

稳定的排序 方法:

冒泡排序 插 入排序 归并排序

4 10G的long型数据,在2G的内存中如何查找中位数?

将long型数据范围分为10个区间,1G 用来读数据,1G做计数器 统计落在每个区间的数据数 目,操作完成后可以确定中位数的区间。然后 用这1G内存存放落在这个区间的数,再结合计数器 中的数 目就可以确定中位数的 大 小。

5 二叉树根据中序和另 一个得到树的结构, 二叉树的遍历 方法? 首先确定根节点,然后根据两个序列列依次往下寻找左右 子树

6 TreeMap的底层实现:红 黑树

事务相关:

1 事务?

事务机制其实就是 一系列列指令的集合

事务的四个基本要素:原 子性, 一致性,持久性,隔离性原 子性就是事务的所有操作,要么全部完成,要么都不不完成 一致性就是事务完成后不不能破坏数据库的完整性约束

隔离性就是 一个数据在同 一时间只允许被 一个事务请求持久性就是事务完成后对数据不不能回滚

事务有三种并发问题,脏读,幻读和不不可重复度

事务隔离级别有四种:读未提交,不不可重复读,可重复度,串串 行行化

MySQL的默认事务隔离级别是可重复度

Java语 言实现事务机制主要依赖于Connection接 口中的三个 方法

setAutoCommit commit rollback 事务隔离级别 脏读 不不可重复读 幻读 读未提交。 是 是 是 不不可重复读。 否 是 是 可重复读。 否 否 是 串串 行行化 否 否 否

2 Spring框架实现事务管理理有两种 方法?编程式事务管理理和声明式事务管理理。

编程式事务管理理就是通过具体的代码实现事务管理理,包括定义事务的开始,正常执 行行后的事务提交和异常时的事务回滚过程。声明式事务管理理是通过AOP技术实现的,将事务作为 一个切 面代码单独编写,然后植 入到业务代码中去。可以通过XML配置 文件来实现,也可以通过注解来实现。

索引:

1 索引怎么实现的?为什什么 用B+树?

索引是数据库中 一个 用于排序的数据结构, 用来快速查询数据库中的数据。Mysql数据库使 用B+树来实现索引的。B+树的特点就是叶 子节点包含了了所有的关键字信息和data数据, 非叶 子节点只包含 子节点的最 大或者最 小关键字, 用来实现索引。这样做的好处就是既能实现快速查找,相 比于B树 又节约了了内存空间。Mysql数据库中的索引实现主要依赖于两个存储引擎,MyISAM和InnoDB,都是使 用B+树作为索引结构。区别就是MyISAM中使 用B+树的叶 子节点的data域存放数据的内存地址, 而InnoDB中树的叶节点data域保存了了完整的数据。

建 立索引的优点就是可以 大 大加快对数据的查询速度,缺点就是索引也需要占物理理空间,对数据库进 行行增删改的时候也要动态的维护索引。

常 用的索引类型有:唯 一索引,主键索引和聚集索引项 目中的应 用:普通索引

项 目中查询分数段的时候:

create index mydata on stuscore (score asc) go;

2 mysql的两种存储引擎的 比较?

MySQL默认采 用的是MyISAM。

MyISAM不不 支持事务, 而InnoDB 支持。

MyISAM 支持锁定表锁,InnoDB 支持 行行锁

MyISAM 支持全 文索引, 而InnoDB不不 支持。

3 数据库中的锁? 页级:引擎 BDB

表级:引擎 MyISAM

行行级:引擎 INNODB

Mysql数据库相关:

1 数据库的范式 ?

第 一范式:就是数据库中的每 一列列都具有原 子性,不不能再被分割。就 比如号码可以分为电话号码和 手机号码。号码就不不能单独作为 一列列。

第 二范式:就是在第 一范式的基础上,把能够唯 一表示这 一 行行数据的列列名作为主键,就 比如把身份证号码作为主键,通过 一个身份证号码就可以找到这个 人的各种信息。

第三范式是第 二范式的 一个 子集,就是数据库设计时的 非主键只依赖与主键, 而不不依赖其它的 非主键。

2 说 一下数据库的触发器 和存储过程:

触发器 对 一张表做增删改的时候触发对其他表的操作,在现在的系统中很少 用,因为系统数据库的迁移要重写触发器 ,所以放在业务层做,执 行行多条sql语句句要 用到事务;存储过程是数据库中的 一段代码,就是 一组为了了完成特定功能的SQL 语句句集,与触发器 的不不同是需要经过调 用才能 用。

3 数据库中的inner join 和left join

left join(左联接) 返回左表中的所有记录和右表中与左表联结字段相等的记录 right join(右联接) 返回右表中的所有记录和左表中与右表联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的记录

4 drop,delete与truncate的区别?

drop语句句删除表结构及所有数据,并将表所占 用的空间全部释放,不不记录 日志,不不能回滚,

不不会触发触发器 。

delete每次从表中删除 一 行行记录,会记录 日志以便便进 行行进 行行回滚操作。

truncate 一次性从表中删除所有的数据 页并不不记录 日志,不不能回滚,不不会触发触发器 。

执 行行速度快。

5 数据库的乐观锁和悲观锁?

数据库中乐观锁和悲观锁都是为了了保证多 用户并发访问数据库时数据的安全。

悲观锁认为每个线程访问数据时都会修改数据,所以每当有线程访问这个数据时都会加

锁,这样做的优点就是可以严格保证数据访问的安全性,缺点是每次请求都要加锁,增加了了额外的开销。悲观锁适合更更新操作 比较多的数据库。

乐观锁认为每个线程访问数据时不不会修改数据,所以不不会加锁,只在提交修改操作的时候判断在该线程访问期间数据有没有被别的线程修改。(retry操作)可以使 用版本号机制来实现,版本号记录了了数据被修改的次数。乐观锁适合查询操作 比较多的数据库。

6 数据库连接池?

数据库连接池负责管理理和释放数据库连接,它允许应 用程序重复使 用现有的数据库连接,需要实现DataSource接 口。常 用两个数据源,DBCP和C3PO,DBCP通过 BasicDataSource类来实现数据库连接池,C3P0数据源通过ComboPooledDataSource类来实现数据库连接池,这两个类都是DataSource接 口的实现类。

7 sql优化?

能 用 子查询的 用 子查询, 子查询是将 一个查询语句句嵌套在另 一个查询语句句中

如果最终结果集在 一张表使 用嵌套查询,避免使 用多表联查,因为多表连接会破坏索引。

使 用索引提 高效率,避免使 用全表查询尽量量避免使 用in和not in

避免在索引上使 用计算

用union替换or

8 sql函数

sql函数: avg sum max min count

9 手写sql语句句from连接:

select s.sno,sn,cn,score from s,c,sc

where s.sno=sc.sno and sc.cno=c.cno;

join连接:

select A.a,B.b,C.c from A

inner join B on A.b=B.b

inner join C on C.c=B.c

10 数据库出现异常怎么办?

数据库可以使 用declare 自定义异常处理理。

11 mybatis中#和$的区别?

#将传 入的数据当成 一个字符串串, 生成sql语句句的时候会对传 入的数据 自动加上 一个双引

号。$将传 入的数据直接拼接在sql语句句中;

#可以防 止注 入攻击,$不不可以

#可以防 止注 入攻击的原因是#是 一个占位符,先通过preparedStatement对象预编译sql语句句,再

向占位符中设置值,然后才会执 行行sql语句句。

12 union和union all的区别?

union和union all的作 用都是合并两个查询结果,但union会去掉合并的结果集 里里的重复记录,并且会按照字段的顺序对结果集进 行行排序, 而union all只是简单的返回合并结果。

WEB前端相关:

1 ajax是什什么?ajax 用的的技术?请求参数?

ajax是 一种前端框架,可以在不不需要重新加载整个 网 页的情况下,就能够实现 网 页的局部更更新,可以 用来实

现前后端分离。

使 用到的技术:

使 用xml和json字符串串来进 行行数据交互和操作

使 用XMLHttpRequest进 行行异步数据接收

使 用JS将前 面的技术绑定在 一起

三个参数,放在open() 方法中

第 一个参数是get或post, 用来规定请求的类型

第 二个参数是url

第三个参数是true或false,true表示异步请求,false表示同步请求

同步请求是指发送完请求数据后需要等待返回结果才能继续下 一步的操作,异步不不需要等待返回结果,但是 一般需要监听异步的返回结果ajax使 用步骤:

创建ajax对象(new XMLHttpRequest)

设置open(三参数)

设置onreadystatechange(readyState为4,status为200)

设置send

2 前后端分离的好处?

前后端通过JSON或者XML等来进 行行数据交互,前后端开发 人员只需要制定好接 口 文档就可以通过调 用接 口集中精 力力完成 自 己负责的模块,提 高了了开发效率。以前使 用jsp做 页 面的时候,前后端没有实现分离,前端开发要等后端开发完成后才可以做 页 面, 而且对于数据交互很频繁的项 目,容易易出现错误。

3 说 一下session

session是 一种会话技术, 用来保存 用户与服务器 进 行行交互时有关 用户的数据;

因为HTTP协议是 无状态协议,为了了维持 一个会话的上下 文信息,在服务端开辟 一个空

间, 用来存储 用户的sessionID

4 session的 生命周期:

当客户端第 一次访问服务器 时,服务器 会为客户端创建 一个session对象,并 生成 一个唯 一的sessionID 用来标识不不同的 用户,当 用户关闭浏览器 或者服务器 调 用了了session.invalidate() 方法时session对象的 生命周期就结束了了。

5 session与cookie的区别:

cookie把 用户的数据保存在客户端;session把 用户的数据保存在服务器 端。

性,使 用session更更好;

session在 一段时间内把数据保存在服务器 上,当访问增多,会占 用服务器 的资源,如果考虑到减轻服务器 的性能 方 面,使 用cookie更更好cookie有 大 小和个数的限制

6 request与session的区别?

request通常 用在客户端提交表单数据时, 生命周期时在http请求开始到服务器 处理理结束

并返回响应的整个过程。

session 用在服务端保存 一些关于访问者的数据,在整个会话期间都有效,可以 用来完成

会话跟踪。

request占 用资源 比较少,安全性 比较 高,但是缺乏持续性,session消耗的资源多 一

点,但是可以实现会话跟踪技术。

7 get请求与post请求的区别?

get是 用来从服务器 上获得数据,post是 用来向服务器 上传递数据。

get将表单中数据的按照变量量名=值的形式添加到URL后 面,使 用“?”连接,Post是将表单

中的数据放在form的数据体中,传到URL所对应地址中。

get请求是不不安全的, 用户可以直接通过url看到 一些隐私的信息。 而post请求 比较安全。

get传输的数据量量 小,主要是受到url 长度限制; 而post可以传输 大量量的数据。

8 forward与redirect的区别?

使 用forward 页 面间可以共享request 里里 面的数据, 而redirect不不能共享request 里里的数据.使 用forward跳转 页 面时地址栏显示的还是当前的地址,因为forward是服务器 直接访问URL对应的 目标地址,然后读取响应再发给浏览器 , 目的地址对于浏览器 来说是不不可 见的,所以浏览器 的地址栏显示的还是原来的地址。 而redirect是重定向,服务器 发送 一个状态码给浏览器 ,告诉浏览器 去请求新的地址,所以地址栏显示的是新的URL的地址。

9 JS对象,JS选择器 ?

js对象:String、Date、Array

js选择器 :

getElementById

getElementsByName

getElementsByTagName

getElementsByClassName

10 前后端分离怎么实现的?

以前 用jsp做 页 面的时候前端可以处理理业务逻辑,不不能实现前后端分离。 用ajax框架前端,Java写后端,通过ajax的异步请求实现前后端分离,同时能够在不不刷新整个 页 面的情况下实现 网 页的局部更更新。

11 前后端通信的 方式?

12 开源组件:

J2EE三 大组件,三 大框架,ORM三 大 工具

计算机 网络相关:

1 说 一下TCP,UDP,HTTP?

TCP 传输控制协议,提供的是 面向连接、可靠的服务,TCP提供超时重发,检验数据,流量量控制等功能,保证数据能从 一端传到另 一端。

UDP 用户数据报协议,提供的是 面向 无连接的,不不可靠的服务,它只是把相应的数据报发送出去,但是并不不能保证它们能到达 目的地。所以传输速度很快。

HTTP 超 文本传输协议,是 一个 无状态的协议, 用于规范客户端浏览器 和服务器 端以什什么样的格式进 行行通信数据交互,由请求和响应构成。

2 TCP与UDP 工作在传输层,HTTP 工作在应 用层

3 TCP协议与UDP协议的区别?

TCP是 面向连接的,提供可靠的服务,提供超时重发,检验数据等功能,保证数据能按顺序到达 目的地;UDP是 面向 无连接的,提供不不可靠的服务,不不能保证数据到达 目的地, 而且不不保证有序,但是传输速度快。

TCP协议传输的是字节流,对数据的 大 小没有限制,UDP传输的是数据报,数据报的 大 小不不能 大于64KB.

传输 文件 用TCP协议 比较好,视频会话 用UDP协议 比较好。

4 HTTP协议为什什么要建 立TCP连接?

HTTP协议是应 用层的协议,它是 无状态的,只在 一次客户端请求和服务端响应有效,为了了保证会话的持久性和传输数据的完整性,需要先建 立TCP连接。

5 http请求、响应的报 文格式

http请求报 文格式:请求头( 方法) url 版本号 请求实体

http响应报 文格式:版本号 状态码 状态码的 文字描述 响应实体

6 http与https的区别?

https是在http的基础上实现了了安全,

http协议以明 文 方式发送内容,不不提供数据加密功能,传输的报 文可能会被截取,https在http的基础上加 入了了SSL协议,依靠证书来验证服务器 的身份,并为浏览器 和服务器 之间的通信加密。

7 http通信过程

一、建 立TCP连接(三次握 手)

二、浏览器 向服务器 发送请求命令

三、浏览器 发送请求头信息

四、服务器 应答

例例如:HTTP/1.1 200 OK

应答的第 一部分是协议的版本号和应答状态码

五、服务器 发送应答信息

六、服务器 向浏览器 发送数据

七、服务器 关闭TCP链接

8 HTTP状态码?

1XX 表示收到浏览器 请求,正在进 一步的处理理中

2XX 表示 用户请求被正确接收,理理解和处理理,例例如:200 OK 3XX 重定向类,表示请求没有成功。

4XX 表示客户端提交的请求有错误 例例如:404 NOT Found 表示请求的内容不不存在5XX-服务器 错误,表示服务器 不不能完成对请求的处理理:如 500

9 TCP建 立连接为什什么要进 行行三次握 手?三次握 手的过程?

客户端与服务端建 立TCP连接的过程就是 首先客户端要发送请求信号给服务端,然后客户端需要知道服务端是否接受到请求信号,所以服务端要发送 一个响应信号给客户端,然后服务端要知道客户端是否接受到回复信号。这样就陷 入了了 一种循环过程,所有TCP的三次握 手就是 一种折中的处理理办法,当三次交互成功后,我们就可以认为客户端与服务端建 立了了连接。

10 释放连接为什什么要进 行行四次挥 手?四次挥 手的过程?

因为当A和B释放连接时,A发送FIN给B表示想要关闭发送数据 口,B会回复ACK给A,这个时候B可能还在发数据,没有想要关闭数据 口,所以FIN和ACK是分开发送的,也就是需要四次挥 手。

11 TCP四次挥 手最后 一次有个time_wait状态,时间是多 长? 因为TCP是 面向连接,每 一次发送消息都需要确认对 方是否收到。客户端最后 一次发送

消息后要确认服务器 接收到了了数据,所以处于等待状态。

等待时间是240s

12 网络的七层协议?

物理理层,数据链路路层, 网络层,传输层,会话层,表示层,应 用层

13 TCP/IP协议有那 几层?

网络接 口层, 网际层,传输层,应 用层IP协议 工作在 网际层

socket编程 :

1 说 一下socket编程?

socket编程也称为套接字编程,套接字就是通过IP地址加端 口号来唯 一标识 一台主机上的应 用程序,然后通过 网络和TCP/IP协议就可以实现两个程序的通信了了。Java实现socket编程可以使 用TCP协议也可以使 用UDP协议。

使 用TCP协议时客户端使 用Socket类的对象来连接套接字,需要传 入源IP地址, 目的IP地址,端 口号作为参数。服务端使 用ServerSocket类的对象来连接套接字,使 用UDP协议时客户端和服务端都使 用DatagramSocket类的对象来连接套接字,使 用DatagramPacket类创建 一个数据报。区别就是使 用UDP协议实现的socket是通过数据报来传送数据的, 目的地址是放在数据报中的,不不保证可靠传输但是传递信息 比TCP协议快。

2 socket 用到的函数? send receive accept close

J2EE基本组件相关:Servlet,Filter,Listener

1 Servlet,Filter,Listener的区别?

servlet是 一种运 行行服务器 端的java应 用程序,可以动态的 生成web 页 面,它 工作在客户端请求与服务器 响应的中间层。servlet的实现需要继承HttpServlet类,然后重写doGet和doPost 方法。

filter作过滤器 使 用,在 一个请求到达servlet之前预处理理 用户请求,也可以在离开servlet时处理理http响应,实现Filter接 口。

Listener作监听器 用,可以监听Session的创建和销毁,通常 用来统计在线 人数或 网站的访问量量,实现HttpSessionListener接 口。

2 servlet的 生命周期?servlet何时进 行行初始化的?

servlet的 生命周期分为四个阶段 :加载并实例例化,初始化,服务,销毁。

次被 用户请求的时候,容器 会调 用init 方法初始化这个servlet,init 方法在servlet 生命周期只会调 用 一次,然后,会调 用service 方法,由这个 方法调 用doGet或doPost 方法来响应 用户,然后,如果 长期没有对Servlet发出请求的时候,会调 用destroy 方法销毁这个servlet。

当 用户请求这个servlet的时候,容器 会调 用init 方法初始化这个servlet

3 过滤器 和拦截器 的区别?

过滤器 是对传 入的request和response先做 一下过滤然后再传 入servlet中,可以 用来过滤掉 非法的URL和敏 感字符。

拦截器 是动态拦截Action调 用的对象,可以在Action执 行行前后加 入 自 己需要的操作。

过滤器 依赖于servlet容器 ,对所有请求都起作 用。

拦截器 不不依赖与servlet容器 ,拦截器 只对action请求起作 用。

4 Servlet,Filter,Listener的执 行行顺序? Listener > Filter > Servlet

httpClient技术相关:

1 httpClient实现 网络爬 虫?(org.apache.http.client)

httpClient主要 用来通过http协议来获取 网 页或接 口的数据,它的使 用步骤是:

  1. 创建 一个http的客户端
  2. 配置 一个http链接,并初始化 一个http实体
  3. 客户端传 入http实体,执 行行请求并返回响应对象
  4. 从响应对象中获取响应实体,并解析实体
  5. 关闭http客户端

//CloseableHttpClient httpclient = HttpClients.createDefault();

HttpGet httpGet = new HttpGet(URL);

CloseableHttpResponse response = httpclient.execute(httpGet);

HttpEntity entity = response.getEntity();

System.out.println(EntityUtils.toString(entity))//

(说 一个你感觉你做的最好的东 西?)

httpComponent可以 用来做 网络爬 虫,我 用httpComponent的例例 子就是爬取了了我同学数据库 里里的数据然后存到我的数据库中。就是我同学做了了 一个学 生管理理系统,有 一个 页 面是展示所有学 生的基本信息的,然后我就通过httpComponent技术访问他这个 页 面的URL,得到所有学 生信息的JSON数组,然后我写了了 一个学 生类,把JSON数组中JSON对象转化成学 生对象,然后使 用 自 己做的 一个ORM 工具导 入到我 自 己的数据库 里里。

AOP技术相关:

AOP是 一种 面向切 面编程的技术,是对 面向对象编程的补充和完善, 面向对象编程使 用继承,封装和多态建 立 一种从上到下的对象层次结构,但对于从左到右的结构需要 用到AOP技术,就 比如 日志功能,对于所有需要记录 日志的 方法,如果使 用 面向对象编程的话,所有的 方法都要编写 日志代码,就会导致 大量量重复代码, 而且不不利利于代码的维护,使 用AOP技术可以将 日志代码独 立出来,再切 入到有需要的 方法 里里,这样做的好处是能降低代码的耦合度,提 高代码的可维护性。

AOP有两种实现 方法:JDK动态代理理和字节码增强技术(java.lang.reflect.Proxy)

JDK动态代理理是指使 用JDK内置的Proxy动态代理理类在运 行行时动态 生成字节码。需要实现InvocationHandler接 口重写invoke 方法,在invoke 方法中插 入相应的切 面。然后调 用静态 方法newProxyInstance去 生成 一个代理理类的实例例,

缺点:被代理理的类必须实现接 口,未实现接 口则没办法完成动态代理理。

字节码增强技术:就是对没有实现接 口的类在代理理类中创建它的 子类,之后对被代理理类的

方法进 行行重写: 比如插 入切 面之类的操作。

使 用AOP技术实现 日志功能和事务管理理

日志功能就是每当有管理理员对题库进 行行操作的时候,系统就会 自动记录下管理理员在什什么时间对哪些题 目做了了什什么操作,并保存在 一张 日志表 里里。( 日志表只会保存 一周内的记录,使 用 一个线程,定时进 行行数据库更更新操作,再休眠)(写 一个类实现AfterReturningAdvice接 口重写afterReturning 方法 用来实现记录 日志,再通过XML 文件配置)

事务机制 用SpringAOP来实现的

系统随机 生成 一张试卷的过程需要执 行行三条sql查询语句句,构成了了 一个事务。

在项 目中 用户注销账号时成绩记录要同时删除,需要 用的事务。

实现 方法:

在XML 文件中配置事务管理理器 (transactionManager)和切点(txAdvice),然后在 方法前 面使 用@Transactional标签。

Spring框架相关:

1 说 一下Spring?

Spring框架是 一个核 心容器 ,它的主要组件是BeanFactory,使 用IOC/DI 模式将代码的依赖关系转移到配置 文件中。通过容器 对Bean的管理理,能够有效的降低代码的耦合度,提 高代码的可维护性。

IOC/DI模式,就是当 一个类需要另 一个类的对象的时候,不不需要在类的内部创建 一个对象, 而是通过配置 文件beans.xml,相当于 一个容器 ,在容器 中配置所需要的对象的创建 方法(设置bean的property属性)。然后在类 里里 面通过容器 注 入对象就可以了了,这样做的好处就是把代码中的依赖关系转移到了了配置 文件中,降低了了代码的耦合性。(注解形

式@Resource @service)

SpringMVC相关:

1 说 一下Sping MVC怎样处理理请求的(说 一下SpringMVC框架):

用户发起请求到前端控制器 (DispatcherServlet),前端控制器 会过滤出合法的URL并且会加载springmvc.xml配置 文件。

然后前端控制器 会找到处理理器 映射器 (HandlerMapping),通过HandlerMapping完成

url到controller组件的映射

HandlerMapping通过映射关系找到URL对应的处理理器 并返回给前端控制器

前端控制器 拿到处理理器 后,找到对应的处理理器 适配器 (HandlerAdapter),执 行行处理理器 。

处理理器 会返回 一个ModelAndView对象,通过处理理器 适配器 返回给前端控制器

前端控制器 请求视图解析器 ViewResolver对ModelAndView对象进 行行视图解析与渲染

2 viewResolver 一定要 用吗,什什么时候 用?

前后端分离就 用不不到,只要加Response注解,前后端之间只有数据的交互。

标签相关:

1 Mybatis的常 用标签:

insert select delete update if where parameterType ResultType ResultMap foreach trim sql include association collection

2 SpringMVC的常 用标签:

@Controller @RequestMapping @ResponseBody @Resource @Autowired @service @Component @Repository @PathVariable @ModelAttribute @SessionAttributes

设计模式相关:

1 说 一下 工 厂设计模式?

工 厂模式:就是当 一个类中需要另 一个类的实例例化对象时,不不 用在类中使 用new来创建对象, 而是通过 工 厂类来返回这个对象。实现过程是先定义 一个接 口,然后把接 口的各个实例例化过程放在 一个 工 厂类 里里 面,通过向 工 厂类 里里 面传 入不不同的参数得到不不同的对象。使 用 工 厂模式的优点是可以降低代码间的耦合性,提 高代码的可维护性。

工 厂模式有三种:简单 工 厂模式 工 厂 方法模式 抽象 工 厂模式

2 简单 工 厂与抽象 工 厂的区别?

抽象 工 厂就是在简单 工 厂的基础上创建多个 工 厂类,可以 生成不不同种类的产品对象, 一旦需要增加新的产品,直接增加新的 工 厂类就可以了了,不不需要修改之前的代码。简单 工

3 单例例模式:

单例例模式就是只允许 一个类有 一个实例例化对象,适合那些创建 比较频繁或者只需要 一个对象的类。

4 代理理模式:

代理理模式就是为对象提供 一个代理理,代理理可以控制对它所代理理的对象的访问,优点是可以屏蔽 用户真正请求的对象,使 用户程序和真正的对象解耦,AOP就是通过代理理模式来实现的。实现 方式有静态代理理和动态代理理。

静态代理理就是创建 一个代理理类,实现和真实类 一样的接 口,重写接 口的抽象 方法,调 用真实类的 方法并且可以根据需要添加新的功能,然后 用户通过代理理类来 生成 一个实例例化对象。缺点是需要创建多个代理理类。

动态代理理有JDK代理理和Cglib代理理

JDK动态代理理是指使 用JDK内置的Proxy动态代理理类在运 行行时动态 生成字节码。需要实现InvocationHandler接 口重写invoke 方法,在invoke 方法中插 入相应的切 面。然后调 用静态 方法newProxyInstance去 生成 一个代理理类的实例例,缺点是被代理理的类需要实现接 口。Cglib代理理不不仅解决了了静态代理理需要创建多个代理理类的问题,还解决了了jdk代理理需要被代理理对象实现某个接 口的问题。对于需要代理理的类,为其创建 一个 子类,通过重写 父类中的 方法插 入相应的切 面。缺点是不不能代理理真实类中被final修饰的 方法。

Spring 抽象 工 厂模式

SpringMVC 抽象 工 厂模式

AOP 代理理模式

5 设计模式的原则?

(1) 开闭原则

(2) 里里 氏代换原则

(3) 依赖倒转原则

(4) 接 口隔离原则

(5) 迪 米特法则

(6) 合成复 用原则

Linux基本命令:

1 说出 几个常 用的Linux命令? chmod 修改 文件权限的命令 cd 切换当前 目录

su 切换账号

pwd 显示当前 目录 ls 查询 目录和 文件

cat 查看 文件内容

ping 测试 网络连通

netstat 显示 网络状态信息

rm 删除 文件

ifconfig 查看 网络状态

reboot 重启

tar 打包压缩 文件

mkdir 创建 目录

rmdir 删除空 目录

cp 复制 文件

scp 远程复制发送 文件

restful 风格,就是 一个 网址对应 一个资源,后端 用的springmvc框架,有 @requestmapping @ResponseBody @PathVariable注解,其中@PathVariable注解是从 网址中获得参数。

@RequestMapping("/viewItems/{id}")

public @ResponseBody viewItems(@PathVariable(“id”) String id,Model model) throws Exception{ // 方法中使 用@PathVariable获取useried的值,使 用model传回 页 面 //调 用service查询商品信息

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档