java初级面试题

面试题

前言
程序员面试必须准备的问题
1.好的自我介绍(非常重要,占百分之八十)
2.你对我们公司了解多少
3.离职原因(处处是陷阱)
4.你的缺点是什么(慎重回答)
5.你有什么想问我的吗(面试结束时问的几率高,可以问问公司的晋升机制)
6.职业规划
7.敲门,和面试官问好
8.面试时,看面试官眉眼之间,想不起来看桌子角
9.问什么答什么,别找补

Basic
常用linux命令
ls:查看当前目录中的文件
pwd:显示当前工作目录
cd…:返回上一级目录
cd:改变当前目录
cd/**:进入到/**目录中
date:显示系统时间
cp:复制文件
冒泡排序算法【必须会手写】
for(int i=0;i<arr.length-1;i++){//轮数
for(int j=0;j<arr.length-1-i;j++){//次数
if(arr[k]>arr[k+1]){//两个数的交换
int a=arr[j];
arr[j]=arr[j+1];
arr[j+1]=a;
}
}
}

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)
数组有没有length()这个方法? String有没有length()这个方法
答:数组没有length()这个方法,有length的属性。String有length()这个方法
float型float f=3.4是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
笔试题
27道选择,2道编程,总分101
选择题(每小题3分):
1.(单选题)选择下面代码的运行结果:(C )
public class Test{
public void method(){
for(int i = 0; i < 3; i++){
System.out.print(i);
}
System.out.print(i);//作用域问题
}
}
A.0122
B.0123
C. 编译错误
D. 没有任何输出

2.(单选题)在Java中,以下描述错误的是:(A)
A…class是源文件 //.java是源文件
B…java是编译前的源文件
C…class是编译后的文件
D.Java程序需编译后方可运行

3.(单选题)
int j,k;
for(j=0,k=0; j<=9 && k!=876; j++){
System.out.println(“欢迎来到达内学习”);
}
此for循环语句执行的最大次数:( C)
A.8
B.9
C.10
D.0

4.(单选题)已知表达式 int m [ ] = {0, 1, 2, 3, 4, 5, 6}; 下面哪个表达式的值与数组下标量总数相等:(B )
A.m.length()
B.m.length //数组长度的方法
C.m.length()+1
D.m.length+1

5.(多选题)找出下列代码哪行有错误:(BD)
1.public class HelloWorld{
2. public static void main(String[] args) {
3. double avg1=78.5;
4. int rise=5;
5. int avg2=avg1rise; //编译乘法不可以省略;类型强转
6. System.out.println(“考试平均分:”+avg1);
7. System.out.println("调整后的平均分:"avg2);//字符连接中间需要”+“;
8. }
9.}
A.3
B.5
C.6
D.7

6.(单选题)程序运算输出结果下面正确的是:(C)
public class HelloWorld{
public static void main(String[] args) {
int one = 10 ;
int two = 20 ;
two /= one;//整除
System.out.println(two);
}
}
A.20
B.10
C.2
D.0

7.(单选题)Java 中关于 if 语句描述错误的是:(C )
A.if 语句是根据条件判断之后再做处理的一种语法结构
B.关键字 if 后小括号里面条件表达式的值必须为布尔类型
C.if 后小括号里的表达式的值为 false 时,程序需要执行后面大括号里的语句 //表达式为true,执行大括号
D.if 语句可以和 else 一起使用

8.(单选题)What is the numerical range of a char?:(B)
A.0 … 32767
B.0 … 65535 //char储存的全部字符
C.–256 … 255
D.–32768 … 32767

9.(多选题)选择 Java 语言中的基本数据类型:(AC)
A.byte
B.Integer //int的包装类
C.char
D.Boolean //boolean的包装类

10.(单选题)定义一个数组 int[ ] scores = { 1, 2, 3, 4, 5, 6, 7 } ,数组中的 score[3] //第四个元素指的是:(D)
A.1
B.2
C.3
D.4

11.(单选题)下列数组的初始化正确的是:(B)
A.int[ ] score = new int[ ]; //未定义数组长度
B.int score[ ] = new int[ ] { 34, 90, 87, 54, 24 };
C.int[ ] score = new int[ 4 ] { 90, 12, 34, 77 };
//当提供数组初始化时不能定义维度表达式
D.int score = { 78, 23, 44, 78 };
//类型不匹配:不能从int [ ] 转换为int

12.(单选题)编译运行以下程序后,关于输出结果的说明正确的是(C)
Public class Conditional{
Public static void main(String args[]){
int x=4;
System.out.println("value is "+ ((x>4) ? 99.9 : 9));
}
}
程序中99.99是浮点型数,int x = 4是短整型,在和浮点型做运算的时候自动转换成浮点型,在和9做运算的时候,9也自动转换成浮点型了,结果是9.0

A. 输出结果为:value is 99.99
B. 输出结果为:value is 9
C. 输出结果为:value is 9.0 / /表达式最高的是DOUBLE型,所以自动向上转型,显示9.0
D. 编译错误

13.(单选题)下列程序的运行结果正确的是:(D)
int a = 5;
int b = ++a;
System.out.println(“a=”+a);
System.out.println(“b=”+b);
A. a=5,b=5
B. a=6,b=5
C. a=5,b=6
D. a=6,b=6

14.(多选题)下列有关变量的声明正确的是:(BCD)
A.a = 100; //数据类型未定义
B.int number;
C.double d1, d2;
D.int number1, number2;

15.(单选题)对记录序列{314,298,508,123,486,145}按从小到大的顺序进行冒泡排序,经过两趟排序后的结果为:(B)
A.{314,298,486,123,145,508}
B.{298,123,314,145,486,508}
C.{123,145,298,314,486,508}
D.{123、298,314,145,486,508}

16.(单选题)下面哪个是正确的:(D)
A.String temp [] = new String {“a”“b”“c”}; //元素未分开
B.String temp [] = {“a”“b”“c”}; //引用对象,缺少关键字new
C.String temp = {“a”, “b”, “c”};// int[] 无法转int
D.String temp [] = {“a”, “b”, “c”};

17.(单选题)设整型变量a为5,使b不为2的表达式是:(A)
A.b=a%2 //取余 为1
B.b=a/2
C.b=a>3?2:1
D.b=6-4

18.(多选题)一下运算结果为true的是:(CD)
A.( 5 > 2 ) && ( false )
B.( false ) || ( 5 < 2 )
C.( true ) && ( 2 < 5 )
D.! ( 2 > 5 )

19.(单选题)若a为整型变量,a=12,则表达式:a-=2的值为:(A)
A.10
B.12
C.14
D.-10

20.(单选题)若a为整型变量,a=12,则表达式:a * =2+3的值为:(D)表达式:a = 2+3  a = a(2+3);
A.12
B.24
C.36
D.60

21.(单选题)阅读下列代码;
public class Test{
static String s=“One World One Dream”;
public static void main(String args[]){
System.out.println(s); //不能对非静态字段进行静态引用
}
}
其运行结果是:(D)
A.args
B.One World One Dream
C.s
D.编译错误

22.(多选题)下列有关算数运算符描述正确的是:(AD)
A.“/”代表除法运算符
B.“/”代表求余运算符
C.“%”代表除法运算符
D.“%”代表求余运算符

23.(单选题)若定义int a=2,b=2,下列表达式中值不为4的是:(D)
A.a+b
B.ab
C.a
(b++)
D.a*(++b)

24.(多选题)下列说法错误的有:(BCD)
A.数组是一种对象
B.数组属于一种原生类
C.int number[]={31,23,33,43,35,63}
D.数组的大小可以任意改变
// 数组不是原生类int double boolean float byte short long char 初始化多大就是多大

25 .(单选题)对于一个Java源文件,import, class定义以及package正确的顺序是:(A)
A. package,import,class
B. class,import,package
C. import,package,class
D. package,class,import
//1.如果要给一个类定义归属包,使用package关键字,此关键字必须在文件的最开始位置。
2.如果该类需要引入其他类,使用import关键字,此关键字必须在包定义之后(如果存在),而且必须在类定义之前。
3.定义一个类,需要用到关键字 class。归属包的定义和其他类的引入,都必须出现在类定义之前。

26.(多选题)下面错误的初始化语句是:(ABD)
A. char str[]=“hello”;
B. char str[100]=“hello”;
C. char str[]={‘h’,‘e’,‘l’,‘l’,‘o’};
D. char str[]={‘hello’};

27.(多选题)使用arraycopy()方法将数组a复制到b正确的是:(AD)
A. arraycopy(a,0,b,0,a.length)
B. arraycopy(a,0,b,0,b.length)
C… arraycopy(b,0,a,0,a.length)
D. arraycopy(a,1,b,1,a.length)

编程题(每小题10分):
1.有一个整数数组,其中存放着序列1,3,5,7,9,11,13,15,17,19。请将该序列倒序存放并输出。
int a[]={1,3,5,7,9,11,13,15,17,19};
int t;
System.out.print(“数组的初始状态为:”);
for(int i=0;i<a.length;i++){
System.out.print(" “+a[i]);
}
System.out.println();
for(int i=0;i<a.length/2;i++){
t=a[i];
a[i]=a[a.length-i-1];
a[a.length-i-1]=t;
}
System.out.print(“数组逆序存放后的状态为:”);
for(int i=0;i<a.length;i++){
System.out.print(” "+a[i]);
}
package test;

import java.util.Arrays;

public class aa {
public static void BubbleSort(int[] arr) {
int temp;//定义一个临时变量
for(int i=0;i<arr.length-1;i++){//冒泡趟数
System.out.println(“当i=”+i+“时;”);//打桩
for(int j=arr.length-1;j>i;j–){
if(arr[j]>arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
System.out.println(“当j=”+j+“时;”+arr[0]+";"+arr[1]+";"
+arr[2]+";"+arr[3]+";"+arr[4]+";"+arr[5]+";"+arr[6]+";"
+arr[7]+";"+arr[8]+";"+arr[9]+";");//打桩
}
System.out.println(“for循环结果为;”+arr[0]+";"+arr[1]+";"
+arr[2]+";"+arr[3]+";"+arr[4]+";"+arr[5]+";"+arr[6]+";"
+arr[7]+";"+arr[8]+";"+arr[9]+";");//打桩
System.out.println(" ");
}
}
public static void main(String[] args) {
int arr[] = new int[]{1,3,5,7,9,11,13,15,17,19};
BubbleSort(arr);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}

package test;

public class a {

public static void main(String[] args) {
	int arr[] = new int[]{1,3,5,7,9,11,13,15,17,19};
	for(int i=0,j=arr.length-1;i<arr.length;i++,j--){
		System.out.println(arr[j]);
	}
}

}
2.实现删除数组中某一元素的算法
本题的详细要求如下:

  1. 当给定一个数组和该数组中的某一元素的位置时,利用算法将该数组中的该位置的元素删除。
    如: 有一个数组,其元素内容为 {2,3,4,5,6},当删除位置为1的元素后,该数组的元素内容更改为{2,4,5,6}。
  2. 上述描述中的算法,要求通过一个方法来实现,该方法的声明如下所示:
    int[] remove(int[] ary, int index){}
    上述方法声明中:
    参数ary引用的是原数组;
    参数index表示想要删除的元素的位置;
    返回值为删除掉指定位置元素后的数组。
    public static void main(String[] args) {
    int[] arr = {3,2,8,4,5,6,7};
    arr = remove(arr,2);
    System.out.println(Arrays.toString(arr));
    }
    public static int [] remove(int[] arr,int index){
    for(int i=index;i<arr.length-1;i++){
    arr[i]=arr[i+1];
    }
    arr=Arrays.copyOf(arr, arr.length-1);
    return arr;
    }

OOP

重写与重载
1)重写override
a.发生在父子类中,(方法名相同,参数列表相同)方法签名相同,方法体不同;
b.遵循运行期绑定,根据对象类型调用方法.
重写并遵循两同两小一大原则:
两同:(方法名相同,参数列表相同)方法签名相同;
两小:子类方法的返回值类型小于或等于父类的;
a.返回值类型为void时,必须相等;
b.返回值类型为基本类型时,必须相等;
c.返回值类型为引用类型时,小于或等于.
子类方法所抛出的异常小于或等于父类的.
一大:子类方法的访问权限大于或等于父类的.
(2)重载overload
a.发生在一个类中,方法名相同,参数列表不同,方法体不同;
b.遵循编译期绑定,根据引用类型调用方法.

this和super的区别?
(1)this指代当前对象
a.this.成员变量名—>访问成员变量
b.this.方法名()—>调用方法
c.this()—>调用构造方法
(2)super指代当前对象的父类对象
a.super.成员变量名—>访问父类的成员变量
b.super.方法名()—>调用父类的方法
c.super()—>调用父类的构造方法

向上造型??----为什么会用到向上造型
向上造型是父类型的引用指向子类的对象.看引用的类型.
向上造型可以大大提高程序的扩展性。利用代码维护。

抽象类和接口的区别?—以及接口的优点
抽象类由abstract修饰,接口由interface定义
一个类只能继承一个抽象类,但可以实现多个接口。
抽象类中可以包含抽象方法和非抽象方法,而接口中的所有方法均为抽象的。
子类继承抽象类必须实现抽象类中所有抽象方法,否则子类也必须是抽象类。而子类实现接口则必须实现接口中的所有抽象方法。
写一个Singleton出来
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
   //在自己内部定义自己一个实例,是不是很奇怪?
   //注意这是private 只供内部调用
   private static Singleton instance = new Singleton();
   //这里提供了一个供外部访问本class的静态方法,可以直接访问  
   public static Singleton getInstance() {
     return instance;   
   }
}
第二种形式:
public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   }
}

作用域public,private,protected,以及不写时的区别
答:区别如下:
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)
答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现
Collection 和 Collections的区别
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

下列关于接口的叙述中哪些是错误的
a. 接口中的数据必须设定初值
b. 接口中无法声明一般方法
c. 接口可以声明引用
d. 以上都正确
答案:BC

error和exception有什么区别
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况

用最有效率的方法算出2乘以8等於几
答:2 << 3

构造器Constructor是否可被override
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overload

描述一下JVM加载class文件的原理机制?
答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

java中实现多态的机制是什么?
答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

List、Map、Set三个接口,存取元素时,各有什么特点?
答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

说出一些常用的类,包,接口,请各举5个
答:常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的接口:Remote List Map Document NodeList

递归[斐波那契数列:1 1 2 3 5 8 13 21 …]
public static int fbnq(int n){
if(n1||n2){
return 1;
}else{
return fbnq(n-1)+fbnq(n-2);
}
}
什么是序列化,什么是反序列化
序列化:将对象转换为字节的过程
反序列化:将字节转换为对象的过程.

常见的运行时异常(3-5个)
a.空指针异常:NullPointerException
b.数组下标越界:ArrayIndexOutOfBoundsException
c.类找不见异常:NoClassDefFoundError
d.数字解析异常:NumberFormatException
e.类型转换异常:ClassCastException
f.非法参数异常:IllegalArgumentException

线程的几种状态,什么是线程,什么是进程
1.新建状态(New):
2.就绪状态(Runnable)
3.运行状态(Running)
4.阻塞状态(Blocked)
5.死亡状态(Dead)

如何理解线程并发安全问题,什么是线程同步,什么是线程并发,如何解决同步锁(互斥锁)(synchronized)
线程并发安全问题就是多个线程同时在CPU抢时间片段,这会导致出现逻辑混乱,可能会导致系统瘫痪,出现原因在于线程切换时机不可控制.

所谓异步操作是指多线程并发的操作,相当于各干各的。
所谓同步操作是指有先后顺序的操作,相当于你干完我再干。

实现线程安全的两种方式:
1)synchronized方法(sing ke nai zi d):通过在方法声明中加入synchronized关键字来声明synchronized方法
2)synchronized块:通过synchronized关键字来声明synchronized块.

解决办法:同步锁(互斥锁)

笔试题
周考题
一、 选择题
1.(单选题)关于实例方法和类方法(静态方法),以下描述正确的是( )
A)实例方法只能访问实例变量
B)类方法既可以访问类变量,也可以访问实例变量
C)类方法只能通过类名来调用
D)实例方法只能通过对象来调用
正确答案:D
解析:A 实例方法可以访问类变量;B 类方法只能访问类变量;C 类方法可以通
过对象调用。

2.(单选题)下列哪一种叙述是正确的( )
A)abstract 修饰符可修饰字段、方法和类
B)抽象方法的 body 部分必须用一对大括号{ }包住
C)声明抽象方法,大括号可有可无
D)声明抽象方法不可写出大括号
正确答案为:D
解析:abstract可以修饰方法和类,不能修饰属性。抽象方法没有方法体,即没有
大括号{}

3.(单选题)MAX_LENGTH是int型public成员变量,变量值保持为常量100,用简短语句定义这个变量( )
A)public int MAX_LENGTH=100;
B)final int MAX_LENGTH=100;
C)final private int MAX_LENGTH=100;
D)public final int MAX_LENGTH=100;
答案:D
解析:常量是public final修饰的

4.(单选题)设m,n为类A中定义的int型变量名,下列A类的构造方法中不正确的是()
A)void A(int k){m=k;}
B) A(int k){m=k;}
C)A(int k,int n){m=i;n=j;}
D)A(){m=0;n=0;}
正确答案为:A
解析:构造方法没有返回类型

5.(单选题)在下面程序的第 7 行补充上下列哪个方法,会导致在编译过程中发生
错误( )

  1. class Super{
  2. public float getNum(){
  3. return 3.0f;
  4. }
  5. }
  6. public class Sub extends Super{
  7. // TODO …
  8. }
    A)public float getNum(){return 4.0f;}
    B)public void getNum(){}
    C)public void getNum(double d){}
    D)public double getNum(float d){return 4.0f;}

正确答案为:B
解析:方法重写、重载的问题。
重写要求方法签名完全相同,返回值类型如果是基本类型或无返回值时必须一致。重载要求方法名相同且参数列表必须不同,与返回值类型无关。

6.(单选题)下列哪些语句关于内存回收的说明是正确的( )
A)程序员必须创建一个线程来释放内存
B)内存回收程序负责释放无用内存
C)内存回收程序允许程序员直接释放内存
D)内存回收程序可以在指定的时间释放内存对象

正确答案为:B
解析:垃圾收集器在一个 Java 程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用
System.gc()方法来"建议"垃圾收集器去进行垃圾回收处理,但其是否可以执行,什么时候执行却都是不可知的。

7.下面的程序名为Student.java ( )
public class Student
{
private String name; 1
public Student(String s_name)
{
name = s_name; 2
}
public static void main(String args[])
{
Student s = new Student(); 3
}
}
使用如下指令编译:javac Student.java将会得到什么结果?
A.将会顺利通过编译,并将产生一个Student.class的类文件
B.编译时在//3处出错
C.编译时在//2处出错
D.编译时在//1处出错
答案:B
解析:
如果在类中明确显示的写了一个构造函数,那么默认的空的无参构造函数就不会给提供了

8.(单选题)栈是一种( )
A)存取受限的线性结构
B)存取不受限的线性结构
C)存取受限的非线性结构
D)存取不受限的非线性结构

正确答案为:A
解析:栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表

  1. 下列说法正确的有()
    A. class 中的 constructor 不可省略
    B. constructor 必须与 class 同名,但方法不能与 class 同名
    C. constructor 在一个对象被 new 时执行
    D.一个 class 只能定义一个 constructor
    【正确答案】 C
    构造方法的作用是在实例化对象的时候给属性成员进行初始化 A.类中如果没有显示的给出构造方法,系统会提供一个无参构造方法 B.构造方法与类同名,类中可以有和类名相同的方法 D.构造方法可以重载

10.(多选题)属性的可见性有( )
A)公有的
B)私有的
C)私有保护的
D)保护的
正确答案为:ABD
解析:属性的可见性有四种:公有的(public)、保护的(protected)、默认的(default)、私有的(private)

11.下列选项中关于java中super关键字的说法错误的是( )。
A.super关键字是在子类对象内部指代其父类对象的引用
B.super关键字不仅可以指代子类的直接父类,还可以指代父类的父类
C.子类可以通过super关键字调用父类的方法
D.子类可以通过super关键字调用父类的属性
答案:CD
难度等级:简单
解析:
选项C 子类可以通过super关键字调用父类的方法,但父类的方法不能是私有的
选项D 子类可以通过super关键字调用父类的属性,但父类的属性不能是私有的

12.(多选题) 下列变量命名哪个是合法的()
A)class
B)$abc
C)1234
D)_name

正确答案为:BD
解析:class是java中的关键字,java中对象的命名不能是全数字

13.(多选题)下面选项中哪两个可以在 A 的子类中使用( )
class A {
protected int method1 (int a, int b) {
return 0;
}
}
A)public int method1(int a, int b) { return 0; }
B)private int method1(int a, int b) { return 0; }
C)private int method1(int a, long b) { return 0; }
D)public short method1(int a, int b) { return 0; }

正确答案为:AC
解析:B子类重写父类的方法,访问权限不能降低;C属于重载;D子类重写父类的方法如果返回值类型是基本类型的话,要求相同。

14.(多选题)Given:

  1. public interface Foo{
  2. int k = 4;
  3. }
    Which three are equivalent to line 2( )
    A)final int k = 4;
    B)public int k = 4;
    C)static int k = 4;
    D)abstract int k = 4;

正确答案为:ABC
解析:接口中的属性都是常量,默认由public static final同时修饰,可以省略,abstract不能修饰变量

15.(多选题)下面哪个函数是public void method(){…}的重载函数( )
A)public void method(int m){…}
B)public int method(){…}
C)public void method2(){…}
D)public int method(int m, float f){…}

正确答案为:AD
解析:重载:方法名相同且参数列表不同,与返回值类型无关。
16.(多选题)请问,以下哪些描述是正确的?
A)如果package语句存在,则必须出现在源文件的非空白首行。
B)如果import语句存在,则必须出现在源文件的非空白首行。
C)如果main()方法存在,则必须出现在源文件的非空白首行。
D)如果在源文件中声明了一个public接口,则其名称必须和源文件名一致。

正确答案为:AD
解析:B选项import是写在package下
C选项main方法可以放在类里任意一个地方。

17.请分析下列代码,确定打印结果是什么?
public class SimpleTest {
static {
System.out.println(“a”);
}
public SimpleTest() {
System.out.println(“b”);
}
public static void test() {
System.out.println(“c”);
}
public static void main(String[] args) {
SimpleTest.test();
}
}
a.abc
b.ac
c.bc
d.c
答案:B
解析:
因为没有new SimpleTest,所以没有执行构造
静态的方法只能访问静态的变量或静态方法,非静态的方法即可以访问静态的方法或静态的变量,也可以访问非静态的方法或非静态的变量
静态的变量或方法属于类而不属于对象,所以在访问范围允许的情况下,静态的变量或方法都可以通过类名访问。虽然可以通过对象来访问静态的变量或静态的方法,但不推荐。

18.(多选题)面向对象的主要特征有哪些()
A)封装
B)多态
C)继承
D)抽象

正确答案为:ABC
解析:面向对象的三大主要特征是:封装,多态,继承
19.(多选题)给出下面的代码片段:
public class Base {
int w, x, y, z;
public Base(int a, int b) {
x=a; y=b;
}
public Base(int a, int b, int c, int d) {
//assignment x=a, y=b
w=d; z=c;
}
}
在代码说明//assignment x=a, y=b处写下如下哪几个代码是正确的( )
A)Base(a, b);
B)x=a, y=b;
C)x=a; y=b;
D)this(a, b);

正确答案为:CD
解析:C 是直接给 x,y 赋值;D 是使用 this 调用本类中其它的构造方法。
20.(多选题) 以下声明正确的有( )
A.int[3] arr= {1,3,5}
B.int[] arr= {1,3,5}
C int[3] arr=new int[]{1,3,5)
D int[] arr= neW int[]{1,3,5}
E.int[3] arr=newint[3]{1,3,5}
F.int[] arr= new int[3]{1,3,5}
答案:BD
解析:
在直接初始化数据的时候,就没必要指定数组的个数了
二、简答(代码)题

  1. 给出以下代码的运行结果:
    class Super{
    int index=5;
    public void printVal(){
    System.out.plintln(“Super”);
    }
    }
    class Sub extends Super{
    int index=2;
    public void printVal(){
    System.out.println(“Sub”);
    }
    }
    public class Example{
    public static void main(String[] args){
    Super sup=new Sub();
    System.out.println(sup.index+",");
    sup.printVal();
    }
    }

答案:打印输出5,Sub
解析:
多态,用父类的引用,调用的方法如果是在子类中重写过,那么就调用子类重写的方法
2. 指出下面程序的运行结果:
class A{
static{
System.out.print(“a”);
}
public A (){
System.out.print(“x”);
}
}
class B extends A{
static{System.out.print(“b”);}
public B (){
System.out.print(“y”);
}
}
public class Test{
public static void main(String[] args){
A ab = new B ();
ab = new B ();
}
}
【正确答案】
abxyxy

API
下列哪些情况可以终止当前线程的运行?
a. 抛出一个例外时。
b. 当该线程调用sleep()方法时。
c. 当创建一个新线程时。
d. 当一个优先级高的线程进入就绪状态时。
答案:ABD
下面哪些为构造函数的特性定义
a. 在类中声明构造函数时,名称应该与类名相同
b. 具有重载特性,可以建立多个相同的名称
c. 使用类建立新对象时,会自动执行构造函数,因此在构造函数内设定变量的初值或进行内存分配
d. 以上都是
答案:ABCD
关于异常处理机制的叙述哪些正确
a. catch部分捕捉到异常情况时,才会执行finally部分
b. 当try区段的程序发生异常时,才会执行catch区段的程序
c. 不论程序是否发生错误及捕捉到异常情况,都会执行finally部分
d. 以上都是
答案:BC
关于bean的说法正确的有哪些?(B D)
A、具备一个零参数(空)的构造函数(不是必须的)
B、不应该有公开的实例变量(字段)
C、所有的属性都必须通过getXxx和setXxx方法来访问
D、布尔型的属性使用isXxx,而非getXxx

利用异常处理机制的方法来制作一个代码程序段。输入“I am 007”时,打印“亲爱的007,您好”;输入其他字符串时,打印“对不起,请下次进入”,然后程序结束
import java.io.*;
public class KB
{
public static String scan()
{
String str="";
try
{
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
str=buf.readLine();
}
catch(Exception e) {}
return str;
}
}

public class MyExceptionTest {
public static void exceptionThrow() throws MyException1 {
throw new MyException1();
}
public static void anotherThrow() throws MyException2 {
throw new MyException2();
}
public static void main(String args[]) {
try {
String str=KB.scan();
if(str.equals(“I am 007”))
exceptionThrow();
else
anotherThrow();

	} catch (MyException1 e1) {
		e1.printStackTrace();
	} catch (MyException2 e2) {
		e2.printStackTrace();
	}
}

}

class MyException1 extends Exception {
MyException1() {
super(“亲爱的007,您好”);
}
}

class MyException2 extends Exception {
MyException2() {
super(“对不起,请下次进入”);
}
}

Mysql
根据部门号从高到低,工资从低到高列出每个员工的信息。
select * from employee order by deptid desc,salary

分页
pageSize=20;
pageNo = 5;
分页技术1(直接利用sql语句进行分页,效率最高和最推荐的)
mysql:sql = "select * from articles limit " + (pageNo-1)*pageSize + “,” + pageSize;

用一条SQL语句 查询出每门课都大于80分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90

准备数据的sql代码:
create table score(id int primary key auto_increment,name varchar(20),subject varchar(20),score int);
insert into score values
(null,‘张三’,‘语文’,81),
(null,‘张三’,‘数学’,75),
(null,‘李四’,‘语文’,76),
(null,‘李四’,‘数学’,90),
(null,‘王五’,‘语文’,81),
(null,‘王五’,‘数学’,100),
(null,'王五 ',‘英语’,90);

提示:当百思不得其解时,请理想思维,把小变成大做,把大变成小做,

答案:
A: select distinct name from score where name not in (select distinct name from score where score<=80)

B:select distince name t1 from score where 80< all (select score from score where name=t1);

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

写一条SQL语句,查询姓张学生中平均成绩大于75的学生信息
select * from student where name in (select name from student
where name like ‘张%’ group by name having avg(score) > 75)

SQL语句如何优化
1)from子句:把小表(数据量少的表)放右边
2)where子句:过滤掉最多行的条件放右边
3)group by:先用where条件过滤,再分组
4)select子句:尽量少用*号
5)优先使用连接查询代替子查询
[因为子查询会被翻译成连接查询在底层执行]
6)合理使用索引
–>经常用于条件或者排序的列
–>主键自动建立索引,只需要给外键建立索引
–>频繁修改的表,不适合建索引
[如何解决:1)空间换时间:复制一张表专门查询,定期同步 2)定期rebuild]
–>不要在小表上建索引[原因:因为小表也占物理空间]
–>限制表上索引数量,删除作废的索引
7)大小写拼写要保持一致
[原因:如果不一致,oracle每次需要重新编译相同的SQL语句,如果一致,oracle会缓存每条SQL的计划,反复利用]

常见的数据库约束
1)主键约束:唯一性,非空性
2)外键约束:需要建立两表间的关系并引用主表的列
3)唯一约束:唯一性,可以空,但只能有一个
4)检查约束:对该列数据的范围、格式的限制
5)非空约束: 本字段不可以为空

如何使用索引
a.不要在小表上建立索引(因为小表也占物理空间);
b.经常用于条件或排序的列,
c.主键自动建立索引,只需要给外建建立索引;
d.频繁修改的表,不适合建索引;
e.限制表上索引数量,删除全作废的索引.
Web
1.标签 默认是文本输入框(text)
密码输入框(password) 多选框(checkbox) 单选框(radio) 下拉选(select) 文本域(textarea)

2.CSS的全称是什么?
(层叠样式表)

*3.CSS的选择器有哪些?
id选择器(#) 类选择器(.) 伪类选择器 派生选择器 元素选择器

4.JS的数据类型有哪些?
[基本类型/特殊类型/复杂类型]

5.如何为页面添加js
[事件定义式/嵌入式/文件调用式]

6.web的面试题:比较器的写法
1)var compare = function(a,b){return a-b;}
2)function compare(a,b){return a-b;}
3)var compare = new function(‘a’,‘b’,‘return a-b;’)

*8.JS的常用内置对象(11种)和jsp内置对象(9种)
1)Array String Date Math Boolean RegExp Object Number Function Error Global
2)out request response application session exception PageContext config page

  1. DOM操作

1.HTTP协议
就是一个规范(W3C),规定了浏览器和服务器的如何通信及数据格式

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

3.如何获取请求参数
req.getParameter(String name)

4.如何获取请求资源路径
req.getRequestURI()

5.Servlet输出中文应该如何处理
res.setContentType(“text/html;charset=utf-8”)

6.如果表单中有中文乱码,如何处理
根据不同的请求方式来获取不同的处理方式(get/post)

*7.get和post的区别
1)从提交的数据量上来说,get方式会将请求参数及请求参数值放在请求资源路径里面,携带数据大小有限,不适合提交大量的数据;
post方式会将参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交.
2)从安全上来讲,post方式相对安全,适合大量数据的提交.
3)get方式是表单的默认提交方式.

*8.重定向与转发的区别
forward(转发) 和redirect(重定向)的区别
答:转发是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
重定向就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求。
转发在服务器内部,通过一次请求,地址不变,共用一个request,可以共享数据;重定向到项目之外资源上,二次请求,地址改变,使用两个request,不可以共享数据

1)先说什么是重定向 res.sendRedirect(“重定向的地址”);
2)再说什么是转发,如何转发
a.先绑定数据到request对象上
req.setAttribute(String name,Object obj)
b.获得转发器
req.getRequestDispatcher(“地址”);
c.转发
req.getRequestDispatcher(“地址”).forword(request,response);
3)区别

9.cookie和session的区别,cookie和session的默认保存时间
cookie存储在浏览器上,服务器压力小,但容易被篡改,关闭浏览器就关闭
session存储在服务器上,服务器压力大,但不容易被篡改,30分钟自动关闭

10.反射和映射的区别
反射对于任意一个对象都可以调用该对象的任意方法.
映射是直接操作对象的属性,进而操作数据库

11表达式
${}:EL表达式 $():jQuery选择器 $.ajax()jQuery语法 #{}spring表达式 jsp表达式<%= %> jsp小脚本<% %> jsp声明<%! %>

12.C标签的使用 JSTL标签
if标签
choose标签(相当于if else)
forEach标签(items:声明要遍历的数组或集合;var:声明每次遍历所获取的数据的名称)

框架部分
1.1 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
答:用于创建bean对象,管理bean对象的那个容器
Spring IOC 容器本质上指的的就是Spring Bean容器,
Spring Bean容器中最核心一个机制是IOC机制(
控制反转),所以有时候又将springbean容器称之为
Spring IOC 容器.

1.2 Spring IOC 如何理解?
答:IOC 是Spring中提供一种控制反转机制,目的是将我们
项目中对象的依赖管理交给Spring实现,这样可以更好
实现对象关系的解耦,提高程序的可扩展性.

1.3 Spring DI 如何理解?
答:DI 是Spring中的依赖注入机制,IOC的实现需要借助
这种机制.我们通常会这样理解,Spring Bean容器中的
IOC思想一种目标,DI是实现这种思想的目标的手段.

1.4 Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
答:@Scope(“singleton”)
@Scope(“prototype”)
@Lazy(value=true)

1.5 Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
答:借助反射机制,防止内存泄漏,对象已经不使用了但占用着内存,这种现 象称之为内存泄漏,内存泄漏不是内存溢出,但是它是内存溢出的一个导火索. 内存溢出直接就导致系统崩溃了.

1.6 描述Spring MVC处理流程及应用优势
答:
1、客户端发出一个http请求给web服务器,web服务器对http请求进 行 解析,如果匹配前端控制器(或分发器/DispatcherServlet)的请求映射路径, web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息以及处理器映射 器(HandlerMapping)的配置找到处理请求的处理器(Handler)。
3、由具体的处理器适配器(HandlerAdapter)对Handler进行具体的调用。
4、Handler对数据处理完成以后将返回一个ModelAndView()对象给 DispatcherServlet。
5、DispatcherSevlet通过视图解析器(ViewResolver)将ModelAndView()转 化为真正的视图View。
6、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展 现出完整的view并返回给客户端。

1.7 Spring中的事务处理方式及优缺点
答:优点在于:
1:能够实现全局事务的控制,通过EJB CMT进行事物的管理。
2:能够保证项目模块在系统中完成的功能是可可控制的的操作(AOP)
缺点在于:
1:Spring中的事物声明有编程式事物和申明是事物

1.8 MyBatis应用中#与 有 什 么 异 同 点 答 : 相 同 点 : 都 是 通 过 g e t 来 获 取 值 的 不 同 点 : 有什么异同点 答: 相同点:都是通过get来获取值的 不同点: get传进去的字符串不带引号 #号带引号

1.9 MyBatis应用动态SQL解决了什么问题
答:有时候,固定的sql语句不能够满足我们的应用需求。这个时候需要在 标准的基础上建立动态的查询语句。
Mybatis提供了多种注解,可以提供动态查询语言。
比如说在开发的时候,遇到这样的场景,界面提供了多种查询,但是都是非 必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使 用jdbc的时候,需要判断参数为空,自己组装sql,
但是mybatis提供动态sql机制,依靠标签。

1.10 Shiro框架权限管理时的认证和授权流程描述.
答:Shiro权限控制流程的原理:
应用代码 —- 调用Subject (shiro的Subject 就代表当前登陆用户) 控制权限 —- Subject 在shiro框架内部 调用 Shiro SecurityManager 安全管理器 —– 安全管理器调用 Realm (程序和安全数据连接器 )。
Subject要进行任何操作,都必须要调用安全管理器(对我们来说是自动的)。
而安全管理器会调用指定的Realms对象,来连接安全数据。
Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。
1.11 BeanFactory和ApplicationContext有什么区别?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
1.12 请解释Spring Bean的生命周期?
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
初始化之后调用的回调方法。
销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
InitializingBean和DisposableBean回调接口
针对特殊行为的其他Aware接口
Bean配置文件中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy注解方式
使用customInit()和 customDestroy()方法管理bean生命周期的代码样例如下:

1.13 Spring Bean的作用域之间有什么区别? Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下: singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。 prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。 request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。 Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。 global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。 全局作用域与Servlet中的session作用域效果相同。 1.14 在Spring AOP 中,关注点和横切关注的区别是什么? 关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。 1.15 使用Spring框架的好处是什么? • 轻量:Spring 是轻量的,基本的版本大约2MB。 • 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 • 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 • 容器:Spring 包含并管理应用中对象的生命周期和配置。 • MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 • 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。 • 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。、 1.16 Spring 中用到了那些设计模式? • Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: • 代理模式—在AOP和remoting中被用的比较多。 • 单例模式—在spring配置文件中定义的bean默认为单例模式。 • 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 • 工厂模式—BeanFactory用来创建对象的实例。 • 适配器–spring aop • 装饰器–spring data hashmapper • 观察者– spring 时间驱动模型 • 回调–Spring ResourceLoaderAware回调接口

1.17 Spring 如何保证 Controller 并发的安全?
Spring 多线程请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个Controller对象。
并发的安全? 原因就在于Controller对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常
那有没有办法让Controller不以单例而以每次请求都重新创建的形式存在呢?
答案是当然可以,只需要在类上添加注解@Scope(“prototype”)即可,这样每次请求调用的类都是重新生成的(每次生成会影响效率)
虽然这样可以解决问题,但增加了时间成本,总让人不爽,还有其他方法么?答案是肯定的!
使用ThreadLocal来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。
1.18 使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
1.19 在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素:
• 类型用于注入一列值,允许有相同的值。
• 类型用于注入一组值,不允许有相同的值。
类型用于注入一组键值对,键和值都可以为任意类型。
• 类型用于注入一组键值对,键和值都只能为String类型
1.20 Spring支持的事务管理类型
Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
1.21 Spring框架的事务管理有哪些优点?
它为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
它支持声明式事务管理。
它可以和Spring 的多种数据访问技术很好的融合。
1.22 Spring MVC的主要组件?

(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
1.23 SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上
1.24 Mybatis 中#和KaTeX parse error: Expected 'EOF', got '#' at position 14: 的区别? 1. #̲{}是预编译处理,{}是字符串替换。
2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
3. Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值,相当于字符串拼接
4. 使用#{}可以有效的防止SQL注入,提高系统安全性。
1.25 mybatis的缓存机制,一级,二级介绍一下
一级缓存
默认开启
SqlSession级别的缓存,实现在同一个会话中数据的共享
一级缓存的生命周期和SqlSession一致
当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。
二级缓存
默认不开启,需手动开启
SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量
可自定义存储源,如Ehcache
当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库
不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现
实体类实现序列化,在mapper文件中开启
在配置文件中设置cacheEnabled为true
1.26 pringMVC与Struts2的区别
pringmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
pringmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
1.27 mybatis的基本工作流程
1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。
2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡
3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭
4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。
5.将返回的结果通过映射,包装成java对象。
1.28 什么是MyBatis的接口绑定,有什么好处
接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们通过直接调用接口方法 例如:
UserMapper userMapper=sqlSession.getMapper (UserMapper.class) 就可以,这样比起原来了SqlSession提供的方法,例如List countryList = sqlSession.selectList(“selectAll”);我们可以有更加灵活的选择和设置.。

注意:(1)Mapper .xml文件的namespace属性必须配置为接口的全限定名称,接口方法名与Mapper.xml中的id值必须相同,且接口方法的返回值类型必须与Mapper.xml配置的resultType一致,这里后者起到决定作用。
(2)select查询通过在Mapper.xml中配置ResultMap标签,将查询结果的列名与字段名对应。
insert语句通过#{属性名}从接口参数获取值放到sql语句中。
(3)Mapper.xml接口绑定本质是动态代理。
1.29 MyBatis的编程步骤
创建SqlSessionFactory
通过SqlSessionFactory创建SqlSession
通过SqlSession执行数据库操作
调用session.commit()提交事务
调用session.close()关闭事务
1.30 JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
JDBC编程的不足之处
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
MyBatis的解决方案
在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
Mybatis自动将java对象映射至sql语句。
Mybatis自动将sql执行结果映射至java对象。
1.31 MyBatis的优缺点
优点
易于上手和掌握
Sql写在xml里面,便于统一管理和优化
减少Sql与程序代码的耦合
提供xml标签,支持动态Sql编写
缺点
Sql工作量大,尤其是字段多,关联表多时,更是如此
Sql依赖于数据库,导致数据库移植性差
由于xml里面标签id必须唯一,导致DAO中方法不支持方法重载。所以dao层必须是接口
1.32 使用MyBatis的mapper接口调用时有哪些要求?
Mapper接口方法名和mapper.xml中定义的每个sql的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
Mapper.xml文件中的namespace即是mapper接口的类路径
1.33 谈谈你对SpringMVC的理解

  1. 是一个基于MVC的web框架

  2. SpringMVC是Spring的一个模块,是Spring的子容器,子容器可以拿父容器的东西,但是父容器不能拿子容器的东西

  3. SpringMVC的前端控制器DispatcherServlet,用于分发请求,使开发变得简单

  4. SpringMVC流程(重点). SpringMVC三大组件

    1)HandlerMapping:处理器映射器
    用户请求路径到Controller方法的映射
    2)HandlerAdapter:处理器适配器
    根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同去寻找不同的处理器适配器
    3)ViewResolver:视图解析器
    可以解析JSP/freemarkerr/pdf等
    1.34 简述Mybatis的插件运行原理,以及如何编写一个插件?
    答:1)Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
    2)实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。
    1.35 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
    答:1)Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。2)Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
    3)其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
    1.36 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
    答:1)Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

2)它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

1.37 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
答:能,Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。
关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。

1.38 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
答:第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

1.39 Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
答:虽然Mybatis解析Xml映射文件是按照顺序解析的,但是,被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。

1.40 MyBatis里面的动态Sql是怎么设定的?用什么语法?
答:MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where、trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉 。
1.41 Mybatis都有哪些Executor执行器?它们之间的区别是什么?
答:Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
1.42 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
答:Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
面试题看似都很简单,但是想要能正确回答上来,必定是研究过源码且深入的人,而不是仅会使用的人或者用的很熟的人,以上所有面试题及其答案所涉及的内容,在我的Mybatis系列博客中都有详细讲解和原理分析。
1.43 简单介绍下你对mybatis的理解?

  1. mybatis配置
    
  2. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  3. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  4. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  5. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
  6. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  7. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  8. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  9. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
    1.44 介绍一下Spring的事物管理
    事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管 理,可以通过Spring的注入来完成此功能。
Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
一般选择声明式事务管理,因为这种方式和应用程序的关联较少。
1.45 SSM优缺点、使用场景?

  1. Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

  2. Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

  3. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

  4. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
    1.46 SpringMVC的工作流程?
    用户发送请求至前端控制器DispatcherServlet
    DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
    执行处理器(Controller,也叫后端控制器)。
    Controller执行完成返回ModelAndView
    HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    ViewReslover解析后返回具体View
    DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
    DispatcherServlet响应用户

1.47 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?
springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
1.48 怎么样把数据放入Session里面
可以声明一个request,或者session先拿到session,然后就可以放入数据,或者可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
1.49 讲下SpringMvc的执行流程
系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器DispatcherServlet,spring容器通过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,
数据放在model中,用map传递数据进行页面显示。
1.50 MyBatis(IBatis)的好处是什么
ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的
维护带来了很大便利。
ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成JavaBean对象,大大简化了Java数据库编程的重复工作。
因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,
因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。
1.51 Bean 工厂和 Application contexts 有什么区别?
Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。
1.52 解释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。
1.53 什么是bean的自动装配?
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。
1.54 什么是基于Java的Spring注解配置? 给一些注解的例子。
基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。
以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。
1.55 使用Spring通过什么方式访问Hibernate?
在Spring中有两种方式访问Hibernate:
控制反转 Hibernate Template和 Callback。
继承 HibernateDAOSupport提供一个AOP 拦截器。
1.56 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:
配置the Hibernate SessionFactory。
继承HibernateDaoSupport实现一个DAO。
在AOP支持的事务中装配。
1.57 Spring框架的事务管理有哪些优点?
它为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如
它支持声明式事务管理。
它和Spring各种数据访问抽象层很好得集成。
1.58 在Spring AOP 中,关注点和横切关注的区别是什么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
1.59 AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知。
AOP:面向切面编程:将一个系统中共同的业务逻辑提取出来,进行单独的封装成一个组件(切面),然后以配置的方式作用于系统中,实现程序的可插拔性,提高代码的复用性,提升系统的灵活性和性能
底层实现:JDK动态代理,只支持接口注入CGLIB:可以支持普通类的注入
那些地方会用到:事物开启,日志记录,安全验证,权限验证
切面:系统中共通的业务提取出来,在某个时刻或者某个阶段共同调用
切入点:找到目标方法,给它追加共通的业务逻辑,在spring中提供了切入点表达式帮助我们找到目标方法execution
通知:什么时候调用这个共通的业务逻辑,用于指定切面方法作用到系统中的时机.前置通知,后置通知,环绕通知,异常通知,最终通知。
1.60 Spring中AutoWired和,Resource之间区别是什么
AutoWried:按照类型进行匹配—spring框架自带的,查看当前Spring容器中那个bean类型和引用类型一致,就进行注入,如果有多个匹配类型就会报错.
Resource:默认按照名称进行注入,如果找不到对应的名称按照bean类型进行注入

什么是拦截器?
spring定义的一种特殊的组件,前端控制器在收到请求之后,会先调用拦截器的方法,然后再调用处理器(controller).
注:过滤器是servlet规范当中定义的组件.

过滤器与拦截器的区别
a. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
b. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
c. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
d. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
e. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

什么是组件扫描(<context:component-scan base-package=“XXX”/>)
容器启动之后,如果发现配置文件有component-scan元素,则容器会扫描相应的包及其子包下面的所有的类,如果这些类前面有一些特殊的注解(比如@Component),则容器会将这些类纳入容器进行管理(相当于以前配置文件当中有相应的bean元素).
springMVC执行过程
负责将视图名解析成真正的视图对象,比如jsp.
第一步,DispatcherServlet(前端控制器)收到请求之后,依据HandlerMapping的配置,调用相应的(处理器)Controller来处理.
第二步,Controller(处理器)将处理结果封装成ModelAndView对象,返回给(前端控制器)DispatcherServlet.
第三步,DispatcherServlet(前端控制器)依据ViewResolver(视图解析器)的解析,调用相应的视图对象(比如某个jsp),生成相应的页面.
插入中文到数据库要注意的问题
1)数据库要支持中文,即数据库要设置好正确的字符集
create database cloud_note default character set utf8;
2)charset utf8;
3)jdbc驱动要能正确的进行编码和解码
在配置文件中,加入一下代码
jdbc:mysql://localhost:3306/cloud_note?useUnicode=true&characterEncoding=utf8;

Spring Boot
1:什么是Spring Boot?
多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。如果必须启动一个新的Spring项目,我们必须添加构建路径或添加Maven依赖关系,配置应用程序服务器,添加spring配置。因此,开始一个新的spring项目需要很多努力,因为我们现在必须从头开始做所有事情。
Spring Boot是解决这个问题的方法。Spring Boot已经建立在现有spring框架之上。使用spring启动,我们避免了之前我们必须做的所有样板代码和配置。因此,Spring Boot可以帮助我们以最少的工作量,更加健壮地使用现有的Spring功能。
2:Spring Boot有哪些优点?
Spring Boot的优点有:
减少开发,测试时间和努力。
使用JavaConfig有助于避免使用XML。
避免大量的Maven导入和各种版本冲突。
提供意见发展方法。
通过提供默认值快速开始开发。
没有单独的Web服务器需要。这意味着你不再需要启动Tomcat,Glassfish或其他任何东西。
需要更少的配置 因为没有web.xml文件。只需添加用@ Configuration注释的类,然后添加用@Bean注释的方法,Spring将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired添加到bean方法中,以使Spring自动装入需要的依赖关系中。
基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring将在(application{environment} .properties)中加载后续的应用程序属性文件。
3:如何重新加载Spring Boot上的更改,而无需重新启动服务器?
这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启动。Spring Boot有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载Spring Boot上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。
org.springframework.bootspring-boot-devtoolstrue

4:Spring Boot中的监视器是什么?
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
5:如何在自定义端口上运行Spring Boot应用程序?
为了在自定义端口上运行Spring Boot应用程序,您可以在application.properties中指定端口。
server.port = 8090
6:什么是YAML?
YAML是一种人类可读的数据序列化语言。它通常用于配置文件。
与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
7:如何实现Spring Boot应用程序的安全性?
为了实现Spring Boot的安全性,我们使用 spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
8:什么是Spring Profiles?
Spring Profiles允许用户根据配置文件(dev,test,prod等)来注册bean。因此,当应用程序在开发中运行时,只有某些bean可以加载,而在PRODUCTION中,某些其他bean可以加载。假设我们的要求是Swagger文档仅适用于QA环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot使得使用配置文件非常简单。
9:什么是FreeMarker模板?
FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构进行动态网页生成。使用Freemarker的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理html页面设计。最后使用freemarker可以将这些结合起来,给出最终的输出页面。
10:如何使用Spring Boot实现异常处理?
Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。 我们通过实现一个ControlerAdvice类,来处理控制器类抛出的所有异常。
11:什么是CSRF攻击?
CSRF代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web应用程序上执行不需要的操作。CSRF攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。
12:什么是Apache Kafka?
Apache Kafka是一个分布式发布 - 订阅消息系统。它是一个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应用程序。这是一个Apache顶级项目。Kafka适合离线和在线消息消费。
13:如何监视所有Spring Boot微服务?
Spring Boot提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及50个应用程序的微服务,管理员将不得不击中所有50个应用程序的执行终端。

Redis
2.1:为什么redis需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。
如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
2.2:什么事Redis的回收策略
• volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
• volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
• volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
• allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
• allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
• no-enviction(驱逐):禁止驱逐数据
2.3:redis的内置对象

3:redis相比memcached有哪些优势?
(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据
4:redis常见性能问题和解决方案:
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
5:MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
6: Redis 常见的性能问题都有哪些?如何解决?
1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
7:会话缓存(Session Cache)
最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?
幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

版本冲突
1.61 1:git如何解决版本冲突问题
一、当发生以下三种情况时,git会自动进行合并
1.修改不同的文件
2.修改相同文件的不同区域
3.同时更改文件名和文件内容
二、逻辑冲突
自动合并成功执行后,并不一定意味着万事大吉,在某些特殊情况下,确存在者逻辑冲突。
假如一个用户修改了函数返回值,但是,另外一个用户仍然使用旧的返回值,虽然成功合并冲突却存在着逻辑冲突
三、解决冲突
如果两个用户修改了同一个文件的相同部分的内容,在合并时就会遇到冲突导致合并过程中断。这就需要手动解决冲突

1.62 2:maven命令?
1、mvn compile 编译,将Java 源程序编译成 class 字节码文件。
2、mvn test 测试,并生成测试报告
3、mvn clean 将以前编译得到的旧的 class 字节码文件删除
4、mvn pakage 打包,动态 web工程打 war包,Java工程打 jar 包。
5、mvn install 将项目生成 jar 包放在仓库中,以便别的模块调用
1.63 3:maven的生命周期?
默认(default)的生命周期包括以下阶段(注意:这里是简化的阶段,用于生命周期阶段的完整列表,请参阅下方生命周期参考):
验证(validate) - 验证项目是否正确,所有必要的信息可用
编译(compile) - 编译项目的源代码
测试(test) - 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
打包(package) - 采用编译的代码,并以其可分配格式(如JAR)进行打包。
验证(verify) - 对集成测试的结果执行任何检查,以确保满足质量标准
安装(install) - 将软件包安装到本地存储库中,用作本地其他项目的依赖项
部署(deploy) - 在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享。

Dubbo
10:dubbo服务开发流程,运行流程?zookeeper注册中心的作用?
使用流程:
第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。
第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。
第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。
Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。

项目中遇到的问题:
1.Tomcat无法正常启动[再没有访问页面的情况下]
1)无法正常启动:首先你把你的服务器中的项目全部移除,然后开启Tomcat,如果能够正常启动,证明你的Tomcat没有问题,是你的项目中出现了问题,首先先去web.xml文件中进行排查
2)端口号被占用导致无法正常启动
解决方法:(找到被占用端口号的程序,将其关闭;修改端口号(不建议);手动关闭Tomcat(使用命令)?
3. 当你进行某种操作时[比如:增删改查],请求一直发送但未正常响应,控制台报连接池超时的异常
因为你的dao中相应的功能方法未正常关闭连接;数据库中未正常comcat;
4. 当你访问页面时,显示下载:
消息头写错了:res.setContentType(“text/html;charset=utf-8”);
5. 方法返回值为null?
很可能是变量没有使用或者没有获取到数据
6. class not found?
没有导入jar包或web.xml里路径写错了
7. 非法异常?
可能是mapper文件里定义了两遍相同的方法
8. 扫描不到mapper文件?
找到扫描mapper文件的xml,看看是不是都能扫描到,比如*Mapper.xml
9. 404问题?

  1. 检测tomcat启动是否ok,是否有spring相关日志输出
  2. 检测项目是否编译,若没编译,执行四大clean
  3. 检测项目访问路径是否正确
  4. 检测项目名字是否与server.xml中,context元素的path属性一致(是否对项目重命名过)
  5. 检测相应资源是否存在,如jsp或html
  1. Tomcat启动失败?
    分析原因:
  1. classnotfoundException?
    检测maven配置,重新maven->update下载jar包
  2. 端口号被占用?
    关闭tomcat或杀进程
  3. Multiple contexts have a path of “/gb-jt…”?
    检测server.xml文件
  4. lifecycleException?
    检查web.xml,看是不是标签写错,比如<servlet,少尖括号
  5. 数据库参数异常?
    可能是mapper文件的标签确实resultType和premeter
  1. 能执行成功sql,但是页面404?
    没有写ResponseBody
  2. mapper报错?
    Mapper文件里表名写错
  3. Mapper bind?
    Mapper文件里sql写错了,可能是delete写成了select
  4. Bean创建异常且core.nestedIoException?
    基于接口没有找到mapper文件,导致没有创建dao的代理对象。
  5. 项目上报红叉?
    看param试图,有原因,还可能是Dimym(忘了名字)2.5没改3.0所致
    常见异常
    1—Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ‘com.jt.sys.dao.SysLogDao.getRowCount’. It’s likely that neither a Result Type nor a Result Map was specified.
    原因:没有写resultType
    2—Caused by: Ambiguous mappig.Cannot map ‘xxxController’ method
    原因:RequestMapping值重复
    3—警告:did not find a matching property
    原因:在eclipse下,通过tomcat部署web工程时,tomcat的配置文件server.xml中会自动生成一个关于该web工程的配置信息,类似于下面的东西:Xml代码
    view plaincopy to clipboardprint?


    而默认情况下,server.xml的 Context元素不支持名称为source的属性,所以会发出警告。
    解决办法:关闭tomcat,双击eclipse下tomcat服务器,在出来的Tomcat server at localhost页面中找到server options选项,选中其中的选项”Publish modual contexts to separat XML files“,ctr+s,启动tomcat
    4—404
    原因:web.xml中,display-name标签工程名字不对
    5—SpringMVC @DateTimeFormat失效
    原因:没有开启MVC默认配置
    6—Cause: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 47; 文档根元素 “mapper” 必须匹配 DOCTYPE 根 “null”
    原因:没有拷贝约束头文件
    7—js访问不到方法
    原因:可能是方法写重复了
    8—maven不能自动下载jar包和目录结构
    原因:将.m2文件夹内,残留的jar包删除即可
    9—Caused by: java.lang.IllegalStateException: Configuration error: No realms have been configured! One or more realms must be present to execute an authentication attempt.
    原因:没有写shrio的Service或SecurityManager方法没有setRealm(userRealm);
    10—tomcat启动出错"A child container failed during start"
    原因:servlet-name标签的名字写的不一致
    11—bean创建异常或找不到bean
    原因:可能是spring.xml文件没有引入
    12—没有找到合适的bean
    原因:可能是bean的id或者是配置文件重复了,比如xml和注解方式都写了
    13—js jquery混合使用页面没有效果
    原因:js不能和jquery混用
    14—页面向RequestMapping传值乱码
    原因:过滤器没有成功拦截请求,应该写/*
    15—Mapper root cause
    16—slave_io_runing no
    原因:查看/var/log/mysqld.log文件 可能是uuid重复,修改auto.cnf文件中的uuid值,
    还可能是position值写错,导致挂载时错误
    17— slave_sql_runing no
    原因:重新 stop slave start slave即可
    18—[ERROR] Slave SQL: Slave failed to initialize relay log info structure from the repository, Error_code: 1872
    原因:一般是由relay log没有在配置文件定义所致,在my.cnf配置文件中添加如下项:
    relay_log = /opt/mysql/logs/mysql-relay-bin,重启mysql实例使其生效
    重新连接master
    19—mycat启动成功,但是无数据
    原因:可能是端口写错 默认端口8066
    20—开启虚拟机时黑屏
    原因:在命令符窗口中输入"netsh winsock reset",然后重启计算机即可解决
    若还不行,在VM-Settings-Hardware-Display在右面内容栏中将Accelerate 3D graphics取消打勾,然后重启电脑即可
    21—eclipse无法连接虚拟机的redis
    原因:配置文件中protected-mode改为no
    22—nginx连接404
    原因:可能是nginx.conf域名写错,还可能是启动了两个ngnix(有4个进程)

高可用
1.64 高可用(HA)
高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。
(1)解决单点问题主要有2种方式:
主备方式
这种通常是一台主机、一台或多台备机,在正常情况下主机对外提供服务,并把数据同步到备机,当主机宕机后,备机立刻开始服务。
Redis HA中使用比较多的是keepalived,它使主机备机对外提供同一个虚拟IP,客户端通过虚拟IP进行数据操作,正常期间主机一直对外提供服务,宕机后VIP自动漂移到备机上。
优点是对客户端毫无影响,仍然通过VIP操作。
缺点也很明显,在绝大多数时间内备机是一直没使用,被浪费着的。
主从方式
这种采取一主多从的办法,主从之间进行数据同步。 当Master宕机后,通过选举算法(Paxos、Raft)从slave中选举出新Master继续对外提供服务,主机恢复后以slave的身份重新加入。
主从另一个目的是进行读写分离,这是当单机读写压力过高的一种通用型解决方案。 其主机的角色只提供写操作或少量的读,把多余读请求通过负载均衡算法分流到单个或多个slave服务器上。
缺点是主机宕机后,Slave虽然被选举成新Master了,但对外提供的IP服务地址却发生变化了,意味着会影响到客户端。 解决这种情况需要一些额外的工作,在当主机地址发生变化后及时通知到客户端,客户端收到新地址后,使用新地址继续发送新请求。
(2)数据同步
无论是主备还是主从都牵扯到数据同步的问题,这也分2种情况:
• 同步方式:当主机收到客户端写操作后,以同步方式把数据同步到从机上,当从机也成功写入后,主机才返回给客户端成功,也称数据强一致性。 很显然这种方式性能会降低不少,当从机很多时,可以不用每台都同步,主机同步某一台从机后,从机再把数据分发同步到其他从机上,这样提高主机性能分担同步压力。 在redis中是支持这杨配置的,一台master,一台slave,同时这台salve又作为其他slave的master。
• 异步方式:主机接收到写操作后,直接返回成功,然后在后台用异步方式把数据同步到从机上。 这种同步性能比较好,但无法保证数据的完整性,比如在异步同步过程中主机突然宕机了,也称这种方式为数据弱一致性。
Redis主从同步采用的是异步方式,因此会有少量丢数据的危险。还有种弱一致性的特例叫最终一致性,这块详细内容可参见CAP原理及一致性模型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值