1.面向对象的三个基本特征是什么,请分别进行描述。
面向对象的三个基本特征:封装,继承,多态。
(1)封装:封装分为两部分,对属性的封装和对方法的封装。封装就是把过程和数据包围起来,外界对数据的访问只能通过已定义的方法进行访问,即封装是一种信息隐藏技术。
(2)继承:继承就是将已经存在的基础类建立新类的技术,新类的定义可以增加新的属性和功能,同时也拥有父类的功能,继而达到代码复用的目的,缩短项目开发周期。
对继承的深度理解:父类无论公有还是私有的方法,全部纳入子类,但是父类中私有的属性和方法不能被子类访问。
(3)多态:即多种形态,编程时不能确定变量指向的是什么对象,运行期间才能确定对象,从而确定调用的具体方法。
即:父类Animal,子类 Dog. 多态体现:Animal dog = new Dog();
2. 请说出servlet的生命周期,并说出servlet和cgi的区别。
Servlet的生命周期:加载和实例化servletà初始化init()à执行service()方法,接受请求和相应请求àdoPost()或者doGet()à销毁destroy()
Servlet与CGI的区别:servlet处于服务器进程中,它可以通过多线程的方式运行其service方法,一个实例可以服务于多个请求,并且实例一般不会被销毁,而CGI对每个请求都会产生新的进程,服务完后就销毁,效率低于servlet。
3. Hashmap和hashtable的区别,并且写出你常用的一些方法。
区别:(1)HashMap是线程不安全的,HashTable是线程安全的。
(2)HashMap效率高,HashTable相对效率低。
(3)HashMap和HashTable存储的值都是(key,value)对,HashMap的key值可以为null,但是HashTable的key值不能为空。
常用的HashMap中的方法:
HashMap<String,String> hashMap=new HashMap();
hashMap.put(“1”,”apple”);
h.putAll(new HashMap<String,String>());
h.get(key);
4. 在程序运行时,我们经常后台看到error和exception,请说出他们的不同。
Error:表示系统级别的错误和程序不必处理的异常。
Exception:表示需要捕获或者需要程序进行处理的异常。
5. 说说forward和redirector的区别。
forward表示页面跳转,地址栏不会发生变化,将request,response带到要跳转的页面。
redirector表示页面重定向,向服务器发出新的请求,地址栏发生改变。
说明:
(1)forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
(2)redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
6. 谈谈你对javabean的理解。
javaBean作为一个实体类需满足以下条件:
(1)所有成员变量必须用private修饰;
(2)所有属性必须生成get和set方法;
(3)提供空的构造方法。
7.说说对xml文档的理解。定义xml文档有几种方式,解析xml文档有几种方
式。
XML即可扩展标记语言(eXtensible Markup Language)XML就是一种数据的描述语言,虽然它是语言,但是通常情况下,它并不具备常见语言的基本功能——被计算机识别并运行。只有依靠另一种语言,来解释它,使它达到你想要的效果或被计算机所接受。XML应用面主要分为两种类型,文档型和数据型
XML文档的解析方式:https://blog.csdn.net/lhq062003/article/details/4330491
8. Abstract class 和interface有什么不同。你如何理解它们的作用。
抽象类:
(1)抽象类里面可以有抽象方法,也可以有非抽象方法;
(2)只能单继承。
接口:
(1)接口中只允许有抽象方法;
(2)可以实现多个接口。
9.你常用的应用服务器有哪些,开发环境有哪些。
应用服务器:Tomcat, Weblogic
开发环境:eclipse, EditPlus, HBuilder, PowerDesginer,
10.String,StringBuffer,StringBuilder的联系和区别?
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
(1)运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
(1)String str="abc";
(2) System.out.println(str);
(3) str=str+"de";
(4) System.out.println(str);
解释:
1、如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
2、有时候我们会这样对字符串进行赋值
(1)String str="abc"+"de";
(2) StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
(3) System.out.println(str);
(4) System.out.println(stringBuilder.toString());
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
String str="abcde";
是完全一样的,所以会很快,而如果写成下面这种形式
(1) String str1="abc";
(2)String str2="de";
(3)String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。
(2)线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
(3)总结
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
11.ArrayList,Vector, LinkedList的存储性能和特性?
ArrayList和Vector都是使用数组的方式存储数据,此数组元素数大于实际存储的数据一遍增加和插入元素,但是插入元素要涉及到数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能(效率)上相较于ArrayList差。而LinkedList使用的是双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只记录本项的前后项即可,所以插入速度快。
12.Collection 和 Collections的区别?
Collection是集合类的上层接口,他的子类主要有Set和List接口;而Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作。(可以理解为集合的一个工具类。)
13.final, finally, finalize的区别?
- final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
- finally是异常处理语句结构的一部分,表示总是执行finally包含的代码。
- finalize是Object类的一个方法 ,在垃圾收集器执行的时候会调用被回收的对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
14.线程中sleep() 和 wait() 有什么区别?
- sleep是线程类(Thread)的 方法,导致次线程暂停执行,把执行机会给其他线程,但是监控状态依然保持,等其sleep时间结束后会自动恢复,同时调用sleep()方法时不会释放同步锁。tify
- wait()是Object类的一个方法,对此对象调用wait()方法会导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify()(或者no All())方法唤醒后,本线程才能进入对象锁定池准备获得对象锁进入运行状态。
15.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overload和方法的重载Override是一个类中java动态性的不同表现。
- 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Override)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。
- 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
注:Overloaded的方法是可以改变返回值的类型。
16.启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
17.同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
18.heap和stack有什么区别?
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
堆是栈的一个组成元素
19.Static Nested Class 和 Inner Class的不同
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。
20.JSP中动态INCLUDE与静态INCLUDE的区别?
动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file=”included.htm” %>
21.String是最基本的数据类型吗?
基本数据类型包括byte,int, char, long, float, double, Boolean 和short。
Java.lang.String类是final类型,因此不可以继承这个类,不能修改这个类。为了提高效率和节省空间应该使用StringBuffer类(可以动态构建字符串,且StringBuffer中很多方法可以带有synchronized关键字,从而保证线程安全)。
22.int和Integer有什么区别?
Java提供两种不同类型:引用类型和原始类型(内置类型)。Int是java的原始数据类型,而Integer是java为int提供的封装类。Java为每个原始类型都提供了封装类。
原始类型 | 原始类型缺省值 | 封装类 | 封装类型缺省值 |
boolean | False | Boolean | null |
char | 0 | Charater | null |
byte | 0 | Byte | null |
short | 空字符 | Short | null |
int | 0 | Integer | null |
folat | 0.0 | Folat | null |
double | 0.0 | Double | null |
long | 0 | Long | null |
引用类型和原始数据类型行为完全不同,并且他们具有不同的语义。引用类型和原始类型具有不同的用法,包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型作为某个类的实例数据时所指的缺省值也是不同的。对象引用实力变量的缺省值为null,而原始类型实例变量的缺省值与他们的类型有关。
23.java中的异常分类
Java异常主要分为未检查异常(派生于Error,RuntimeException的类)和已检查异常(其余都是已检查异常)。如果OutOfMemoryError等, 这些异常发生时, java虚拟机一般会终止线程。
非检查异常:表示无法让程序回复运行的异常,导致这种异常的原因通常是执行了错误的操作。一旦出现错误,建议程序终止。
受检查异常:表示程序可以处理的异常。如果抛出异常的方法本身不处理或者不能处理它,那么方法的调用者就必须去处理该异常,否则调用会出错,连编译都无法通过。
- Error是程序无法处理了,如果OutOfMemoryError等异常发生时,java虚拟机一般会终止线程。
- 运行时异常都是RuntimeException类及其子类,如NullPointException, IndexOutOfBoundsException等,这些异常是不可检查异常,是在程序运行的时候可能会发生的,所以程序可以捕捉,也可以不捕捉。这些错误一般是由程序员的逻辑错误引起的。
- 检查异常是运行异常以外的异常,也是Exception及其子类,这些异常从程序的角度来说是必须捕捉检查处理的,否则不能通过编译,如:IOException,SQLException等。
附:常见的RuntimeException:
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DOMException,
EmptyStackException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IndexOutOfBoundsException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
SecurityException,
SystemException,
UndeclaredThrowableException,
UnmodifiableSetException,
UnsupportedOperationException
24.接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?
- 接口可继承接口,但是继承的子类必须也具备接口的特性,必须为空方法。
- 抽象类可以实现接口,但是必须重写接口中的方法。
- 抽象类可以继承实体类,但是实体类必须要有明确的构造方法。
25.数据连接池的工作机
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少次数目的池连接。客户端程序需要连接时,池驱动程序返回一个未使用的池连接并将其标记为忙。如果当时没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。
26.Set里的元素用什么方法来区分是否重复?==还是equals()?他们有什么区别?
首先set里面的元素是不能重复的,可以用iterator()方法来区分是否重复。equals()方法用来判断两个set是否相等。equals()和==决定引用值是否指向同一对象。而equals()在类中可以被覆盖,为的是当两个分离的对象的内容和类型相匹配的话,返回真值。
27.构造器Constructor是否可被override或者overloading?
构造器不能被继承,因此不能被重写overriding,但可以被重载overloading。
28.Switch是否能作用在比优特上,是否能作用在long上,是否能作用在String上?
Switch(example1)中,example1是一个整数表达式,因此传递给switch和case语句的参数应该int,short,char或者byte. long ,string东不能作用在switch()上。
29.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return之前执行。
30.垃圾回收的优点和原理。并考虑2种回收机制
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
31.JSP九大内置对象及其常用方法。
变量名 | 类型 | 范围 |
request | javax.servlet.http.HttpServletRequest | 请求范围 |
response | javax.servlet.http.HttpServletResponse | 页面范围 |
pageContext | javax.servlet.jsp.PageConext | 页面范围 |
session | javax.servlet.http.HttpSession | 会话范围 |
application | javax.servlet.ServletContext | 应用程序范围 |
out | javax.servlet.jsp.JspWriter | 页面范围 |
config | Javax.servlet.ServletConfig | 页面范围 |
page | javax.servlet.jsp.HttpJspPage | 页面范围 |
exception | java.lang.Throwable | 只在错误页面有效. 页面范围 |
(1)request:表示HttpServletRequest对象。它包含了有关浏览器的请求信息,并且提供了几个用于获取cookie,header,和session数据有用的方法。
(2)response:表示HttpServletResponse对象,并且提供了几个用于这只送回浏览器的响应的方法(如cookies,头信息等)。
(3)pageContext:表示PageConext的对象,它是用于方便存取各种范围的名字空间,servlet相关对象的API,并且包装了通用的servlet相关功能的方法。
(4)session:表示HttpSession的一个对象,session可以存储用户的状态信息。
(5)application:表示ServletContext的一个对象,这有助于查找相关servlet引擎和servlet环境的信息。
(6)out表示JspWriter的对象,它提供的方法能够使你用于向浏览器回送输出结果。
(7)config:表示ServletConfig的一个对象,该对象用于存取servlet实例呃初始化参数。
(8)page:表示HttpJspPage的一个对象,从该页面产生一个servlet的实例。
(9)exception:表示Throwable的一个对象, exception对象是一个异常对象,当页面在运行过程中发生了异常,就产生这个对象。如果JSP页面应用此对象,必须把isErrorPage设置成true,否则无法编译。
32.进程的基本概念,线程的基本概念,线程的基本状态以及各状态之间的关系。
- 进程:
正在运行的程序,是系统进行资源分配和调度的基本单位。(内存+CPU)
单进程:同一时间段只能运行一个程序。如:DOS窗口。
多进程:可以同时运行多个程序(进程)。如:windows操作系统。
多进程的意义:就是提高了CPU的利用率。
注:多进程不是说多个程序同时刻运行,因为CPU同一时刻只能处理一个程序,是通过CPU时间片轮转实现的。
- 线程:
线程依赖于进程,是一个程序的运行路径。即线程是进程的最小执行单位,每个程序至少都有一个线程,也就是程序本身。
单线程:一个进程有一执行路径。(如:扫雷)
多线程:一个进程有多条执行路径。(如:迅雷下载)
多线程的意义:可以提高该线程所在的进程对应的应用程序的使用率,也就是最大程度抢到CPU。(迅雷,360等大部分程序都是多线程的)
- 线程的基本状态和各状态之间的关系:
33.JSP和Servlet之间的相同点和不同点。
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,JSP更强调的是外表的表达。JSP编译后是“类Servlet”。Servlet和JSP主要不同点在于:Servlet的应用逻辑是在java文件中,并且完全从表示层的HTML里面分离出来。而JSP则是java和HTML可以组合成一个扩展名为.jsp文件。SP侧重于视图,servlet主要用于逻辑控制。
34.JavaWeb四种会话跟踪技术,会话作用域描述
- page代表与一个页面相关的对象和属性。一个页面由编译好的java Servlet类(可以带有include指令,但是没有include动作)表示。这既包括servlet又包括被编译成servlet的JSP页面。
- request是代表与Web客户机的一个用户体验相关的对象和属性,一个web会话也可以跨越多个页面,涉及多个web组件(因为存在请求跳转forward和include动作的关系)。
- session是代表作用域某个web客户机的一个用户体验相关的对象和属性。一个web会话经常会跨越多个客户机请求。
- application是代表与整个web应用程序相关的对象和属性。这实质上是跨越整个web应用程序,包括多个页面,请求和会话的一个全局作用域。
35.简述synchronized和java.util.concurrent.locks.Lock的异同 ?
- Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如锁投票、定时锁等候、可中断锁等候等。
- synchronized 是Java 语言层面的,是内置的关键字;Lock 则是JDK 5中出现的一个包,在使用时,synchronized 同步的代码块可以由JVM自动释放;Lock 需要程序员在finally块中手工释放,在finally语句中释放。如果不释放,可能会引起难以预料的后果(在多线程环境中)。
36.排序都有哪几种方法?
- 插入排序(直接插入排序、希尔排序)
- 交换排序(冒泡排序、快速排序)
- 选择排序(直接选择排序、堆排序)
- 归并排序
- 分配排序(箱排序、基数排序)
37.JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
(1)try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。
(2)throw语句用来明确地抛出一个”异常”。
(3)throws用来标明一个成员函数可能抛出的各种”异常”。
(4)Finally为确保一段代码不管发生什么”异常”都被执行一段代码。
注:可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。
38.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
(1)有两种实现方法:继承Thread类,实现Runnable接口
(2)用synchronized关键字修饰同步方法
(3)反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。
39. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
40. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是“可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达的”,GC就有责任回收这些内存空间。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
50.请对以下在J2EE中常用的名词进行解释(或简单描述)
(1)web容器:给处于其中的应用程序组件(JSP,Servlet)提供一个环境,使JSP, Servlet直接和容器中的环境变量交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:Tomcat, Weblogic, WebSpher等。该容器提供的接口严格遵守J2EE规范中的web application 标准。我们把遵守以上标准的web服务器就叫做J2EE中的web容器。
(2)EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
(2)JNDI:(Java Naming & Directory Interface)java命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
(4)JMS:(Java Message Service)java消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
(5)JTA:(Java Transaction API)java事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
(6)JAF:(Java Action FrameWork)java安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
(7)RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
51.什么是java序列化,如何实现java序列化?
序列化是一种用于处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输与于网络之间,序列化是为了解决对象流在进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用输出流(如:FileOutPutStream)来构建一个ObjectOutputStream(对象输出流)对象,然后使用ObjectOutputStream的对象的write(object)方法就可以将参数为object的对象写出(即保存状态),要恢复的话则用对象输入流(反序列化)。
52.是否可以从static方法内部发出对非static方法的调用?
不能,因为static的方法在类加载的时候就会被初始化,如果内部包含非static的方法,这就不能保证会想的初始化。即,static方法中只能存在static方法,但是非static的方法可以包含static的方法。
53.List, Map,Set三个接口,存取元素时,各有设了特点?
(1)List以特定次序持有元素,可有重复的元素,听过list.get(index)获取元素;
(2)Set中午重复元素,内部排序;
(3)Map保存(key,value)值,key都是唯一的,但是value可重复。
54.jsp有那些动作?分别有什么作用?
Jsp共有6中基本动作,如下:
- jsp:include:在页面被请求的时候引入一个文件。
- jsp:useBean:寻找或者实例化JavaBean。
- jsp:setProperty:设置JavaBean的属相。
- jsp:getProperty:输出某个JavaBean的属性。
- jsp:forward:把请求转到一个新的页面。
- jsp:plugin:根据浏览器类型为java插件成OBJECT或者EMBED标记。
55.应用服务器与web server的区别?
(1)应用服务器:就是通过各种协议(包括HTTP协议)把商业逻辑暴露给客户端应用程序。应用程序使用此商业逻辑就像你调用对象的一个方法或者过程(函数)一样。
应用服务器包括:weblogic,Tomcat,JBoss等。
(2)web server:web服务器可以处理HTTP协议。当web服务器收到一个Http请求,会返回一个HTTP的响应(例如:送回一个HTML页面);另外web服务器可以乡音针对静态页面或图片的请求,进行页面跳转(forward)和页面重定向(redirect),把动态响应产生的委托给一些其他的程序(例如:CGI脚本,jsp(JavaServerPages)脚本,servlet ASP(Active Server Pages)脚本,服务器端JavaScript,或者其他的一些服务器端技术)。Web服务器可以执行服务器端程序和返回(程序所产生的)响应环境,而不会超出职能范围,web服务器主要是处理需要向浏览器发送HTML的请求供以浏览。
常用的web服务器:IIS、Apache。
56.面向对象的特征有哪些?
(1)抽象
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
(2)继承
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
(3)封装
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
(4)多态
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
57. private,default,protected, public的作用域
修饰符 | 访问范围 | 是否能被子类继承 |
private | 本类内部 | 不能被继承 |
default | 本类内部+同包的其他类 | 能被同包的子类继承 |
protected | 本类内部+同包其他类+非同包子类 | 能被继承 |
public | 公开,能被所有类访问 | 能被继承 |
58.short s1=1,s1=s1+1与short s1=1,s1+=1有什么区别?
(1)对于short s1=1,s1=s1+1,s1+1的运算结果是int类型,需要进行强制类型转换;
(2)对于short s1=1,s1+=1,s1+=1能够正确编译,自动类型提升(自动转化为int类型)。
59.数据类型之间的转化
(1)如何将数值类型的字符转化为数字?
调用数值类型相应包装类中的方法,例如Integer.parseInt("222"),Double.parseDouble("22.22")。
(2)如何将数字转化为字符?
1数字与空字符串相加,即可得到字符类型数据。(如String s = 22+“”)
2对于基本类型的数据可以调用String 类中的ValueOf()方法。
(如:String s1 = s2.valueOf(222))
3对于包装类型的数字则可以调用其toString()方法获得相应的字符串。
(3)如何取小数点前两位并四舍五入?
可以使用了数字构造的方式:java.math.BigDecimal对象,再利用其round()方法进行四舍五入到保留小数点后两位,再将其转化为字符串截取到最后两位。
60.JDO是什么?
JDO是java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品供应商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供任何数据底层的存储功能,比如关系型数据库,文件,xml以及对象数据库(ODBMS)等等,使得应用可移植性更强。
51.Statement 、PreparedStatement 和CallableStatement的用法和区别?
- Statement对象作为最基本的数据操作对象,可以应用几乎所有的数据库,但是由于运行时使用的是字符串连接技术,所以存在安全隐患。
- PreparedStatement对象成为预编译对象,在语句执行之前,向数据库发送类似公式一样的模板,其中使用了替换变量,从而提高了数据存储的安全性,但这个数据操作对象不是效率最高的。可以应用于绝大多数数据库。
- CallableStatement对象是效率和安全性最高的数据操作对象,但是兼容性最差。因为这个对象使用来调用数据库的存储过程的,不是所有数据库都支持存储过程。
52.什么是cookie,cookie与session的区别?
Cookie是保存在客户机上面的,而session是在服务器内存当中。Session是短对话,而cookie可以设置任意时间的有效期。
53.关于session的深入理解。
(1)session的原理和cookie有关,每一次session的产生都会对应产生一个JSessionID的cookie。
(2)session的死亡:session.invalidate()
session的移除:session.removeAttribute("cart");
注:Tomcat服务器默认结束session时间为半小时。
当关闭Tomcat服务器时,session死亡。
(3) 关闭浏览器时session时session的状况:
当关闭浏览器时,后台的session没有死亡,购物车中的数据依然存在,但是前台的JSessionID消失,因此找不到对应的session,此时的session处于“假死”状态
(4) 拯救session
在一个servlet中改变名字为JSessionID的cookie的生命周期为半小时
54.Get请求和Post请求的区别?
- Get方法是通过URL请求提交表单数据的。,Get方法适用于传输数据量小于1K的数据,执行率高,而且在传递过程中Get方式传递的数据将会显示在地址栏中。
- Post方式是通过Http中的Post机制将表单中的数据提交达到Action所定制程序,Post传输数据过程中先是将数据进行加密,然后发送,在地址栏中没有显示,并且Post传输的数据量也是有限制的。
55.JSP四大共享范围?
- page当前页面
- session在当前用户的会话范围内有效。
- request从上一页到下一页。(使用forward请求跳转时可以将前一个页面的request请求数据带到下一个页面)。
- application在整个服务器运行期间,在服务期内有效,所有访问者都可以使用到application范围内的对象。
56.如何理解MVC分层?
MVC是Model,View,Controller的缩写。
- Model:代表的是应用的业务逻辑。(Service层和Dao层)
- View:表示页面的展示,也就是JSP页面。
- Controller:提供应用的处理过程(一般是Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑扥成不同而组件实现。这些组件可以进行交互和重用。
57.Java语言有什么特性?
- 简单
C++,C语言都有指针的概念,指针部分不仅难而且繁琐,而java语言都是通过对象完成所有的工作。
- 跨平台
Java语言是跨平台的,一次写好,处处运行。即不需要针对每个平台(操作系统)重新写一个程序。
- 安全性
1Java语言严格遵循面向对象的理念,封装了数据以及过程,只是讲接口提供给了用户,增加了数据集的安全性。
2java语言无指针运算,除了基本运算以外都是引用操作,引用是不能进行加减运算的,即不能直接赋予内存地址的,从而增加了内存级的安全性。
- 面向对象
“面向过程”,就是先造车轮,再造发动机,再造车身。。。。。依次制造,造完前面的,才能造后面的。
“面向对象”,就是不分前后,造完所有的(车轮,发动机,车身。。。),再组装起来。面向的是具体的事物。
面向对象耦合度低。
- 垃圾回收
C语言需要构建函数,回收变量占用的内存,java语言则是自动回收,不用担心内存溢出。(内存溢出:指的是应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到内存大于虚拟机能提供的最大内存。)
- 开放性
Java的JDK是完全开放的的。(开源代码,不断使用Java,不断改进java)。
58.Java语言的运行机制?
开发的源代码à编译源文件生成中间字节码文件.class文件(hi二进制文件)àjvm根据操作系统翻译该中间文件(这个文件与具体机器和操作系统无关)à机器指令(不同的操作系统对应的机器指令不一样)àjvm运行。
59.Java语言是跨平台的,那么JVM虚拟机是否跨平台?
JVM虚拟机不是跨平台的,不同的操作系统需要下载不同的JVM。
60.解释JVM,JRE,JDK,并且解释他们之间的区别与联系?
(1)JVM虚拟机(Java Virtual Machine):是一台虚拟的计算机,可以看做一台计算机,它也有内存,处理器,寄存器和堆栈等资源和硬件,只不过都是模拟出来的,主要作用是通过类加载器
Class Loader来加载java程序,并按照java API来执行java程序。
(2)jre(java runtime environment):即java运行时的环境,包括了JVM和java程序所需的核心类库等,如果想要运行一个开发好的java程序,计算机中只需要安装jre即可。
(3)JDK(java development kit):java开发工具包,为开发人员服务的,包含了jre,所以安装了jdk就不用单独安装jre了。其中开发工具包括:编译工具(javac.exe)和打包工具(jar.exe)。
注:JVM<JRE<JDK