Java面试知识

Java基础篇

Java的跨平台性和原理

Java源代码(.java)--->通过Java编译器--->Java字节码文件(.class)--->Jvm运行字节码.class文件.

Java针对不同的平台有对应的JVM (java虚拟机),JVM可以识别和运行字节码文件,Java因此可以实现了一次编译,随处运行。

2.==和equals方法究竟有什么区别?

1). equals方法比较两个对象的内容是否相同

2). ==比较两个对象是否是同一对象,或者说对象在内存中的引用的地址是否相同

应用:(1) 对于基本数据类型,“==”比较的是两者的值是否相等

 (2) 对于引用数据类型,==”比较的是引用的地址是否相同,对象默认的equals方法和==一样

        (3) 对于String,Integer等包装类都重写了equals方法,比较的是内容是否相同

 

3.静态变量和实例变量的区别?

1).静态变量属于类,可以直接通过类名.的形式访问静态变量。

2).实例变量属于该类的对象,必须产生该类的实例对象,方能访问实例变量.

4.重载和重写的区别.

1).重载是类中同名方法的不同实现,即两个或两个以上的方法的方法名相同的参数不同。方法重载有三种情况,参数个数不同,参数类型不同,参数顺序不同。重载与返回值无关。

2). 方法覆盖(重写)是说子类重新定义了父类的方法。方法覆盖(重写)必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问,也就是子类重写的方法的访问类型范围必须大于父类.

5.abstract class和interface有什么区别?

1). 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

2). 类可以实现很多个接口,但是只能继承一个抽象类

 

3). 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,  当然,在这种情况下,类也必须得声明成是抽象的.

4).  抽象类可以在不提供接口方法实现的情况下实现接口。

 5). Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

  6).Java接口中的成员方法默认是public的。抽象类的成员方法可以是private,protected或者是public。

 

6. String,StringBuffer与StringBuilder的区别?

String是字符串常量,final修饰;StringBuffer字符串变量(线程安全); StringBuilder 字符串变量(线程不安全).

String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象.所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能.

需要注意现在JVM会对String拼接做一定的优化: String s=“This is only ”+”simple”+”test”会被虚拟机直接优化成String s=“This is only simple test”,此时就不存在拼接过程.

StringBuffer是对对象本身操作,而不是产生新的对象,因此在通常在有大量拼接的情况下我们建议使用StringBuffer.

StringBuffer是线程安全的可变字符串,其内部实现是可变数组.StringBuilder是java 5.0新增的,其功能和StringBuffer类似,底层也是可变数组,但是非线程安全.在没有多线程问题的前提下,使用StringBuilder会取得更好的性能.

7.运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出或捕获可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常.

8. 深拷贝和浅拷贝的区别是什么?

   浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

 

9. equals()和hashcode()的联系?

hashCode()是方法返回对象的对应的哈希值,equals方法比较两个对象的内容是否相同。如果两个对象根据equal()方法比较相等,那么调用这两个对象的hashCode()方法必须产生相同的哈希值. 如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(哈希冲突的情况下还是会相等的.)

 

10.conllection和conllections的区别?

 Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

  Collections是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

 

11. list和set的区别?

(1). List,Set都是继承自Collection接口

(2). List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)

(3). List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

 

12. ArrayList和Vector的区别?

1). ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
2). Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

 

13. ArrayList,Vector, LinkedList的存储性能和特性?

1).ArrayList 和Vector是采用可变数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,此二者都允许直接通过索引访问元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快插入数据慢

2).Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差3).LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

 

14.HashMap和Hashtable的区别?

1).hashTable是线程同步的,而HashMap是非线程同步的,效率上HashMap较高
2).hashMap允许存在一对空键值对(null,null),而hashTable不允许

 

15.set集合如何保证元素不重复?

通过调用两个对象的hashCode方法,判断哈希值是否相等。

i).如若哈希值不相等,则说明是两个不同的对象。

ii).如若哈希值相等,则判断两个对象调用equals方法后的值是否相等

      i).如若相等,则说明两个两个对象相同.

      ii).如若不同,则说明两个对象不同,只是发生了哈希冲突导致哈希值相同.

 

16.HashMap的实现原理?

HashMap基于hash原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。

注: 在jdk1.8版本后,java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度,我们接下来讲一下红黑树。

 

17.TreeSet的原理以及使用?

1). TreeSet是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。

2). Integer和String等基础的包装类都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使用。

 

18.进程和线程的区别?

1).一个进程是一个独立的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行中的一条执行路径

2).一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务

3). 进程是并发程序执行过程中资源分配的基本单元,线程是程序运行与调度的基本单元

 

19.线程有哪些状态?

线程在执行过程中,可以处于下面几种状态:

       就绪(Runnable):线程准备运行,不一定立马就能开始执行。

       运行中(Running):进程正在执行线程的代码。

       等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

       睡眠中(Sleeping):线程被强制睡眠。

       I/O阻塞(Blocked on I/O):等待I/O操作完成。

       同步阻塞(Blocked on Synchronization):等待获取锁。

死亡(Dead):线程完成了执行。

 

20.线程同步的方式有哪些?

1). synchronized关键字修饰的方法

2). synchronized关键字修饰的语句块

3). 使用重入锁Lock类实现线程同步

4). 使用ThreadLocal管理变量实现线程同步

5.) 使用阻塞队列实现线程同步

6). 使用原子变量实现线程同步

 

21.如何保证几个线程线程有序执行?

1). 共享对象锁,可以保证每个方法只能同时有一个线程进入,配合wait和notifyall方法,可以启动或者唤醒线程

2). 通过主线程Join()

 

22.  java中wait和sleep方法有何不同?

1). 这两个方法来自不同的类。sleep方法来自Thread类, wait方法来自Object类.

2). 线程中sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以执行同步代码块或者同步方法中的代码.

3). wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用.

4). sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 

23.线程之间是如何通信的?

当线程间是可以共享资源的,线程间通信是协调它们的重要的手段。Object类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态

 

24.同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为它不会锁住整个对象(当然也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁

 

25.线程中同步和异步的区别?

同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去

异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍然请求的到,A线程无需等待

 

26.简述Volatile变量?

用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。换句话说:volatile 变量在各个线程获取到的数据是同步更新的.

 

27.简述线程局部变量ThreadLocal

ThreadLocal变量线程局部变量即是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享,是一种实现线程安全的方式

 

28.简述Java多线程中死锁、活锁、饥饿?

死锁:两个线程都需要获取对方线程的资源方能继续执行,这时由于两个线程互相等待对方的资源而被阻塞

活锁:线程不断重复执行相同的操作,但每次操作的结果都是失败的。尽管这个问题不会阻塞线程,但是程序也无法继续执行

饥饿:指的线程无法访问到它需要的资源而不能继续执行时,引发饥饿最常见资源就是CPU时钟周期

 

29.简述Java多线程的悲观锁与乐观锁?

 悲观锁:就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。

乐观锁:获得锁后一直持有锁以防本线程再次申请该锁造成无谓的解锁再加锁开销

 

30. 简述java垃圾回收机制?

是指JVM用于释放那些不再使用的对象所占用的内存. gc通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集,引用计数和对象引用遍历是两种常用的方法。

引用计数: 引用计数存储对特定对象的所有引用数, 当某对象的引用数为0时,便可以进行垃圾收集,这是早期的Jvm进行垃圾回收的机制.

对象引用遍历: 对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集.

程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

 

 

31.简述JVM内存分配?

(1). 基本数据类型的变量和对象的引用都是在栈分配的.

(2). 堆内存用来存放由new创建的对象和数组

(3). 类变量(static修饰的静态变量),程序在一加载的时候就在堆中为类变量分配内存(方法区),堆中的内存引用存放在栈中

(4). 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

(5). 局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

 

32.Java中常用的垃圾收集算法?

(1). 标记-清除

(2). 标记-复制

(3). 标记-整理

(4). 分代回收

这种收集器把堆分为两个或多个域,用以存放不同寿命的对象。JVM生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。

 

33.System.gc()和Runtime.gc()的作用?

这两个方法用来提示JVM要进行垃圾回收。但是立即开始还是延迟进行垃圾回收是取决于JVM的。

 

34.finalize()方法什么时候被调用以及作用?

当垃圾回收器确定不存在对该对象的引用时,由对象的垃圾回收器调用此方法。也就是说在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法

 

35.简述java类加载机制以及加载过程?

类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了: 加载、验证、准备、解析、初始化、使用和卸载 这7个阶段。其中, 验证、准备和解析这三个部分统称为连接(linking)

加载:加载阶段由类加载器在完成,主要作用如下:

(1)  获取定义此类字节码的二进制字节流

(2)  将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

(3)   在Java堆中生成一个代表这个类的java.lang.Class对象

验证: 验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全

准备:准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配

解析: 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

初始化:初始化阶段是执行类构造器<clinit>()方法的过程

 

36.什么是类加载器,类加载器有哪些?

 

类加载器用于完成类的加载。类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)

 

JavaWeb

37.简述http协议?

HTTP(超文本传输协议)是一个基于请求与响应模式的应用层的协议,常基于TCP的连接方式。http请求由三部分组成,分别是:请求行、请求头、请求正文,响应也包含三部分:响应行(包含HTTP版本、状态码、状态码的原因短语)、响应头、响应内容实体

 

38.简述TCP/IP访问的三次握手?

TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。

 

 

UDP:用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。

 

39.Get和Post请求方式的区别?

(1). Get地址栏有参数显示  Post不会再地址栏显示参数(参数是放在了请求体)

(2). Get请求数据不安全 , Post相对安全

(3). Get请求数据限制大小 ,  Post理论上不限制数据大小

 

40.Servlet的生命周期?

1). 第一次请求的时候servlet被初始化,而且只初始化一次,所以tomcat容器中每一个servlet只有一个对象存在

2). 初始化后先调用init方法,只执行一遍

3). 每个请求,调用一遍service -> service -> doGet/doPost。以多线程的方式运行

4). 卸载前调用destroy方法

 

41.JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑.

 

42.重定向和转发的区别?

1). 重定向是客户端行为,转发是服务器端行为

2). 重定向两次请求两次响应,转发一次请求一次响应

3). 重定向路径需要加工程名,转发的路径不需要加工程名.

4). 重定向可以跳转到任意网站,转发只能在服务器内部进行转发.

5). 重定向会导致request对象信息丢失。转发则不会

43.述JSP九大内置对象?

request:负责得到客户端请求的信息,对应类javax.servlet.http.HttpServletRequest

response:负责向客户端发出响应,对应类型:javax.servlet.http.HttpServletResponse

session:负责保存同一客户端一次会话过程中的一些信息,对应类型:javax.servlet.http.httpsession

  • out:负责管理对客户端的输出,对应类型:javax.serlvet.jsp.jspwriter

application:表示整个应用环境的信息,对应类型:javax.servlet.servletcontext

config:ServletConfig,封装Servlet的配置信息,对应类型:javax.servlet.servletconfig

exception:表示页面中发生的异常,可以通过它获得页面异常信息,对应类型:java.lang.exception

pagecontext:表示这个JSP页面上下文,对应类型:javax.servlet.jsp.pagecontext

page:表示当前JSP页面本身

 

44.JSP的四种作用域?

1). page是代表一个页面相关的对象和属性。

2). request一个请求可能跨越多个页面。

3). session一个web回话也可以经常跨域多个请求。

4). application是代表与整个web应用程序相关的对象和属性。

 

45. JSP中静态include与动态include的区别?

1). 静态include:语法:<%@ include file="文件名" %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。

2). 动态include:语法:<jsp:include page="文件名">,能够自动检查被包含文件,当客户端对JSP文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。

 

46.cookie和session的作用、区别?

1). cookie数据保存在客户端,session数据保存在服务端。

2).cookie中只能存放字符串文本,且浏览器有cookie数量限制,单个cookie保存的数据不能超过4k,很多浏览器都限制站点最多保存20个cookie.session中是可以存放对象的.

3). cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,相当重要的数据,应该使用session保存到服务端。

4). session会在一定时间内保持在服务器上,但是会占用内存资源,当访问的用户过多,会加重服务器的负载,考虑到减轻服务器的压力,可以将不重要的数据放在cookie中持久的保存。

 

47. tomcat的优化经验?

1). 去掉对web.xml的监视

2). 把JSP提前编辑成Servlet

3). 有富余物理内存的情况下

4). 加大Tomcat使用的JVM内存。

 

48.如何防止表单重复提交?

1). JavaScript前端校验控制

2). 使用session实现令牌机制

 

49. 过滤器有哪些作用,以及过滤器的生命周期?

生命周期:每个Filter在tomcat启动时进行初始化,每个Filter只有一个实例对象

  (1). Init:在服务器启动时会创建Filter实例

  (2). doFilto:这个方法会在用户每次访问“目标资源”时执行

  (3). destroy():服务器关闭时销毁Filter对象

作用:

  (1). 验证客户是否来自可信网络

  (2). 对客户提交的数据进行重新编码

  (3). 过滤掉客户的某些不应该出现的词汇

  (4). 验证用户是否可以登录

  (5). 验证客户的浏览器是否支持当前的应用

  (6). 记录系统日志

 

50. 详细描述MVC

基于Java的web应用层采用MVC设计模型,即用Model(模型)、View(视图)和Controller(控制)分离设计,这是目前JavaWeb应用服务系统的主流设计方向。

      Model:处理业务逻辑的模块.(JavaBean)

      View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程.(Jsp)

 Controller:负责每个请求的分发,把Form数据传递给Model进行处理,处理完成后,把处理结果返回给相应的View显示给用户.(Servlet)

 

数据库篇

51.项目中优化sql语句执行效率的方法?

(1)尽量选择较小的列

(2)将where中用的比较频繁的字段建立索引

(3)select子句中避免使用‘*’

(4)避免在索引列上使用计算,not,in和<>等操作

(5)当只需要一行数据的时候使用limit 1

(6)保证表单数据不超过200w,适时分割表

(7)针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况

(8)避免查询时判断null,否则可能会导致全表扫描,无法使用索引;

(9)避免like查询,否则可能导致全表扫描,可以考虑使用全文索引

(10) 能用union all的时候就不用union,union过滤重复数据要耗费更多的CPU资源

 

52. truncate和delete的区别?

(1)delete  from 表名:删除所有记录,属于DML语句,一条记录一条记录删除。事务可以作用在DML语句上的

(2)truncate table 表名:删除所有记录,属于DDL语句,将表删除,然后重新创建一个结构一样的表。事务不能控制DDL的,推荐使用

 

53.数据库索引的作用?缺点是什么?

创建索引可以大大提高系统的性能。 
1). 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
2). 可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 
3). 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
4). 在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
5). 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

1). 创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。 
2). 索引需要占物理空间。 
3). 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

 

54. MySQL数据库有哪些类型的索引?

索引类型: B-TREE索引,哈希索引

B-TREE索引加速了数据访问,因为存储引擎不会扫描整个表得到需要的数据

哈希索引建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用

 

55.Mysql存储引擎——MyISAM 和InnoDB区别?

1.MySQL默认采用的是MyISAM。

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

3.InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。

    4.InnoDB支持外键,MyISAM不支持。

    5.InnoDB的主键范围更大,最大是MyISAM的2倍。

    6.InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每个词(停用词除外)建立倒排序索引。

7.没有where的count(*)使用MyISAM要比InnoDB快得多。

 

56.mysql分库分表?

mysql分库分表的的重点就是表的切分。表的切分可分为纵向和横向两种切分方法。

(1). 纵向切分:将不同模块的表分别存储到不同的数据库中,按模块分出来的表在代码中最好不要与其他数据库中的表有关联操作。

(2). 横向切分:横向切分是根据表内数据的逻辑关系,将同一个表按某种规则拆分到多个数据库或多个表中。

 

 

57.Mysql集群实现读写分离?

MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。

MySQLProxy是mysql集群的中间件,可以实现mysql主从集群,并且实现mysql的读写分离与负载均衡,

MySQLProxy实际上是在客户端请求与MySQL节点之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQL节点上。对于多节点Slave的集群,也可以起做到负载均衡的效果。

 

58.mysql和oracle分页的区别?

1). MySQL 分页 (利用LIMIT关键字)

2). Oracle 分页 (利用自带的rownum)

 

59.oracle中存储过程和函数的区别?

  1).函数(function)总是向调用者返回数据,并且一般只返回一个值;

  2).存储过程(procedure)不直接返回数据,但可以改变输出参数的值,这可以近似看作能返回值,且存储过程输出参数的值个数没有限制

   3).调用方式不同

 

JavaEE

60.ibatis(mybatis)、Hibernate有什么不同?

1).ibatis(mybatis)它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,这样我们可能自行编写高效的sql语句。但是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

2).Hibernate对象/关系映射能力强,数据库无关性好,因为hibernate自动生成sql语句,但是我们无法控制该语句,我们就无法去写特定的高效率的sql。

 

61.谈一谈你对Spring的理解?

①Spring是一个开源的业务层框架,分模块,一站式框架,它能够整合各种其他主流框架;

②Spring的实质就是一个实现了工厂模式的工厂类,在其配置文件中,通过添加<bean>标签,来创建实例对象;

③Spring的核心——IoC/DI;

a)IoC(Inverse of Control)控制反转,将对象的创建全交给Spring去管理,然  后Spring容易通过依赖注入的方式,注入给调用者。这样做的好处是,让bean与bean之间以配置文件的形式组织在一起,而不是以硬编码的方式耦合在一起。

b)依赖注入的方式有三种:接口注入、Setter方法注入(使用<property name="" value或者ref="">)、构造注入;

④Spring的核心——AOP;

a)AOP(面向切面编程),可以在不修改源代码的前提下,对程序进行增强,例如,加入日志,加入权限判断,加入异常处理等;

b)AOP底层使用的是代理技术,分为JDK动态代理(面向接口)和CGLIB动态代理(没接口的,产生子类代理);

62.SpringMVC的执行过程?

1、用户发送请求至前端控制器DispatcherServlet

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

5、HandlerAdapter执行处理器(handler,也叫后端控制器)。

6、Controller执行完成返回ModelAndView

7、HandlerAdapter将handler执行结果ModelAndView返回给DispatcherServlet

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器

9、ViewReslover解析后返回具体View对象

10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

11、DispatcherServlet响应用户

 

 

63.SpringMVC与Strus2的区别?

 

1). springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

2). springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

3). Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值