Java常见面试题总结

作为一名大四的学生即将要踏入找工作的茫茫大军,参考众多前辈的经验总结了如下面试题:

Java面试总结

  1. 请讲讲冒泡排序 、快速排序这两种排序的原理
    冒泡排序原理
    1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3.针对所有的元素重复以上的步骤,除了最后一个。
    4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    快速排序原理
    1.先定义两个指针,一个在最前面,一个在最后面,第一次要对数组进行划分,先找出一个中间数,
    2.一般默认把第一个数作为中间数,然后从后往前找比中间数小的,把他放在前一个指针的位置,
    3.在从前往后找比中间数大的,找到后把它放在第二个指针的位置,直到前面和后面的指针指向同一个位置,
    4.我们就把中间值放在这里即可,这样根据中间数,把整个需要排序的数组分为两部分,
    5.前一部分都小于中间数,后一部分都大于中间数,此时这两部分的数还是无序的,最后递归调用排序方法,对两部分分别进行排序即可。

2.请手写一下冒泡排序,接着再用递归的方式写一遍

/**
*@Description: 这题面试频率极高,可以说是必来的
*/
public class Test{

public static void main(String[] args) {
// 12,45,9,67,455,用冒泡排序实现升序排列。
    int[] arr = { 12, 45, 9, 67, 455 };
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp;
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
               }
           }
       }
    System.out.println("排序后:");
    for (int i = 0; i < arr.length; i++)
    System.out.print(arr[i] + "\t");
    
 	//创建一个数组用于排序
    int[]arr2={1,4,3,2,6,12,10};
    //调用递归的冒泡
    arr2=recursiveBubble(arr2,arr2.length);
    for(int i=0;i<arr2.length;i++){
        System.out.print(arr2[i]);
    }
 }

//冒泡排序之递归方法
public static int[] recursiveBubble(int[] arr2,int e){
    if(e==0){
        return arr2;
    }
    else{
        for(int i=0;i<e-1;i++){
            int temp=0;
            if(arr2[i]>arr2[i+1]){
                temp=arr2[i];
                arr2[i]=arr2[i+1];
                arr2[i+1]=temp;
            }
        }
        e--;
        //System.out.println(e);
        recursiveBubble(arr2,e);
    }
    return arr2;
}

}

3.讲讲你理解的递归
递归就是方法里调用自身。
出口:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
效率:递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
栈溢出:在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

4.List和set集合的区别
1.set集合中的数据没有顺序,且如果add两个一样的对象或基本类型的数据,set集合里也是只有一个,
2.即set集合中的数据都是独一无二的;不能使用加强的for循环;
3.list中的数据是有顺序的,可以加入多个一样的对象和基本类型的数据,可使用加强的for循环;

5.如何让list变成线程安全
1.使用Collections.synchronizedList(); 把new关键字换一下就可以了其他的都没变

//让list变成线程安全写法
List<Map<String,Object>> data=
Collections.synchronizedList(newArrayList<Map<String,Object>>());

6.ArrayList和LinkedList的区别
1.ArrayList 是基于动态数组的数据结构,LinkedList 是基于链表的数据结构;
2.对于随机访问 get 和 set,ArrayList 较优,因为 LinkedList 要移动指针;
3.对于新增和删除操作 add 和 remove,LinedList 较优,因为ArrayList 要移动数据。

7.ArrayList和Vector的区别
1.Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),
2.而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
3.当Vector或ArrayList中的元素超过它的初始大小时,
4.Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

8.HashTable和HashMap的区别
1.Hashtable的方法是同步的,而HashMap的不是。
2.HashMap 允许空键值,Hashtable 不允许

9.get和set区别
1.get和set在英文中就是获取和存放的意思,
2.在java中一般定义get的方法都是用来取值,set是用来赋值的,
3.方法名都是自定义的,只不过用get和set比较通用,给人一看就能明白是取值和赋值的方法

10.request和session区别
最大的不同是生命周期
1.request:生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一起请求,当请求完毕之后,request里边的内容也将被释放
2.session:也是针对一个客户端,但是却是在别人设置的会话周期内(一般是20-30分钟) session里边的内容将一直存在,即便关闭了这个客户端浏览器 session也不一定会马上释放掉的
javabean对应的scope为request、session的不同
1.request:如果是request,在不同的页面,这个bean是不同的,也就是说你在不同的页面对同一个ID的bean操作,不会影响到其他页面。
2.session:如果是session的话,你在所有页面的bean是同一个,在任意一个页面操作它,在其它页面也能看它改变了。
11.cookie和session的区别
session:
1.session机制采用的是在服务器端保持状态的方案
2.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
3.考虑到减轻服务器性能方面,应当使用COOKIE
cookie:
1.cookie机制采用的是在客户端保持状态的方案
2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
3.考虑到安全应当使用session

12.localStorage和cookie有什么区别?
1.localStorage全部浏览器都支持,cookie全部浏览器也都支持
2.localStorage可以存储5m的大小,cookie存储4kb的大小
3.localStorage都是以字符串的方式存储,所以存储内容是json的时候,未来使用这个数据的时候需要使用eval转化(string转json)

13.wait和sleep的区别(线程)
1.sleep()来自 Thread 类,wait()来自 Object 类;
2.调用 sleep()方法,线程不会释放对象锁。而调用 wait 方法线程会释放对象锁;
3.sleep()睡眠后不出让系统资源,wait 让其他线程可以占用 CPU;
4.sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒。而 wait()需要配合 notify()或者 notifyAll()使用。

14.说说你对多态的理解
1.现象:一个调用语句出现多种形态。
2.实现多态的三个条件:1)要有继承;2)要有方法重写;3)要有父类指针(引用)指向子类对象。2.实现多态的三个条件:1)要有继承;2)要有方法重写;3)要有父类指针(引用)指向子类对象。
3.多态的原理:动态连编,根据实际对象的类型来判断重写方法的调用。多态的原理:动态连编,根据实际对象的类型来判断重写方法的调用。

15.你听说过静态多态和动态多态吗
面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。
应用形式上:
1.静多态是发散式的,让相同的实现代码应用于不同的场合。
2.动多态是收敛式的,让不同的实现代码应用于相同的场合。
思维方式上:
1.静多态是泛型式编程风格,它看重的是算法的普适性。
2.动多态是对象式编程风格,它看重的是接口和实现的分离度。

16.1个英文字母等于多少字节(或一个中文占几个字节)
1.ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
2.UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
3.Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节

17.如何获取下一天的时间
/**
*@Description: 经典面试题
*/
public class Test{

public static void main(String[] args) {
       // 获取Calendar的实例
       Calendar cal = Calendar.getInstance();    
	// 28天之后的日期
	// cal.add(Calendar.DAY_OF_YEAR,28);
	// 28 天之前的日期
	// cal.add(Calendar.DAY_OF_YEAR,-28);
	// 8个月以后的今天是几号
	// cal.add(Calendar.MONTH,8);
	// 1 年以后的今天是几号
           cal.add(Calendar.YEAR,1);

           System.out.println(cal.getTime().toLocaleString());
 
 }

}

18.Calendar是单例吗
不是,代码说明如下:

/**
*@Description: Calendar不是单例
*/
public class Test{

public static void main(String[] args) {
	//Calendar实例1
	Calendar c1 = Calendar.getInstance();
	//Calendar实例2
	Calendar c2 = Calendar.getInstance();
	//获取下一天的时间
	c1.add(Calendar.DAY_OF_YEAR,+1);
	//打印
	System.out.println(c1.getTime().toLocaleString());
	System.out.println(c2.getTime().toLocaleString());
	//打印出来的时间不一样,说明不是同一个对象,即Calendar不是单例的
 
 }

}
19.Servlet/Filter的生命周期
1.第一次请求Servlet的时候,此时会调用Servlet的init方法,初始化这个Servlet,Servlet只需要初始化一次,在当前tomcat不关闭的情况下,就会一直提供服务
2.初始化完成之后,调用Servlet的中方法doGet、doPost方法(根据请求方式自动识别),处理业务
3.业务处理完成,响应数据
4.当处理完某次请求之后,servlet就进入等待状态,等待浏览器的下一次请求
5.当关闭tomcat的时候,自动销毁servlet

20.什么是工作流
简单地讲,工作流是指整个或部分经营过程在计算机支持下的全自动或半自动化。
在实际情况中可以更广泛地把凡是由计算机软件系统(工作流管理系统)控制其执行的过程都称为工作流。
一个工作流包括一组活动及它们的相互顺序关系,还包括过程及活动的启动和终止条件,
以及对每个活动的描述。

21.JSP的九大内置对象及四个作用域(web那块的知识点很少,不太好问)
1.out:页面输出;out隐式对象是javax.servlet.jsp.JspWriter对象的一个实例,用于在响应中发送内容。
2.page:当前页面;page对象是对该页面实例的实际引用。可以认为它是表示整个JSP页面的对象。
3.pageContext:当前上下文(编译之后的当前页面)
4.request:请求;request对象是javax.servlet.http.HttpServletRequest对象的一个实例。每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求。
5.response:响应response对象是javax.servlet.http.HttpServletResponse对象的一个实例。就像服务器创建request对象一样,它还创建一个对象来表示对客户端的响应。
6.session:会话;session对象是javax.servlet.http.HttpSession的一个实例,其行为与Java Servlet下的会话对象行为完全相同。
session对象用于跟踪客户端请求之间的客户端会话。
7.application(ServletContext):tomcat启动的时候自动创建,tomcat停止的时候,自动销毁
8.config:配置文件(获取在web.xml中配置的Servlet的init-param配置信息)
9.exception:异常
作用域:就是“信息共享的范围”
名称 作用域
application 在所有应用程序中有效
session 在当前会话中有效
request 在当前请求中有效
page 在当前页面有效
22.常见的表单元素

  • 文本域、密码域、单选按钮、复选框、按钮、重置按钮、提交按钮、隐藏域、上传域、图片域、下拉列表、lable、文本区域

  • HTML5拥有多个新的表单输入类型。这些新特性提供了更好的输入控制和验证。

    1.Input 类型- email
    email 类型用于应该包含e-mail 地址的输入域。在提交表单时,会自动验证email 域的值。
    2.Input 类型- url
    url 类型用于应该包含URL 地址的输入域。在提交表单时,会自动验证url 域的值。
    3.Input 类型- number
    number 类型用于应该包含数值的输入域。您还能够设定对所接受的数字的限定:
    4.Input 类型- range
    range 类型用于应该包含一定范围内数字值的输入域。
    range 类型显示为滑动条。
    您还能够设定对所接受的数字的限定:
    5.Input 类型- Date Pickers(数据检出器)
    HTML5 拥有多个可供选取日期和时间的新输入类型:
    date - 选取日、月、年
    month - 选取月、年
    week - 选取周和年
    time - 选取时间(小时和分钟)
    datetime - 选取时间、日、月、年(UTC 时间)
    datetime-local - 选取时间、日、月、年(本地时间)
    6.Input 类型- search
    search 类型用于搜索域,比如站点搜索或Google 搜索。
    search 域显示为常规的文本域。

23.前端选择器有哪些(能说出常见几种即可,当然知道的越多越好)
1.通配符选择器
2.ID选择器
3.类别选择器
4.子元素选择器
5.元素过滤选择器
6.标签选择器
7.伪类选择器
8.兄弟选择器
9.兄弟选择器(所有)
10.标签[属性]选择器
24.https和http的区别
1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
Get和POST
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.
GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作
GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息

25.什么是盒子模型
盒子模型,英文即box model。无论是div、span、还是a都是盒子。
但是,图片、表单元素一律看作是文本,它们并不是盒子。这个很好理解,比如说,一张图片里并不能放东西,它自己就是自己的内容
一个盒子中主要的属性就5个:width、height、padding、border、margin。如下:
width和height:内容的宽度、高度(不是盒子的宽度、高度)。
padding:内边距。
border:边框。
margin:外边距。

26.SpringMVC运行流程
Model(模型):包含数据和行为。不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。
View(视图):负责进行模型的展示,一般就是展示给用户的界面。
Controller(控制器):接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示,起了调度的作用。
Spring MVC围绕DispatcherServlet设计。
处理流程:
1.客户端发出HTTP请求,服务器接收
如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),Web容器将该请求转交给DispatcherServlet处理。
2.DispacherServlet接收到此请求后,根据请求的信息(URL、HTTP方法、请求报头文、请求参数、Cookie等)及HandleMapping的配置匹配Handler
匹配成功,则返回一个HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)。
3.DispacherServlet得到Handler后,把Handler封装为适配器
以适配器接口真正调用了处理器的功能处理方法(先执行拦截器的preHandler方法)
返回ModelAndView(如其名,包含了视图逻辑名和模型数据信息)。
4.DispacherServlet借由ViewResolver完成逻辑视图名到真实对象的解析工作。
5.DispacherServlet得到视图对象View,使用它对ModelAndView中的模型数据进行渲染。
6.客户端得到响应(可能是HTML页面、XML、JSON串、PDF……)

27.你知道有哪些设计模式
单例模式:
保证一个类仅有一个实例,并提供一个访问它的全局访问点
工厂模式:
为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的
建造(Builder)模式:
是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
观察者模式:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式又叫发布-订阅(Publish/Subscribe)模式
适配器(Adapter)模式:
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
代理模式:
为其他对象提供一种代理以控制对这个对象的访问。也可以说,在出发点到目的地之间有一道中间层,意为代理。
28.常见的sql函数有哪些(能说出常见几种即可,当然知道的越多越好)
----统计函数----
AVG  --求平均值
COUNT  --统计数目
MAX  --求最大值
MIN  --求最小值
SUM  --求和
----日期函数----
DAY()  --函数返回date_expression 中的日期值
MONTH()  --函数返回date_expression 中的月份值
YEAR()  --函数返回date_expression 中的年份值
----算术函数----
三角函数:
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
反三角函数:
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
----字符串函数----
CHAR()  --函数用于将ASCII 码转换为字符
LOWER()  --函数把字符串全部转换为小写
UPPER()  --函数把字符串全部转换为大写
STR()  --函数把数值型数据转换为字符型数据
LTRIM()  --函数把字符串头部的空格去掉
RTRIM()  --函数把字符串尾部的空格去掉
----系统函数----
APP_NAME()   --函数返回当前执行的应用程序的名称

热门面试问题:
1、什么是 GC?为什么要有 GC?
GC(Garbage Collection)是垃圾收集的意思,负责清除对象并释放内存。Java 提供的 GC 功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的,从而防止内存泄漏。

2、final, finally 和 finalize 的区别?
final 用于声明属性,方法和类,表示属性不可变,方法不可被重写,类不可被继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 object 类的一个方法,在垃圾收集器执行的时候会调用这个对象回收的方法,工垃圾收集时其他资源的回收,比如关闭文件。

3、什么是单例模式?实现步骤?
单例模式保证了对象唯一。分为懒汉式(在类加载时不初始化)和饿汉式(在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快)。
实现步骤:私有化构造函数、创建一个静态的私有对象、提供公共的访问方法。

4、ArrayList 和 LinkedList 有何区别?
ArrayList 是基于动态数组的数据结构,LinkedList 是基于链表的数据结构;
对于随机访问 get 和 set,ArrayList 较优,因为 LinkedList 要移动指针;
对于新增和删除操作 add 和 remove,LinedList 较优,因为ArrayList 要移动数据。

5、HashMap 和 Hashtable 的区别?
HashMap 允许空键值,Hashtable 不允许;
HashMap 继承自 AbstractMap,Hashtable 继承自 Dictionary 类,两者都实现了 Map 接口;
HashMap 的方法不是同步的,Hashtable 的方法是同步的。

6、Iterater 和 ListIterator 之间有什么区别?
Iterator 用来遍历 Set 和 List 集合,而 ListIterator 只能遍历 List;
Iterator 只可以向前遍历,而 LIstIterator 可以双向遍历;
ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

7、创建线程的方式?
继承 Thread 类
实现 Runnable 接口
使用 Executor 框架

8、什么是死锁?
两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。

9、wait()与 sleep()的区别?
sleep()来自 Thread 类,wait()来自 Object 类;
调用 sleep()方法,线程不会释放对象锁。而调用 wait 方法线程会释放对象锁;
sleep()睡眠后不出让系统资源,wait 让其他线程可以占用 CPU;
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒。而 wait()需要配合 notify()或者 notifyAll()使用。

10、什么是 ThreadLocal?ThreadLocal 和 Synchonized 的区别? 线程局部变量。是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。 synchronized 是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而 ThreadLocal 为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。

Java Web
1、原生态 Ajax 执行流程?
创建 XMLHttpRequest 对象;
注册回调函数;
设置连接信息;
发送数据,与服务器开始交互;
接受服务器返回数据。

2、转发(forward)和重定向(redirect)的区别?
forward 是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect 就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显 redirect 无法访问到服务器保护起来资源,但是可以从一个网站 redirect 到其他网站。

3、怎么防止表单重复提交?
1.禁掉提交按钮。表单提交后使用 Javascript 使提交按钮 disable。
2.Post/Redirect/Get 模式。在提交后执行页面重定向,这就是所谓的 Post-Redirect-Get (PRG) 模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。
3.在 session 中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在 session 中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从 session 中删除它,然后正常处理数据。

4、web.xml 文件中可以配置哪些内容? web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。

数据库(MySQL)
1、JDBC 编程的步骤?
(1)注册驱动;
(2)获取连接对象 Connection;
(3)创建 Statement 对象;
(4)运行 SQL 语句;
(5)处理结果;
(6)关闭连接释放资源。
2、事务的 ACID 是什么?事务并发会产生哪些问题?
ACID 表示事务的特性:原子性、一致性、隔离性和持久性。
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

事务并发产生的问题:脏读、幻读、不可重复读。
脏读(Dirty Read):A 事务读取 B 事务尚未提交的数据并在此基础上操作,而 B 事务执行回滚,那么 A 读取到的数据就是脏数据。
幻读(Phantom Read):事务 A 重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务 B 提交的行。
不可重复读(Unrepeatable Read):事务 A 重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务 B 修改过了。

3、数据库性能优化有哪些方式?
SQL 优化:
尽量避免使用 SELECT *;
只查询一条记录时使用 limit 1;
使用连接查询代替子查询;
尽量使用一些能通过索引查询的关键字。
表结构优化:
尽量使用数字类型字段,提高比对效率;
长度不变且对查询速度要求高的数据可以考虑使用 char,否则使用 varchar;表中字段过多时可以适当的进行垂直分割,将部分字段移动到另外一张表;表中数据量过大可以适当的进行水平分割,将部分数据移动到另外一张表。
其它优化:
对查询频率高的字段适当的建立索引,提高效率;根据表的用途使用合适的数据库引擎;读写分离。

框架部分
Spring:
Spring常见注解:
@Controller
标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象
@RestController
Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
@Service
用于标注业务层组件,说白了就是加入你有一个用注解的方式把这个类注入到spring配置中
@Autowired
用来装配bean,都可以写在字段上,或者方法上。
默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)
@RequestMapping
类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。
方法处: 提供进一步的细分映射信息,相对于类定义处的 URL。
用过RequestMapping的同学都知道,他有非常多的作用,因此详细的用法
我会在下一篇文章专门讲述,请关注公众号哦,以免错过。
@RequestParam
用于将请求参数区数据映射到功能处理方法的参数上
例如
public Resp test(@RequestParam Integer id){
return Resp.success(customerInfoService.fetch(id));
}
这个id就是要接收从接口传递过来的参数id的值的,如果接口传递过来的参数名和你接收的不一致,也可以如下
1public Resp test(@RequestParam(value=“course_id”) Integer id){
2 return Resp.success(customerInfoService.fetch(id));
3 }
其中course_id就是接口传递的参数,id就是映射course_id的参数名
@ModelAttribute
使用地方有三种:

  1. 标记在方法上。
    标记在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。
  2. 标记在方法的参数上。
    标记在方法的参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用.
    @Cacheable
    用来标记缓存查询。可用用于方法或者类中,
    当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。
    但凡说到缓存,都是key-value的形式的,因此key就是方法中的参数(id),value就是查询的结果,而命名空间UserCache是在spring*.xml中定义.
    @CacheEvict
    用来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。@CacheEvict(value=”UserCache”)
    @Resource
    @Resource的作用相当于@Autowired
    只不过@Autowired按byType自动注入,
    而@Resource默认按 byName自动注入罢了。
    @Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
    @PostConstruct
    用来标记是在项目启动的时候执行这个方法。用来修饰一个非静态的void()方法
    也就是spring容器启动时就执行,多用于一些全局配置、数据字典之类的加载
    被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执
    @PreDestroy
    被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前
    @Repository
    用于标注数据访问组件,即DAO组件
    @Component
    泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
    @Scope
    用来配置 spring bean 的作用域,它标识 bean 的作用域。默认值是单例
    @SessionAttributes
    默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中
    参数:
    names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
    types:根据指定参数的类型,将模型中对应类型的参数存储到session中
    value:和names是一样的。
    @Required
    适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常。
    @Qualifier
    当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。

springmvc 常用注解
@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@PathVariable:用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri 模板中的变量作为参数。

@requestParam : 主 要 用 于 在 SpringMVC 后 台 控 制 层 获 取 参 数 , 类 似 一 种 是request.getParameter(“name”),它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”;defaultValue 表示设置默认值,required 铜过 boolean 设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

@ResponseBody : 该 注 解 用 于 将 Controller 的 方 法 返 回 的 对 象 , 通 过 适 当 的HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区。使用时机:返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用 @RequestBody : 该 注 解 常 用 来 处 理 Content-Type: 不 是 application/x-www-form-urlencoded 编码的内容,例如 application/json, application/xml 等; @RequestHeader :可以把 Request 请求 header 部分的值绑定到方法的参数上。

@CookieValue :可以把 Request header 中关于 cookie 的值绑定到方法的参数上。
`

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值