Java面试题
- final finally(return先执行还是finally代码先执行) finalize 区别?
final用于修饰类,方法,属性。修饰类时,该类不能被继承,final修饰的类不允许为abstract抽象类,类中的所有方法都不能被重写。
final修饰的方法不能被重写,但是子类中可以用父类中final修饰的方法。
final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的。
方法内声明的类或者方法内的匿名内部类,访问该方法内定义的变量,该变量必须要用final修饰。当内部类访问局部变量时,会扩大局部变量的作用域,如果局部变量不用 final 修饰,
我们就可以在内部类中随意修改该局部变量值,而且是在该局部变量的作用域范围之外可以看到这些修改后的值,会出现安全问题。
Finally通常和try catch搭配使用,保证不管有没有发生异常,资源都能够被释放(释放连接、关闭IO流)。
Finalize是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收。垃圾回收只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收,这个方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用。
2.Abstract类中必须有Abstract方法吗?有Abstract方法的类必须是Abstract类吗?
Abstract方法有方法体吗?Abstract可以用private修饰吗,为什么?Abstract可以被final修饰吗,为什么?Abstract可以被static修饰吗,为什么?
抽象类中不一定需要存在抽象方法,但是有抽象方法的类必须是抽象类。抽象方法不能有方法体,抽象方法不能实例化需要被子类继承实现类中的抽象方法,所有抽象类、抽象方法不能使用private、final、static修饰,否则就不能重写。
3.select查询语句的子句查询顺序,包含select、where、from、group by、having、order by字句?
From-where-join/笛卡尔积-group by –having-select-dictinct-order by-limit
4.throw 和 throws 的区别?
throw用于抛出异常时使用,如throw new RunTimeException(e);
throws用于声明该方法可能抛出异常
5.如何理解JavaScript和JQuery?
javaScript的简写形式就是JS,是由网景公司开发的一种脚本语言,一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能(其编写的程序可以被嵌入到HTML或XML页面中,并直接在浏览器中解释执行)。主要由ECMAScript基本语法、BOM浏览器对象模式(history、navigator、document、location、screen)、DOM文档对象模式组成。
jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互。 jQuery是当前很流行的一个JavaScript框架。
6.如果在项目的页面中,长时间未响应,当如何处理,或者如何避免这样的情况?
优化sql,不要再查询数据的时候浪费时间。有时候无需存sql的时候,之间存内存更快。
尽量使用静态页面,减少HTTP请求。
减少代码冗余
7.Ajax介绍下,特点、核心是什么?
Ajax即异步JavaScript和XML,是一种用来改善用户体验的技术,其实质使用XMLHttpRequest对象异步地向服务器发请求。服务器返回部分数据,而不是一个完整的页面,以页面无刷新的效果更改页面中的局部内容。
8.Spring的理解?
Spring是一个开源的框架,为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。Spring的主要核心包括:控制反转(IOC)、依赖注入(DI)、面向切面编程(AOP)。Spring是一种轻量级的,非侵入性的Java开发框架。可以整合其他框架,提供事务管理。
9.Severlet生命周期?JSP生命周期?线程的生命周期?
线程:new一个线程后,获得一个线程对象。调用start()方法使线程处于就绪状态等待启动,当获得cpu时间片后线程启动,调用yield()方法会让出cpu时间片变为就绪状态,因为I/O操作、sleep()、join()使线程变为阻塞状态,最后结束线程。
Servlet:Servlet生命周期的三个方法:init()--service()--destroy();
生命周期的各个阶段:实例化:Servlet容器加载servlet服务,创建Servlet类的实例对象。
初始化:Servlet容器调用Servlet的init()方法
服务:当客户端发送请求时,调用service()方法
销毁:销毁实例之前调用destroy()方法
不可用:销毁实例并标记为垃圾处理
JSP:1.解析:web容器将JSP解析为servlet源文件
2.编译:servlet容器将servlet源文件编译成serlvet类
3.初始化:创建是servlet实例,调用初始化方法。
4.执行阶段:根据客户端发送请求调用服务方法
5.销毁阶段:销毁servlet实例,销毁前调用destroy()
9.常量池?线程池?连接池?各是什么,优点及特点是什么?
常量池:常量池有字符串常量池和Integer类型常量池,当声明一个字符串或一个Integer数值时(-128-127),会创建一个常量池将创建的数据存入常量池,当再次声明一个时若常量池中存在则直接赋值不会再新创建一个对象。
线程池:是以一个或多个线程循环执行多个应用逻辑线程的集合。
连接池:连接池允许多个客户端使用缓存起来的连接对象连接数据库,它们是共享的、可被重复使用的。
使用池的优点:有效管理创建对象的数量,减少内存开销,连接池可以限制连接对象,维护数据库的稳定性,避免因为请求过多后造成的数据库崩溃。
10.ArrayList的默认容量是?
10,去点击ArrayList类信息看看。
ArrayList a = new ArrayList(10);扩容了几次?
1次
11.this代表了什么?
this代表当前对象的引用,可以使用this关键字来调用静态属性,
可以通过this语句来实现构造函数的调用,可以通过this调用私有方法或者私有属性,
不可以在主方法中使用this来调用其他的方法。(main方法是static修饰的静态方法,计算机不能识别this)
12.构造器可以用private修饰吗?要如何实例化它?
可以使用private修饰构造器,如单例模式、懒汉模式。使用静态代码块初始化构造器,在类中直接声明对象,在创建一个方法getInstance()来获得对象。
13.什么是静态代码块?局部代码块?构造器代码块?他们的作用是什么?
局部代码块:
作用:控制变量的生命周期;
在程序中,当我们已经使用完 x 后,并且在接下来的代码中,不会再用到x,那么就没必要让x 在内存中占用空间了,这用情况下,可以使用局部代码块,将x及其所设计到的区域封装为局部代码块,他们在程序执行中顺序不变,只是在执行完成后消失。
构造代码块:
作用:它可以给所有对象进行初始化,存在于类中。
当类中的构造方法以重载的形式存在时,并且有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化;这样可以减少代码的重复!
何时被调用呢?
在构造器被super()使用完才会被调用,所以是构造代码块!
静态代码块:
特点:
1. 随着类的加载而执行,而且只一次。
2. 优先于主函数执行。
作用:给类进行初始化。
当类中的方法都被静态了化,并且构造方法被private了,这是我们不能,在将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块
14.多态的理解,满足什么样的情况才能实现,什么是编译时多态和运行时多态?
多态为类中方法的实现提供了多种方式。
继承和封装在某种程度上可以说是为多态准备的。
方法重载都是编译时多态。根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法中的哪一个。
运行时多态,也就是动态绑定,是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断并调用相应的属性和方法.
15.所有的父类资源都能被继承吗?static修饰的资源是谁的?private修饰的变量和方法可以被子类继承吗?
父类中的私有属性和私有方法不能被子类继承,static修饰的资源属于这个类的,存在与方法区中。private修饰的变量和方法不能被子类继承。
16.接口中有什么?可以继承多接口吗?所有的类在实现了接口之后必须实现接口中的方法吗?抽象类呢?
接口中包含public static final 修饰的常量和public abstract 修饰的抽象方法,一个接口可以继承多个接口。当抽象类实现接口后可以不用实现接口中的方法。
17.线程是同步执行的吗?线程是依赖于什么来运行?怎么分配,随机的吗?会产生什么问题?如果避免?有几种写法?有什么区别?
线程执行需要获取cpu时间片,对于一个cpu情况下是不能同步执行的,需要cpu分配cpu时间片才能够被执行。多线程并发会产生安全问题,要使用synchronized同步锁来解决线程安全的问题,锁对象,同步代码块
18.介绍下什么是增强for循环,和迭代器有什么区别?迭代器是new出来的吗?是谁的方法?迭代器的关键的api方法是哪两个?谁可以删除set实现类里面的元素?
增强for循环是java5后的新特性,用于遍历数组和集合的时候使用,在遍历过程中不能对元素进行修改。在编译期增强for循环就会被编译为迭代器的形式,增强for循环的本质就是迭代器遍历。迭代器是通过iterator()创建处理的,是集合的方法。hasNext(),next(),remove()用于删除元素。
19.什么是递归?
递归作为一种算法在程序设计语言中被广泛利应用,只指函数/子程序/过程在运行过程中直接或间接调用自身而产生的重入现象。
主要用于解决三种问题:1、数据的定义是根据递归算法定义的(斐波那契函数);2、问题解决是按递归算法实现的(回溯算法)3、数据的结构形式是按递归定义的(树的遍历)
20.+=和=-和=+和=a+b
a+=b --> a=(a.Type)a+b;//返回的是a类型
a=a+b --> a=a+b;//返回类型是a类型与b类型中的最高类型
a=-b -->把b的值负数化然后赋值
a=+b -->并没有起到什么作用
21.那是不是任何一个方法都有return语句?当一个方法返回值返回值类型为void的时候,可以使用return方法吗?构造方法有return语句吗?
当方法没有返回值为void时不需要使用return。当返回值类型为void时,可以使用return方法来结束方法。构造方法中也可以有return方法,用来结束方法。
22.this代表当前对象的引用,可以怎么用,与他类似的关键词是super?
可以用this语句来实现构造方法的调用,可以通过this调用私有方法和私有属性。
super用来调用父类中的可继承的构造方法,方法和成员属性。
this可以调用私有的属性和方法吗?可以调用静态方法或者属性吗,
this不能调用静态方法或静态属性,因为静态方法属于类的存在于方法区,不能识别this。
那在主方法中呢?
不可以,main方法是静态方法不能使用this。
那super呢?
super不能调用父类private修饰的变量和方法。
23.构造方法的作用是什么?初始化构造方法可以被私有化private修饰吗?如果可以要怎么创建对象?
静态代码块。
构造函数可以重载,不可以被重写也不能被继承?
是的
构造方法有return语句吗?
可以有
24.String StringBuilder StringBuffer 三者的区别。
String类是不可变类,任何对String的改变都会引发新的String对象的生成。
StringBuffer 的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer 的toString()方法;线程安全;
StringBuilder 是从JDK 5 开始,为StringBuffer 该类补充了一个单个线程使用的等价类;通常应该优先使用StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
25.set list collection collections者区别?说出几个实现类?
Collection 是java.util 下的接口,它是各种集合的父接口,继承于它的接口主要有Set 和List;
Collections 是个java.util 下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
List 是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List 中的位置,类似于数组下标)来访问List 中的元素,这类似于Java的数组。
同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList 是线程不安全的,不是同步的;数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList 却是原来的一半。
ArrayList 是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
26.什么是同步锁?什么是互斥锁?什么是死锁?
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
死锁:两个线程都在等待对方释放锁。
死锁的必要条件?怎么克服?
解答:产生死锁的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
死锁的解决方法:
a 撤消陷于死锁的全部进程;
b 逐个撤消陷于死锁的进程,直到死锁不存在;
c 从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
d 从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态
27.线程的优级问题。
线程优先级有10个等级,分别用数字1-10表示
其中1最低,10最高,5为默认值
理论上,优先级越高的线程,获取CPU时间片的次数多。
28.synchronized与Lock区别:
总结来说,Lock和synchronized有以下几点不同:
1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5)Lock可以提高多个线程进行读操作的效率。
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时
(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使
用时要根据适当情况选择。
29.对内部类的理解?main方法可以new内部类吗?为什么?要怎么改进?
30、cookie和session的区别?cookie和session的优势和劣势?
1、cookie数据存放在客户的浏览器上,session数据行在服务器上;
2、cookie的安全性很低,非常容易通过截取数据包来获取;
3、cookie只能保存文本数据,session可以保存任何类型数据;
4、单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie;
5、session会在一定时间(30分钟左右)内保存在服务器上,当访问增多会比较占用服务器的性能。
session缺点:如果用户将浏览器设置为禁用cookie,那用户将无法使用session。session会在一定时间内保存在服务器上,当访问增多会比较占用服务器的性能。
31、jsp 有哪些内置对象?作用分别是什么?
request对象:封装了来自客户端、浏览器的各种信息。
response对象:封装了服务器的响应信息。
out对象:用于向客户端、浏览器输出数据。
application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。
page对象:指向了当前jsp程序本身。
session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
config对象:封装了应用程序的配置信息。
exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
32、tomcat和oracle同时开启会发生什么。端口的修改方式和默认端口号?
会发生8080端口冲突,通过修改Servers目录下server.xml中port的端口号
33、get 和 post 的区别?
解答: Form 中的 get 和 post 方法,在数据传输过程中分别对应了 HTTP 协议中的
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 支持整个 ISO10646 字符集;
6) Get 是 Form 的默认方法
34、Session 的基本原理是什么?
答: Session 对象的原理在于,服务器可以为客户端创建并维护一个所谓的 Session 对
象,用于存放数据。在创建 Session 对象的同时,服务器将会为该 Session 对象产生一个
唯一编号,这个编号称之 为 SessionID,服务器以 Cookie 的方式将 SessionID 存放在客户端。当浏览器再次访问该服务器时,会将 SessionID 作为 Cookie 信息带到服务器,服务
器可以通过该 SessionID 检索到以前的 Session 对象,并对其进行访问。需要注意的是,此时的 Cookie 中仅仅保存了一个 SessionID,而相对较多的 会话数据保存在服务器端对应的Session 对象中,由服务器来统一维护,这样一定程度保证了会话数 据安全性,但增加了服务器端的内存开销。存放在客户端的用于保存 SessionID 的 Cookie 会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个
“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享
一个 Session 对象,因为这些请求携带了相同的 SessionID 信息。 Session 对象的正常使用要依赖于 Cookie。如果 考虑到客户端浏览器可能出于安全的考虑禁用了 Cookie,应该使用URL 重写的方式使 Session 在客户 端禁用 Cookie 的情况下继续生效。
35、解释四种会话跟踪技术?
解答:隐藏表单域、 URL 重写,Cookie、 Session。
1)隐藏表单域: <input type="hidden">,非常适合步需要大量数据存储的会话应用。
2) URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3) Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将
它作为 HTTP 响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个 Cookie 头标将之返回到服务器。与其它技术比较, Cookie 的一个优点是在浏览器会话结束后,甚至 在客户端计算机重启后它仍可以保留其值。
4) Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
36、forward 和 redirect 的区别
1、重定向到指定URL,前后页面不是一个request
请求转发前后页面共享一个request
2、重定向客户端跳转地址栏中的地址会发生改变
请求转发是服务端跳转地址栏中的地址不会发生改变
3、重定向跳转到指定的URL地址后,上个页面中的请求全部结束,原request对象将会消亡,数据将会消失。接着当前新页面会新建request对象。
请求转发方式在跳转页面的时候是带着原来页面的request和response跳转的,request对象始终存在。
4、重定向时需要传递参数,那只能在url后加参数。转发请求可以将参数用 request.setAttribute()传递参数
5、重定向可以重定向到任何URL,创发只能为一个web应用程序中的某个资源
37、什么是泛型?他的作用是什么?
泛型是Java SE 5.0引入的特性,泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定。Java泛型机制广泛的应用在集合框架中。所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中的对象类型。Java编译器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性。
38、自动创建索引的约束的是?
唯一约束和主键约束
39、三种get方式的发送请求?
url、地址栏、表单的默认方式
40、map的遍历取值的方式?
Set<String> keyset=map.keySet();
for(String key:keyset){
Objcet value=key.get (key);
}
Set<String,Object> entrySet=map.entrySet();
for(EntrySet<String,Object> e:entrySet){
String key=e.getKey();
Object value=e.getValue();
}
41.使用jQuery的ajax请求有哪些?
最底层$.ajax(),第二层load()、$.get()、$.post(),第三层$.getScript()和$.getJSON()
最常用的是第二次,项目中用的是最底层,目的是让你更好的了解底层。
42.使用原生js写ajax要注意那几点,或者说那几个步骤,核心是哪个对象,对象属于谁?
1、创建对象,判断是不是ie5/6(以ActiveXOject的方式引入XMLHttpRequest对象的),
其他浏览器创建XMLHttpServlet对象(是window子对象)
2、实例化之后用open方法,指定发送方式,url路径,是否异步
3、readyState值的改变,会激发readystatechange事件,然后可以绑定需要处理的函数
(回调函数)。
4、函数可以通过readyState和status属性的改变再判断是否做出处理。
5、然后用send()方法发送请求。
43.什么是mvc?springmvc是什么?strust2?
MVC模式(Model-View-Controller)是一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
模型(Model)的职责是负责业务层逻辑,包括业务数据和业务处理逻辑;
视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
控制器是模型层和视图层之间的桥梁,用于控制流程。
Spring是一个开源的框架,为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。Spring的主要核心包括:控制反转(IOC)、依赖注入(DI)、面向切面编程(AOP)。Spring是一种轻量级的,非侵入性的Java开发框架。可以整合其他框架,提供事务管理。
44.statement和preparedstatement区别?
Statement适合执行静态SQL语句
PreparedStatement适合执行含有动态信息的SQL语句
优点:
1:使用PS可以避免SQL注入攻击——不需要将动态信息拼接到SQL中,所以定义SQL语句时复杂度低。
也不会因为拼接了SQL关键字等信息导致SQL拼接后的语义改变,避免SQL注入攻击。
2:执行预编译SQL语句——在批量执行相同SQL语句,但是数据不同时,PS的
执行效率高于Statement
因为使用Statement执行一条SQL语句到数据库时,数据库首先会解析该条SQL语句并为其创建一个执行计划(开销很大)。相同的SQL语句会重用执行计划,但是只要内容有改变就一定创建新的执行计划。
PS在执行语义相同,但是内容不同的SQL语句时,只会使用同一个执行计划,所以开销小。
45.ThreadLocal是什么?
将当前线程创建的XXX变量存入到ThreadLocal,ThreadLocal的内部有一个Map,其中key是调用set方法的线程,value是set方法传入的当前线程要保存的值。调用ThreadLocal的get方法的线程在获取值时,ThreadLocal会用当前这个线程作为key取内部Map中对应的value。
46.ServletContext和ServletConfig的区别?
ServletContext是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Webapp时,会为它创建一个ServletContext对象,即servlet上下文环境。每个webapp都有唯一的ServletContext对象。同一个webapp的所有servlet对象共享一个ServeltContext,servlet对象可以通过ServletContext来访问容器中的各种资源。
Jsp/Servlet容器初始化一个Servlet类型的对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。Jsp/Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig类型的对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与ServletConfig类型的对象建立关联关系。getInitParameter():根据给定的初始化参数,返回匹配的初始化参数值。
47.为什么要用cookie?cookie是否能存放中文,如果不行得怎么办?cookie的存放周期及存放位置?
默认情况下是怎么样存放?
cookie存放的数据是什么类型,为什么只能是String类型,浏览器只能识别String类型?
什么是cookie的路径问题?会全部都发送给应用吗,默认路径是什么?怎么解决?
如cookie被用户禁用了要怎么办?重写URL?
cookie的缺点?
1、一段小文本,只能存放少量数据,4KB 2、安全性太低,不存放敏感数据 3、大量存放cookie占用带宽
48、session的工作原理?什么时候session超时?session能存放什么数据类型?session使用场景?session的优缺点?
Session 对象的原理在于,服务器可以为客户端创建并维护一个所谓的 Session 对
象,用于存放数据。在创建 Session 对象的同时,服务器将会为该 Session 对象产生一个
唯一编号,这个编号称之 为 SessionID,服务器以 Cookie 的方式将 SessionID 存放在客户端。当浏览器再次访问该服务器时,会将 SessionID 作为 Cookie 信息带到服务器,服务
器可以通过该 SessionID 检索到以前的 Session 对象,并对其进行访问。需要注意的是,此时的 Cookie 中仅仅保存了一个 SessionID,而相对较多的 会话数据保存在服务器端对应的Session 对象中,由服务器来统一维护,这样一定程度保证了会话数 据安全性,但增加了服务器端的内存开销。存放在客户端的用于保存 SessionID 的 Cookie 会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个
“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享
一个 Session 对象,因为这些请求携带了相同的 SessionID 信息。 Session 对象的正常使用要依赖于 Cookie。如果 考虑到客户端浏览器可能出于安全的考虑禁用了 Cookie,应该使用URL 重写的方式使 Session 在客户 端禁用 Cookie 的情况下继续生效。
当停留在一个页面不动没有数据请求则没有打开其他页面超过30分钟则超时。
Session可以存放任意数据类型的数据,使用session来检测用户是否登录功能。
49、你是如何实现验证码功能的?
50、UUID?MD5?BASE64?分别介绍下再项目中使用,及简单介绍下。
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。可在项目用上传文件时重命名使用。
MD5是一种网络加密技术,用于加密用户提交的密码,登录秘钥等私密信息。
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。以“迅雷下载”为例: 很多下载类网站都提供“迅雷下载”的链接,其地址通常是加密的迅雷专用下载地址。其实迅雷的“专用地址”也是用Base64"加密"的