简单说下什么是java跨平台

由于各种操作系统所支持的指令集不是完全一致,所以在操作系统之上加个虚拟机可以来提供统一接口,屏蔽系统之间的差异。

例如Java程序的运行依赖的是JVM,不同的操作系统有不同版本的JVM,这个就实现了java虚拟机的跨平台性,也称具有良好的可移植性。

Java有几种基本数据类型

byte short int long float double char boolean

面向对象的特征

封装

隐藏对象的实现细节,对外提供公开的访问接口,通过private 关键字进行封装

继承

继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

封装的好处是 可以提高安全性以及重用性

多态

同一对象,在不同时刻具有不同的形态,他是面向对象程序设计的一个重要特征,主要是指同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。

什么是面向对象?和面向过程有什么不同

面向对象是一种编程的思想,能将复杂的事情简单化.由执行者变为指挥者,面向对象是基于面向过程而言的.

面向对象强调的是结果,

面向过程强调的是过程

继承的作用

这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
本质上就想要提高代码的复用性,减少代码的编写。

多态的作用

一 把把不同的子类对象当成父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准

二 统一调用标准,一切向父类看齐

三 提高了程序的可扩展性和可维护性

抽象类和接口的区别

抽象类本身不能创建对象,但是,为什么会提供构造方法? --- 是为了子类创建对象时调用 !! 

-- 相同点:都是抽象层,都不能实例化

-- 不同点:

-- 1、抽象类用abstract关键字描述,接口用interface

-- 2、子类和抽象类之间是extends关系,实现类和接口之间是implements关系

-- 3、抽象类中 可以 有构造方法 ,接口里 不能 出现 构造方法

-- 4、抽象类里可以有 变量,接口里没有变量全都是静态的常量

-- 5、接口里定义常量的语法:public static final String NAME="jack",会为变量自动拼接public static final

-- 6、抽象类里 可以有普通方法 也可以有 抽象方法,接口都是抽象方法

-- 7、抽象类和子类之间是继承关系,而且java中,只支持单继承

-- 8、接口突破了java单继承的局限性,因为接口可以多继承也可以多实现,甚至可以继承的同时多实现

-- 9、接口的复杂用法

  -- 多继承: interface A extends B,C 其中A是子接口,同时拥有自己的和BC的功能

  -- 多实现: class AImpl implements M,N,O,P 其中AImpl是实现类,需要同时重写MNOP的所有抽象方法,否则就是一个抽象类

  -- 继承的同时多实现: class AImpl extends Object implements M,N 一定是先继承后实现
方法重写和方法重载

方法重载:

方法重载就是方法名相同,方法的参数不同,返回类型可以相同也可以不同(不是关键的)。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

重载的规则就是 :重载的方法必须修改参数列表(参数的个数,参数的类型,参数的顺序)

方法重写:

方法重写的前提是要有继承关系才可以进行方法的重写

方法的重写是在子类中实现的,要求重写的方法必须和父类完全一致,

方法重写不能抛出比父类范围更大的异常

方法的重写和重载是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载
  (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(
  (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

this关键字

this关键字的本质就是“创建好的对象的地址”

在构造器的重载中,使用this关键字必须写在第一行

this关键字不能存在于static方法中

继承有什么特点?

使用extends关键字

相当于子类把父类的功能复制了一份

Java只支持单继承

继承可以传递

不能继承父类中私有的资源

继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能扩展

像是is a 的关系

super关键字

super关键字相当于是父类对象的一个引用

如果出现在构造方法中,则必须写在第一行

可以在子类中使用父类的功能,通过super关键字调用

static关键字

可以修饰成员变量,成员方法

随着类的加载而加载,优先于对象的加载

只加载一次,就会一直存在,不再开辟新的空间

全局唯一,全局共享

可以直接使用类名来调用

静态的只能调用静态的,非静态的可以调用静态的,但是静态的不能直接调用非静态的

static不能和this和super公共,因为有static的时候可能还没有对象

final关键字

Java中的一个关键字

final可以修饰变量 ,方法,类

被final修饰的类是最终类,不能进行继承

被final修饰的变量是常量,一旦定义后就不可以修改

被final修饰的方法,不能进行重写

final修饰的变量一般大写,代表常量,为了方便外界的调用,一般也会同时使用static修饰

简述static和final的用法?

static:修饰属性,方法,代码块

(1)静态属性:也可叫类变量 类名.属性名 来访问

​ (共有的类变量与对象无关,只和类有关)

注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创建一次。

(2)静态方法:类名.方法名 直接访问

注意:static修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属性)

本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法。

修饰变量,方法,类

final:修饰变量,类,方法

(1)修饰变量

被fianl修饰的成员变量就是常量(常量名大写),一旦赋值不能改变

修饰局部变量:修饰基本数据类型 -> 变量的值不能改变

​ 修饰引用 -> 引用只能指向固定的对象

修饰实例变量:默认值不生效,可以再赋值

(2)修饰方法 :不能被子类覆盖

(3)修饰类:不能被继承

在一个final类中的所有方法,默认都是final的

注意:final,不能用来修饰构造方法。

多态的特点

前提 : 发生了继承关系,有方法的重写

父类引用指向子类对象

编译的时候看左边,运行的时候看右边

接口的使用

接口中没有构造方法

接口中没有变量,都是静态的常量,即使简写,也会自动拼接public static final 这些个关键字

接口中不能有普通方法

接口中的方法都是抽象的方法

重写接口里的方法时,要有足够的权限

写出冒泡排序的算法
int[]  arr = {5,6,9,8,2,1,7};
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 = arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
}


Error和Exception有什么区别? 列出你见过的Exception并简要说明

error 表示系统级的错误和程序不必处理的异常,恢复很难的一种严重问题

exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题,

创建的异常类型有

空指针异常

类型不能转换异常

下标索引越界异常

数据格式转换异常

SQL异常

异常分为运行时异常和检查时异常

检查时异常需要在开发的时候对异常进行处理,或者向上抛出或者直接捕获以后进行处理

运行时异常一般是在程序运行过程中发生的异常,比如空指针异常等。

java中会存在内存泄露吗?请简单描述。

Java中会存在内存泄漏

内存泄漏是指系统存在无法回收的内存,有时候会造成内存不足或者系统崩溃,

Java中的内存泄漏指的是:存在无用但是垃圾回收器无法回收的对象

而且即使有内存泄漏问题存在,也不一定会表现出来。

谈谈java跟你所知道的其它的语言相比,有什么优点??

1、Java是纯面向对象的语言。《Java编程思想》中提到Java语言是一种“Everything is object”的语言,它能够直接反映现实生活中的对象,例如车、动物等,因此通过它编写程序更容易。

2、平台无关性。Java语言可以“一次编译,到处执行”。无论是在Windows平台还是在Linux、MacOS等其他平台上对Java程序进行编译,编译后的程序在其他平台上都可以运行。由于Java是解释性语言,编译器会将Java代码变成“中间代码”,然后在Java虚拟机(Java Virtual Machine,JVM)上解释执行。由于中间代码与平台无关,因此Java语言可以很好的跨平台执行,具有很好的可移植性。

3、Java提供了很多内置的类库,通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间,

4、提供了对Web应用开发的支持。例如,Applet、Servlet和JSP可以用来开发Web应用程序;Socket、RMI可以用来开发分布式应用程序。

5、具有较好的安全性和健壮性。Java语言经常被用在网络环境中,为了增强程序的安全性,Java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode校验等)。Java的强类型机制、垃圾回收器、异常处理和安全检查机制使得用Java语言编写的程序具有很好的健壮性。

6、去除了C++语言中难以理解、容易混淆的特性,如头文件、指针、结构、单元、运算符重载、虚拟基础类、多重继承等,使得程序更加严谨简洁。

谈谈你对面向对象的理解?? 有了基本数据类型,为什么还需要包装类型?

我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。

说一下"=="和equals方法究竟有什么区别?

直接使用 == 符号比较的就是值是否相等.地址值也要相等.

当比较的类型是基本类型的时候,比较的就是值是否相等

当比较的类型是引用类型的时候,比较的就是对象的地址值

如果想要比较对象的属性值是否相等,那么就需要重写equals方法.

通过重写equals方法就可以实现对对象的属性的比较啦,只要属性值一样,则比较结果为true.

String ,StringBuilder, StringBuffer的区别
  1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String  
  2. 再来说线程安全,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
  3. 数据可变和不可变
    1. String底层使用一个不可变的字符数组private final char value[];所以它内容不可变。
    2. StringBufferStringBuilder都继承了AbstractStringBuilder底层使用的是可变字符数组:char[] value;   
讲一下Java中的集合
  1. Collection下:List系(有序、元素允许重复)和Set系(无序、元素不重复)

set根据equals和hashcode判断,一个对象要存储在Set中,必须重写equals和hashCode方法

  1. Map下:HashMap线程不同步;ConcurrentMap线程同步

  2. Collection系列和Map系列:Map是对Collection的补充,两个没什么关系

ArrayList和LinkedList区别?
  1. arraylist 集合是有序的,有索引的,元素可以重复的,linkedlist集合是无序的,无索引的,元素不可以重复的
  2. arraylist底层采用数组的数据结构实现,而linkedlist底层采用链表的形式实现。
  3. 在进行查询操作的时候,arraylist的效率高,因为linkedlist要移动指针
  4. 在对集合中的元素进行增删操作时,linkedlist的效率高,因为arraylist要移动数据
线程创建方式

方法一 继承Thread类

方法二 实现runable接口

方法三 通过线程池的方式

方法四 实现callable接口

方法五 通过匿名内部类的方式

String s = "hello"和String s = new String("hello");有啥区别,创建了几个对象?

答案: 一个或者两个

String s = new String("hello");可能创建两个对象也可能创建一个对象。如果常量池中有hello字符串常量的话,则仅仅在堆中创建一个对象。如果常量池中没有hello对象,则堆上和常量池都需要创建。

String s = "hello"这样创建的对象,JVM会直接检查字符串常量池是否已有"hello"字符串对象,如没有,就分配一个内存存放"hello",如有了,则直接将字符串常量池中的地址返回给栈。(没有new,没有堆的操作)

引用类型是占用几个字节?

hotspot在64位平台上,占8个字节,在32位平台上占4个字节。

两个对象equals为true,则hashCode也一定相同,对吗?

答案:如果按照官方设计要求来打代码的话,hashcode一定相等。但是如果不按官方照设计要求、不重写hashcode方法,就会出现不相等的情况。

两个对象的hashCode相同,则equals也一定为true,对吗?

答案:不对 因为 重写hashCode的时候

@Override
public int hashCode(){
    return 1;
}
某些java类为什么要实现Serializable接口

为了能够实现序列化操作,在网路上传输数据或者持久化数据,保证数据的安全

除了实现Serializable接口还有什么序列化方式
  • Json序列化
  • FastJson序列化
  • ProtoBuff序列化
面向对象六大原则

单一职责原则

开放封闭原则

里氏替换原则

依赖倒置原则

接口分离原则

迪米特法则

如何将字符串反转?
  • 通过 charAt(int index)返回char值进行字符串拼接
  • 调用StringBuffer中的reverse方法
Collection 和 Collections 有什么区别?
  • Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

  • Collections 是一个包装类,它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

Java集合类中的Iterator和ListIterator的区别

对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面:

  1. iterator()方法在set和list接口中都有定义,但是ListIterator()仅存在于list接口中(或实现类中);

  2. ListIterator有add()方法,可以向List中添加对象,而Iterator不能

  3. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

  4. ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

  5. 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。  

sleep() 和 wait() 有什么区别?
  • 对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
  • sleep()方法导致了程序暂停执行指定的时间,但是他的监控状态依然保持,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁
  • 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
notify 和 notifyAll 区别

​ notify 仅仅通知一个线程,并且我们不知道哪个线程会收到通知,然而 notifyAll 会通知所有等待中的线程。换言之,如果只有一个线程在等待一个信号灯,notify和notifyAll都会通知到这个线程。但如果多个线程在等待这个信号灯,那么notify只会通知到其中一个,而其它线程并不会收到任何通知,而notifyAll会唤醒所有等待中的线程。

线程中start()和run()的区别
  • 每个线程都有要执行的任务。线程的任务处理逻辑可以在Tread类的run实例方法中直接实现或通过该方法进行调用,因此run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用。

  • 而start()的作用是启动相应的线程。启动一个线程实际是请求Java虚拟机运行相应的线程,而这个线程何时能够运行是由线程调度器决定的。start()调用结束并不表示相应线程已经开始运行,这个线程可能稍后运行,也可能永远也不会运行。

迭代器的优点

如果用的是for循环,就用集合自带的remove(),而这样就改变了集合的Size(),循环的时候会出错。但如果把集合放入迭代器,既iterator迭代可以遍历并选择集合中的每个对象而不改变集合的结构,把集合放入迭代器,用迭代器的remove()就不会出现问题。

线程池中 submit()和 execute()方法有什么区别?
  • execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口

  • submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口

描述Servlet调用过程?

答案:

(1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址。

(2)浏览器根据ip地址和端口号访问服务器,组织http请求信息发送给服务器。

(3)服务器收到请求后首先根据Host请求头判断当前访问的是哪台虚拟主机。

(4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应用。

(5)服务器根据http请求头中的请求URI判断当前访问的是web应用中的哪个web资源。

(6)检查web应用的web.xml文件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet处理。

(7)这个过程中浏览器只知道自己发出来http请求,不久就收到了http响应,浏览器不知道也不关心服务器内部是如何处理的。浏览器和服务器之间的关系是非常单纯的,只有HTTP协议。

(8)解析请求、封装RequestResponse对象、创建Servlet、调用Service方法都是服务器自动进行的,开发人员只需要写好Servlet配置进容器中即可,无需操心具体的底层实现。

简述Servlet生命周期?

答案:

(1)Servlet第一次被访问到时创建对象,创建出来后立即执行init方法执行初始化的操作。

(2)从此以后该对象一直驻留在内存中为后续的对这个Servlet的请求进行服务。

(3)直到服务器关闭或web应用移除出容器时,随着web应用的销毁Servlet对象销毁掉,在销毁之前调用destory方法执行善后工作。

(4)在存活期间,每次对Servlet 的调用都会导致Service方法的执行。

什么是http协议?

答案:

HTTP协议就是一套基于tcp/ip协议的应用层协议 。简单来说,就是一个基于应用层的通信规范,双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。它规定了客户端(通常是浏览器)和服务器之间的通信方式。

HTTP协议工作原理?

答案:

HTTP协议基于请求响应模型。

一次请求对应一次响应。

首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应(response)返回给客户端。

HTTP协议的特点是什么 ?

答案:

(1) 它是一个无状态的协议,服务器端在处理相应请求后不会保留任何客户端的信息,每次请求都是独立的

(2) 客户端与服务器端的每一次数据交互,都要经过一次请求/响应的过程。

(3) 服务器端无法识别能够出发客户端请求的方法。

(4) 一个典型的HTTP请求分为 一个请求行 若干请求头 一个空行 实体内容。

get和post请求的区别?

答案:

(1) get请求用来从服务器上获得资源,而post是用来向服务器提交数据;

(2) get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;

(3) get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据, POST数据是没有限制的,上传文件通常要使用post方式;

(4) 使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;

(5) get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。

(6) Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。

请求乱码产生的原因?

答案:

浏览器用什么码表来打开表单页面就用什么编码来发送数据。当前我们的注册页面指定了用utf-8来打开。

这就决定了浏览器是用utf-8打开的页面,浏览器在提交表单时是用utf-8编码的。

而tomcat默认情况下会使用iso8859-1来进行解码。

我们知道全世界的码表都兼容iso8859-1,所以英文处理是没有问题的。

但是iso8859-1中并没有中文,iso8859-1对于无法处理的字节都使用?替代,所以我们看到的都是?。

如何来处理get请求产生的乱码?

答案:

由于客户端发送时使用的是utf-8编码而服务器用iso8859-1解码造成了乱码,虽然字符已经乱掉了,但底层的字节仍然是正确的,我们只要将乱码字符getBytes(“iso8859-1”)转换为字节,就是正确的字节,再将这些字节new String(bytes,“utf-8”)按照正确的码表编码,就可以转换回正确的字符了。从而解决了乱码。

Request生命周期

答案:

request对象的生命周期是针对一个客户端(一个浏览器应用程序)的一次请求,当请求完毕之后,request里边的内容也将被释放,一个请求开始时创建,请求结束后销毁。

如何处理响应乱码?

答案:

通过response.setHeader("Content-Type", "text/html;charset=utf-8")方法,通知服务器发送数据时的码表;通过response.setCharacterEncoding("utf-8")方法,通知浏览器解析时使用的码表。两码相同就不会有乱码了。

response提供了setContentType("text/html;charset=UTF-8")快捷方法,在它的底层,会同时做上面两件事,所以可以一行代码解决response产生的乱码问题。

简述ServletContext生命周期?

答案:

ServletContext对象代表当前web应用。当服务器启动时,服务器在启动时会依次加载web应用,每一个web应用加载完成后都会创建一个ServletContext对象唯一代表该web应用,这个对象一直存活,直到web应用移除出容器或服务器关闭时,随着应用销毁,ServletContext对象跟着销毁。

转发与重定向的比较?

答案:

转发是服务器内部资源跳转,重定向是通过302+Location实现浏览器跳转访问。

转发一次请求一次响应,重定向两次请求两次响应。

转发地址栏不发生变化,重定向地址栏会发生变化。

转发之前和转发之后request是一个,重定向之前和之后不是一个request。

Session生命周期?

答案:

当程序第一次调用到request.getSession()代码时,服务器明确的知道了需要用到session了,此时创建session。

如果session超过30分钟(可以在web.xml中配置的)没人使用,服务器认为这个session超时了,销毁session。

明确的调用session.invalidate(),session立即销毁。

服务器被非正常关闭或web应用被移除出容器,此时随着web应用的销毁session销毁.如果是正常关闭,session会被钝化.当下次服务器正常启动时,没有超时的session还会被活化回来。

session的原理?

答案:

session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。

1.15. cookie与session的区别

答案:

cookie数据存放在客户的浏览器上,session数据放在服务器上

cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE

JSP和Servlet是什么关系?

答案:

其实这个问题在上面已经阐述过了,Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP JSP有哪些内置对象?作用分别是什么?

JSP有9个内置对象:

- request:封装客户端的请求,其中包含来自GET或POST请求的参数;

- response:封装服务器对客户端的响应;

- pageContext:通过该对象可以获取其他对象;

- session:封装用户会话的对象;

- application:封装服务器运行环境的对象;

- out:输出服务器响应的输出流对象;

- config:Web应用的配置对象;

- page:JSP页面本身(相当于Java程序中的this);

- exception:封装页H 面抛出异常的对象。

JSP的九大隐式对象是哪九个

答案:

1:request: 请求对象 在javax.servlet.ServletRequest 作用域为Request来自客服端的请求,如:FORM表单中填写的信息,常用的方法有getParameter,getParamterName 和getParamterValue通过表用获取请求对象中包含的参数值。

2:response表示客服端的响应。

3:pageContext对象为页面的上下文对象,代表当请运行页面的一些属性。

4:session:对象代码服务器与客服端所建立的会话,比如在写购物,客服轨迹跟踪,

session”是建立在cookie的基础之上的。常用方法有getId,getValues等。

5:application对象负责提供应用程序在服务端运行时的一些全局信息,方法有getMimeType等。

6:out:与response不同,通过out对象发送的内容是浏览器需要的显示内容,还可以直接想客服端编写一个有程序动态生成的HTML的文件。

7:page:page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,就不见了。

8: exception:他是一个列外的对象,当页面发生了列外,就会会创建该对象。

9:config:是在servlet初始化Servlet的时候,JSP引擎向他传递信息用的,此消息包括Servlet初始化时所需要的参数。

如何防止SQL注入攻击呢?

答案:

SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

防止的方法:

(1) 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。

(2) 永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。

(3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

(4) 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。

(5) 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。

Mysql数据库优化

答案:

(1)查询时,能不用* 就不用,尽量写全字段名。

(2)索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100

(3)大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是么...

(4)多用explain 和 profile分析查询语句

(5)有时候可以1条大的SQL可以分成几个小SQL顺序执行,分了吧,速度会快很多。

(6)每隔一段时间用alter table table_name engine=innodb;优化表

(7)连接时注意:小表 jion 大表的原则

(8)学会用explain 和 profile判断是什么原因使你的SQL慢

(9)查看慢查询日志,找出执行时间长的SQL进行优化

(10)尽量避免使用order by

(11)因为where子句后面的条件是执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件放在最后

Filter 的作用是什么?

答案:

init为初始化方法,在Filter对象被创建出来时,Servlet容器会调用该方法对filter进行初始化。

destory为销毁的方法,在过滤器对象被销毁之前,服务器会调用这个方法执行善后工作。

doFilter为过滤器中最核心的方法,对访问的请求和响应进行拦截,当过滤器拦截到对资源的访问时,服务器会自动调用该方法执行过滤代码。 我们只需要在这个方法中设计过滤器的逻辑代码即可。

Filter的生命周期?

答案:

当服务器启动,web应用加载后,立即创建出这个web应用中的所有过滤器对象,创建出来后立即调用过滤器的init方法执行初始化操作.从此这些过滤器对象驻留在内存中为后续的拦截进行服务.每当拦截到资源时,都会导致dofilter方法执行.最终直到服务器关闭或web应用移除出容器时,随着web应用的销毁,过滤器对象销毁,销毁之前调用destory方法执行善后工作。

1.22. 什么是数据库连接池及其工作原理

答案:

对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

1.23. 如何自己实现一个数据库连接池

答案:

思路如下:

1:利用class实现DataSource接口

2:在class的构造器一次性创建指定的链接,将链接保存LinkedList中

3:实现getConnection从LinkedList返回一个链接

4:提供将链接放回方法

Public class MyDataSource inplements DataSource{

    Private LinkedList<Connection> dataSource=new LinkedList<>();

    Public MyDataSource(){

        For( int a=0;a<1000;a++){

            Try{

                DriverManager.registerDriver(new SQLServerDriver());

                Connection con=DriverManager.getConnection(“jdbc:sqlserver://localhost:3306;DatabaseName=liming”,”root”,”liming”

				 }catch(Exception e){



                }

                                                                                               }

         Public Connection getConnetion(){

            FinalConnection conn=dataSource.removeFirst();

             }

       Public void releasConnection(Connection conn){

               dataSource.add(conn);
  		}
	}

 }
http和https的区别?

答案:

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

Servlet的单例问题

答案:

Servlet是一个供其他java程序调用的类,它不能独立运行,针对客户端的多次请求,通常状况下,Servlet只会创建一个Servlet实例对象,一旦创建它就会驻留在内存中,为后续的请求提供服务,直至退出web应用为止,也就是当我们关闭了浏览器之后我们的Servlet就终止了。
当Servlet第一次访问的时候,就被加载到内存中,以后该实例对各个请求服务,没次情况会调用一次service方法。
这样会出现什么问题:因为Servlet是单例的,所以会出现线程安全问题

"" 和 null的区别

答案:

如果说str是null,那么内存根本没创建字符串对像,并由str引用。不能调用object的方法。

​ 如果说str是空串,那么确实存在一个由str引用的字符串对像,只不过这个字符串的值是""。长度为0;

​ 在获取请求参数的时候为什么要这样判断呢?

​ if(null==str || "".equals(str)){

​ return "不合法参数";

​ }

​ 如果我们在表单中什么都不填 接收到的字符串就是null;

​ 如果我们在表单中填“”,接受到的字符串是“”,但是存入数据库后,查询出来的就是null;

Servlet的多线程同步问题

答案:

  Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。
1.解决Servlet多线程同步问题的最好方式:去除实例变量,使用局部变量。
不使用成员变量,而使用局部变量,因为局部变量在每个线程中都有各自的实例。
 所以对Servlet来说,如果要对某个变量做写入操作,一定不要使用成员变量,而要使用局部变量。
2.使用同步代码块
 synchronized{}
3.Servlet实现javax.serlvet.SingleThreadModel,Servlet2.4中已经废弃了该接口,此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service()方法。

request.getParameter()和request.getAttribute()的区别?

答案:

a、request.getParameter()获取的类型是String;

request.getAttribute()获取的类型是Object

b、request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;

request.getAttribute()获取的是对象容器中的数据值/对象

c、request.setAttribute()和request.getAttribute()可以发送、接收对象;

request.getParamter()只能接收字符串,官方不开放request.setParamter()(也就是没有这个方法)

setAttribute()和getAttribute()的传参原理:

setAttribute()是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另外一个页面时,

应用服务器会把这块内存拷贝到另一个页面所对应的那块内存中。这个就可以通过getAttribute()获取到相应的参数值或者对象。

JSP中动态include和静态include的区别?

答案:

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

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

详细描述MVC。

答案:

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

Model:处理业务逻辑的模块。

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

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

EL表达式的功能,为什么要用EL表达式?(Expression Language)

答案:

功能:

a、从四个域对象中取出数据数据显示。

b、取出请求参数数据显示。

原因:

在页面中用jsp脚本和jsp表达式来获取数据显示比较麻烦

a、需要判断

b、可能需要强转

如何防止表单重复提交?

答案:

使用session技术:

a、在jsp页面中生成一个为一个随机值,将其保存到session中,同时将其保存为表单的隐藏域的值。

b、在处理注册的请求时,获取session中的值,获取请求参数的值,比较两者是否相同,如果相同说明不是重复提交,请求通过同时删除session中保存的的值,如果不相同则是重复提交,不能通过。

在数据库添加唯一字段

​ 在数据库建表的时候在ID字段添加主键约束,账号,名称的信息添加唯一性约束。确保数据库只可以添加一条数据。

什么是web容器?

答案:

给处于其中的应用程序组件(JSP、Servlet)提供一个环境,是JSP、Servlet直接跟容器中的变量交互,不必关注其他系统问题。

主要有web服务器来实现。例如:tomcat、weblogic、sphere、JBoss等。该容器提供的接口严格遵守J2EE规范中的web application标准。

我们把遵守以上标准的web服务器叫做J2EE的web容器。

J2EE常用的设计模式?说明工厂模式。

答案:

Java中一共有23中设计模式:

Factory(工厂模式)、Builder(建造模式)、Factory Method(工厂方法模式)、ProtoType(原始模型模式)、Singleton(单例模式)、

Facade(门面模式)、Adapter(适配器模式)、Bridge(桥梁模式)、Composite(合成模式)、Decorator(装饰模式)、

FlyWeight(享元模式)、Proxy(代理模式)、Command(命令模式)、Interpreter(解释器模式)、Visitor(访问者模式)、

Iterator(迭代子模式)、Mediator(调停者模式)、Memento(备忘录模式)、Observer(观察者模式)、State(状态模式)、

Strategy(策略模式)、Template Method(模板方法模式)、Chain Of Responsibility(责任链模式)、

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某个类的实例,通常一组类中有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

什么是事务?

答案:

事务时作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,

只有这样才能成为一个事务:

原子性:事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行。

一致性:事务在完成时,必须使所有的数据保持一致的状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。

隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前

的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播

一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

持久性:事务完成后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

数据库有几种隔离级别?

答案:

1、Serializable (串行化):可避免脏读、不可重复读、幻读的发生

2、Repeatable read (可重复读):可避免脏读、不可重复读的发生。

3、Read committed (读已提交):可避免脏读的发生。

4、Read uncommitted (读未提交):最低级别,任何情况都无法保证

简述web.xml的作用

答案:

属于部署描述符,在整个JAVA中只要是容器都会存在部署描述符,此部署描述符可以控制整个WEB中各个组件的运行状态,也可以配置整个窗口的状态

sql优化:(索引、范式)

答案:

三范式:

第一范式(确保每列保持原子性)最基本范式。数据库表中所有字段值都是不可分解的原子值,就满足了第一范式。

第二范式(确保表中的每列都和主键相关)在第一范式上更近一层。确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关,也就是说一个表中只能保存一种数据,不可以吧多种数据保存在一张表中。

第三范式:确保每列都和主键列直接相关,不是间接相关

索引:

避免对索引字段进行计算、避免索引在字段上使用not、<>、!=、避免在索引上使用IS NULL和NOT NULL避免在索引列上出现数据类型转换、避免索引字段使用函数、避免建立索引的列出现空值

Ajax原理

答案:

Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

Ajax其核心只有JavaScript、XMLHttpRequest和DOM,在旧的交互方式中,由用户触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTML页到客户端, 每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去重新读取整个页面。而使用Ajax后用户从感觉上几乎所有的操作都会很快响应没有页面重载(白屏)的等待。

SQL注入攻击

答案:

SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。

SQL注入攻击是输入参数未经过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为,称之为SQL注入攻击。

如何防止SQL注入攻击

答案:

利用新对象PreparedStatement对象完成,先将SQL骨架发送给数据库服务器,然后再将参数单独发给服务器,并将参数中的关键字当做一个普通字符串来处理,进而起到防止SQL注入的问题

对连接池的理解

答案:

用来提高程序的效率,创建一个容器,容器中存放已经获取到了的数据库连接对象,对外提供获取连接和还回连接的方法,外界需要时就从容器中获取,用完就还回容器中。

HTML和xml的区别?

答案:

XML是可扩展标记语言,而HTML超文本标记语言。不同之处:

1、语法有所不同。XML语法比较严谨而HTML语法比较松散。

2、用途不同。XML主要用于数据格式化存储而HTML主要用于网页的编辑。

在JS中== 和 ===的区别?

答案:

简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢,

这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行 ``=== 比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而 ===`比较时, 如果类型不同,直接就是false.

操作数1 == 操作数2,  操作数1 === 操作数2

比较过程:

  双等号==: 

  (1)如果两个值类型相同,再进行三个等号(===)的比较

  (2)如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:

    1)如果一个是null,一个是undefined,那么相等

    2)如果一个是字符串,一个是数值,把字符串转换成数值之后再进行比较

  

  三等号===:

  (1)如果类型不同,就一定不相等

  (2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)

  (3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。

  (4)如果两个值都是true,或是false,那么相等

  (5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等

  (6)如果两个值都是null,或是undefined,那么相等
SQL优化

答案:

\1. SELECT子句中避免使用‘*’

\2. SQL语句用大写的

\3. 用IN来替换OR

\4. 查询语句中不要使用 *

\5. 尽量减少子查询,使用关联查询(left join,right join,inner join)替代

\6. 减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代

\7. or 的查询尽量用 union或者union all 代替

\8. 合理的增加冗余的字段(减少表的联接查询)

\9. 增加中间表进行优化(这个主要是在统计报表的场景,

Tomcat配置,部署优化

答案:

\1. 内存优化:Tomcat依赖于JVM,可以配置JVM的内存配置

\2. 最大连接数配置(并发能力)

通常搭配Nginx提升Tomcat的并发性能

自动刷新,定时刷新

答案:

自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新例如:

Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");

其中1000为时间,单位为毫秒。URL指定就是要跳转的页面(如果设置自己的路径,就会实现每过一秒自动刷新本页面一次)

BS和CS的区别?

答案:

\1. C/S用户固定,并且处于相同区域,要求拥有相同的操作系统。B/S要有操作系统和浏览器就行。与操作系统平台无关。

\2. C/S客户端的计算机电脑配置要求较高。B/S客户端的计算机电脑配置要求较低。

\3. C/S每一个客户端都必须安装和配置软件,客户端不必安装,使用浏览器访问,易推广。B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。

\4. C/S每一个客户端都要升级程序。可以采用自动升级。BS客户端不必安装及维护。

\5. C/S一般面向相对固定的用户群,程序更加注重流程,它可以对权限进行多层次校验,提供了更安全的存取模式,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S结构适宜。

说一下HTTP协议,它是哪一层的协议

HTTP协议就是一套基于tcp/ip协议的应用层协议 。简单来说,就是一个基于应用层的通信规范,双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。它规定了客户端(通常是浏览器)和服务器之间的通信方式。

它的特点就是一次请求,一次响应。

响应状态码你知道哪些?

200 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。

404 找不到资源,一般是访问路径不对。

500 服务器端出现异常,不能正常响应。

302 请求重定向的时候响应此状态码。

400 请求参数有误,一般是请求的参数不能解析。

网络的七层协议,五层协议

七层是指OSI七层协议模型,主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。

五层体系结构包括:应用层、运输层、网络层、数据链路层和物理层。

ArrayList底层是怎样的
  1. 存在于java.util包中。
    
  2. 内部用数组存放数据,封装了数组的操作,每个对象都有下标。
    
  3. 内部数组默认初始容量是10。如果不够会以1.5倍容量增长。
    
  4. 查询快,增删数据效率会降低。
    
LinkedList底层实现

LinkedList的底层是通过链表来实现的。链表是由多个节点构成,每个节点都包含三个部分,头部指向上一个节点,中部指向该节点,尾部指向下一个节点。

在增删数据的时候效率比较低

HashMap底层原理

HashMap底层是一个Entry数组,默认大小是16,当存放数据时,会根据hash算法计算出当前数据的位置,算法就是 hash(key)%n.n就是数组的长度,位置就是数组中每个对象所对应的下标。

当计算的位置没有数据时,就直接存放,当计算的位置有数据的时候,也就是发生hash冲突的时候,那么就会采用链表的形式进行存储,在对应的数组的位置存放链表的头结点,对链表而言,新加入的结点会从头结点接入。当链表的长度超过8时,会采用红黑树的形式进行存储。

HashMap

Object类有哪些方法

equals()

toString()

getClass();

hashCode();

wait();

String 字符常量池

String A=”123”;

String B=new String(“123”);

生成了几个对象?答案:如果字符串常量池中原来没有“123”,就生成了两个对象;

如果原来有,就生成了一个对象。

数据的隔离级别有什么,举个例子。

1、Serializable (串行化):可避免脏读、不可重复读、幻读的发生

2、Repeatable read (可重复读):可避免脏读、不可重复读的发生。

3、Read committed (读已提交):可避免脏读的发生。

4、Read uncommitted (读未提交):最低级别,任何情况都无法保证

单例模式了解吗?写一个单例模式(建议几种都写出来)

单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。其中单例模式最重要的是确保对象只有一个。简单来说,保证一个类在内存中的对象就一个。

  • 优点:
    • 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
    • 避免对资源的多重占用(比如写文件操作)。
  • 缺点:
    • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
JDK1.7和1.8的区别是什么?
  1. 在jdk1.8中取消了永久代,取而代之的是Metaspace,这个空间不占用jvm虚拟机的内存,而是占用物理机的内存
  2. 如果我们new的小对象,会进去新生代,二如果new的大对象的话,不会进入新生代而是直接进入老年代
线程有哪些状态,你说一下吧

新建状态、可运行状态、运行状态、终止状态、阻塞状态。

nginx是怎么把用户请求均匀地分发到服务器的?

通过负载均衡实现

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

怎么侦察到宕机的服务器?

通过心跳检测机制。

是直连数据库还是用的什么中间件去连接的数据库?

使用中间件,例如mycat,通过数据库代理服务器,可以对数据库进行读写分离的配置。

支持读写分离,支持Mysql双主多从,以及一主多从的模式

mybatis里的缓存你知道吗?

一级缓存

默认开启

SqlSession级别的缓存,实现在同一个会话中数据的共享

一级缓存的生命周期和SqlSession一致

当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。

二级缓存

默认不开启,需手动开启

SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量

可自定义存储源,如Ehcache

当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库

不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现

实体类实现序列化,在mapper文件中开启 <cache>

在配置文件中设置cacheEnabled为true

mybatis加这么个缓存的目的是什么?

减少对数据库直接的访问频率,减少对数据库的访问压力。

java 的 Integer 和 int 有什么区别?

int 是 java 内置基本数据类型之一,java 为每个基本类型都提供了一个封装类,Integer 就是 int 的封装类(也叫包装类型);int 变量的默认值为 0,Integer 变量的默认值为 null,所以 Integer 可以区分出未赋值和值为 0 的区别;Integer 类内部提供了一些关于整数操作的方法,例如上文用到的表示整数的最大值和最小值。

重载和重写的是什么,规则是什么,有什么区别

重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。

重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用 super 关键字。

重载规则:必须具有不同的参数列表;可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常。

重写规则:参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;返回类型必须一直与被重写的方法相同,否则不能称其为重写而是重载;访问修饰符的限制一定要大于等于被重写方法的访问修饰符;重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,譬如父类方法声明了一个检查异常IOException,在重写这个方法时就不能抛出 Exception,只能抛出 IOException 的子类异常,可以抛出非检查异常。

重载与重写是 Java 多态性的不同表现,重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定),而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。

Java构造方法能否被重写和重载

重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能被重写的。而重载是针对同一个的,所以构造方法可以被重载。

Java创建对象的方式有几种?

常见的创建对象方式主要有 5 种,该题在某些场合下会变着法子问你除过 new 的方式外还可以怎么创建对象,答案都是一样的,如下。

(1).使用 new 关键字(调用构造方法);

(2).使用 Class 类的 newInstance 方法(调用构造方法);

(3).使用 Constructor 类的 newInstance 方法(调用构造方法);

(4).使用 clone 方法(没有调用构造方法);

(5).使用反序列化(没有调用构造方法);

Java有哪些访问修饰符?

Java 的访问修饰符关键字主要有 public、protected、default、private 四个,其决定了紧跟其后被定义的东西可以被谁使用,具体的区别如下所示。

public 访问权限为当前类、同一个包、同包子类、非同包子类、其他包都可用。

protect 访问权限为当前类、同一个包、同包子类、非同包子类,其他包下无法访问到。

default 访问权限为当前类、同一个包,同包子类、其他包下和非同包子类无法访问到。

private 访问权限为当前类,同一个包、同包子类、非同包子类、其他包都无法访问到。

说说 hashCode() 的返回值和 == 的关系?

若 == 返回 true 则两边对象的 hashCode() 返回值必须相等,若 == 返回 false 则两边对象的 hashCode() 返回值有可能相等,也有可能不等;因为在 Java 中对象默认的 equals 方法实现就是 == 比较,而Java 对于 eqauls 方法和 hashCode 方法的规定是如果两个对象 equals 方法相等则它们的 hashCode 值一定要相同,如果两个对象的 hashCode 相同则它们的 equals 方法并不一定相同,所以可得出上面结论。

什么是缓冲区?有什么作用?

缓冲区就是一段特殊的内存区,应对频繁操作资源文件时效率变低的问题.

字节流和字符流哪个好?怎么选择?

缓大多数情况下使用字节流会更好,因为字符流是字节流的包装,而大多数时候 IO 操作都是直接操作磁盘文件,所以这些流在传输时都是以字节的方式进行的(图片等都是按字节存储的)。

而如果对于操作需要通过 IO 在内存中频繁处理字符串的情况使用字符流会好些,因为字符流具备缓冲区,提高了性能。

jsp和servlet有哪些相同点和不同点,他们之间的联系是什么

联系:

JSP本质上就是Servlet,JSP经过编译之后就变成了Servlet

区别:

(1).JSP注重的页面展示,Servlet注重的是逻辑控制

(2).Servlet中没有内置对象,JSP中有内置对象(Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到)

什么是Tomcat

Tomcat是一种web服务器,java编写的web项目可以部署在上面,用户在客户端请求时,都是将请求发到Tomcat上,Tomcat在将请求发到对应的项目上

get和post请求的区别?

(1).get是用来从服务器上获取数据,而post是用来向服务器传递数据

(2).get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者用"?"连接,变量之间用"&"连接;而post是将表单中的数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL。

(3).get是不安全的,因为在传输过程中,数据是被放在请求的URL中;而post的所有操作对用户来说都是不可见的。

(4).get传输的数据量小,这主要因为受url长度限制;而post可以传输大量的数据,所有上传文件只能用post提交。

(5).get限制form表单的数据集必须为ASCII字符;而post支持整个IS01 0646字符集。

(6).get是form表单的默认方法。

什么时候调用doGet()和doPost()?

默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法;为get的时候,调用deGet()方法。

转发和重定向的区别

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

转发:客户端发送一次请求,得到一次响应,地址栏不会发生变化,属于服务器内部资源的跳转,只能在同一个WEB应用内部

重定向:客户端发送两次请求,得到两次响应,通过302状态码和location响应头就可以实现请求重定向,地址栏会发生变化,可以访问不同WEB应用的资源.

什么是MVC?

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

Model:处理业务逻辑的模块。

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

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

有几种数据访问冲突?

脏读:读取到其他事务未提交的数据

不可重复读:一个事务提交的数据,可以被另一个事务立即读取,可能发生与第一次查询数据不一致

幻读:读取到已经被删除的数据,读取不到新插入的数据

Maven是什么?

是一个项目的统一管理构建工具,统一管理jar包和依赖

如何提高系统的性能(响应时间)?

A请求数据传输时间

提高带宽

减少数据传输,压缩数据大小,CDN服务(静态资源就近部署访问),添加缓存

B请求数据的处理时间

硬盘,CPU,内存

优化服务架构,数据处理算法

C响应数据的传输时间

D响应数据的渲染时间 DOM元素的设计

Mybatis是什么?(谈谈你对Mybatis框架的理解)

Mybatis是一个持久层的框架,主要负责解决数据持久化以及映射(ORM)操作,是对JDBC操作的封装和简化.(半自动的ORM框架,解决对象关系映射问题.如何理解ORM:实现对象以及对象关系的映射)