Java面试题分享
1. 面向对象特征有哪些方面?
面向对象的特征主要有一下方面
- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程;包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的成为父类(基类),得到继承信息的称为子类(派生类)。继承让变化的软件系统有了一定的延续性,同时也是封装程序中可变因素的重要手段。
- 多态性:多态性是指允许不同子类的对象对同一消息做出不同的响应。
简单说就是用同样的对象引用调用同样地方法但是做了不同的事情。
多态性分为编译时地多态性和运行时的多态性
实现多态需要两件事:
- 方法重写:子类继承父类并重写父类的方法
- 对象造型:用父类型引用子类型对象,这样引用同样的方法就会根据子类对象的不同而表现出不同的行为
2. 访问修饰符public,private,protected,以及不写(默认)时的区别?
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
3. String 是最基本的数据类型吗?
不是。
java的基本数据类型只有8个:
byte、short、int、long、float、double、char、boolean;
除了基本类型和枚举类型,剩下的都是引用类型
4. float f=3.4;是否正确?
不正确
3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失;
因此需要强制类型转换:
方式一:float f=(float)3.4
方式二:float f=3.4F
5. int和Integer有什么区别?
Integer是int的包装类
Java为每一个基本数据类型都引入了对应的包装类型,从Java5开始引入了自动装箱/拆箱机制,使得二者剋以相互转换
6. &和&&的区别?
&运算符有两种用法 (1):按位与;(2):逻辑与
&&运算符是短路与运算。
逻辑与和短路与的区别是很大的,虽然二者都要求运算符左右两端的布尔值都为true整个值才为true。
&&之所以为短路与是因为:如果&&左边的表达式值为false,右边的表达式会被直接短路掉,不会运行计算。
7. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
栈(stack):定义一个基本类型的变量,一个对象的引用,函数的调用都使用内存中的栈空间
堆(heap):通过new关键字和构造器创建的对象都放在堆空间
静态区(static area):程序中的字符常量都放在内存中的静态区
8.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
Math.round:向上取整
Math.round(11.5):等于12
Math.round(-11.5):等于-11
9.switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
在Java5以前:swich(expr)中,expr只能是 byte、short、char、int。
从java5开始:java中引用了枚举类型,expr可以是enum类型
从java7开始:expr可以是String引用类型
目前所有版本:expr不可以是long类型
10. 数组有没有length()方法?String有没有length()方法?
数组中没有length方法,只有length属性。
String有length()方法
11. 在Java中,如何跳出当前的多重嵌套循环?
在最外层前加个标记A,然后可以通过break A来结束循环
12.构造器(constructor)是否可被重写(override)?
构造器不能被继承,也不能被重写,但可以被重载。
13. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对
如果两个对象满足x.equals(y) == true,那么它的hashcode一定相同
java对equals和hashcode是这样规定的:
- 如果两个对象的相同(x.equals(y) == true),那么它们的hashcode一定相同
- 如果相关对象的hashcode相同,它们并不一定相同
14. 是否可以继承String类?
String是final类,不可继承
15.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递
java语言的方法调用只支持参数的值传递。
当一个对象实例做为一个参数被传递到方法时,参数的值就是该对象的引用
16. String和StringBuilder、StringBuffer的区别?
- String是只读字符串;意味着String引用的字符串是不能被改变的
- StringBuilder/StringBuffer可以对字符串就直接进行修改
- StringBuilder是在java5中引入的,和StringBuffer的方法完全相同
- 区别:StringBuilder是在单线程环境下使用的,没有被synchronized所修饰,所以效率大于StringBuffer
17. 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
- 方法重载和重写都是实现多态的方式;
- 区别:重载是编译时的多态性;重写是运行时的多态性
- 重载发生在同一个类中,要求:方法名相同,返回值类型不同或者参数类型不同;重载对返回值类型没有特殊要求
- 重写发生在父类和子类之间,重写要求子类被重写的方法与父类被重写的方法的返回值类型相同
18. 描述一下JVM加载class文件的原理机制?
JVM中类的装载是由类加载器和它的子类来实现的,java中的类加载器是一个重要的java运行时系统组件,它负责在运行时查找和装入类文件中的类型
当java程序需要使用某个类时,JVM会确保这个类已经被加载,连接和初始化。
类的加载器是指把类的.class文件中的shu'j读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的class对象。加载完成后,class文件还不完整,所以此时的类还不可调用。当类被加载后进入连接阶段;这个阶段包括:验证,准备,解析
- 如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类
- 如果类存在初始化语句,就依次执行这些初始化语句。
- 类的加载是由类的加载器完成的,类的加载器包括:
1. 根加载器(BootStrap):一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
2. 拓展加载器(Extension):从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
3. 系统加载器(System):应用类加载器,其父类是Extension。它是应用最广泛的类加载器。
4. 用户自定义类加载器(java.lang.ClassLoader的子类)从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。
19. char 型变量中能不能存贮一个中文汉字,为什么?
char可以存储一个中文汉字
java使用的编码是Unicode,一个char类型占2个字节,16比特(bit),所以放一个中文是没有问题的
20. 抽象类(abstract class)和接口(interface)有什么异同?
抽象类和接口都不能被实例化,但可以定义抽象类和接口类型的引用。
一个类如果继承了某个抽象类或者实现了某个接口,都需要对其中的的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
接口比抽象类更加抽象,因为抽象类可以定义构造器,可以有抽象方法和具体方法,而接口不能定义构造方法而且其中的方法全部都是抽象方法。
抽象类中的成员可以时private、默认、protected、public,而接口的成员全都是public的;
抽象类可以定义成员变量,而接口中定义的成员变量实际都是常量。有抽象方法的类必须被声明抽象类,而抽象类未必要由抽象方法。
21. 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化
22. Java 中会存在内存泄漏吗,请简单描述。
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);
然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。
23. 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
都不能。
抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。
本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。
synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
24. 阐述静态变量和实例变量的区别。
静态变量 是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;
实例变量 必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
25. 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
26. 如何实现对象克隆?
有两种方式
实现Cloneable接口并重写Object类中的clone()方法;
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
27. GC是什么?为什么要有GC?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃
java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
垃圾回收机制:
分代复制垃圾回收
标记垃圾回收
增量垃圾回收
与垃圾回收相关的JVM参数:
-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年轻代的大小
-XX:-DisableExplicitGC — 让System.gc()不产生任何作用
-XX:+PrintGCDetails — 打印GC的细节
-XX:+PrintGCDateStamps — 打印GC操作的时间戳
-XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小
-XX:NewRatio — 可以设置老生代和新生代的比例
-XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值
-XX:TargetSurvivorRatio:设置幸存区的目标使用率
28. String s = new String("xyz");创建了几个字符串对象?
两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。
29. 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
30. 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以。
但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。
31. 匿名内部类是否可以继承其它类?是否可以实现接口?
可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调
32. 内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。
33 .Java 中的final关键字有哪些用法?
修饰类:表示该类不能被继承;
修饰方法:表示方法不能被重写;
修饰变量:表示变量只能一次赋值以后值不能被修改(常量)
34. 如何将字符串转换为基本数据类型? 如何将基本数据类型转换为字符串?
调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;
一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;
另一种方法是调用String 类中的valueOf()方法返回相应字符串
35. 怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
36. try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
会执行,在方法返回调用者前执行。
37. Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理
try用来指定一块预防所有异常的程序
catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;
throw语句用来明确地抛出一个异常;
throws用来声明一个方法可能抛出的各种异常
finally为确保一段代码不管发生什么异常状况都要被执行;
38. 列出一些你常见的运行时异常?
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException (下标越界异常)
NullPointerException (空指针异常)
SecurityException (安全异常)
39. 阐述final、finally、finalize的区别。
final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。
finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
40. List、Set、Map是否继承自Collection接口?
List、Set 是 ;Map 不是。
Map是键值对映射容器,与List和Set有明显的区别
Set存储的零散的元素且不允许有重复元素
List是线性结构的容器,适用于按数值索引访问元素的情形
41. 阐述ArrayList、Vector、LinkedList的存储性能和特性。
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢
Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差
42. Collection和Collections的区别?
Collection是一个接口,它是Set、List等容器的父接口;
Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
43. List、Map、Set三个接口存取元素时,各有什么特点?
List以特定索引来存取元素,可以有重复元素
Set不能存放重复元素
Map保存键值对映射,映射关系可以是一对一或多对一
44. TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小
TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序
Collections工具类的sort方法有两种重载的形式:第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型,相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用
45. Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
sleep()方法是线程类的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁,进入对象的等待池(,只有调用对象的notify()方法时才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就可以进入就绪状态。
46. 线程的sleep()方法和yield()方法有什么区别?
- sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
- 线程执行sleep()方法后转入阻塞状态,而执行yield()方法后转入就绪状态
- sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
- sleep()方法比yield()方法具有更好的可移植性。
47. 当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
不能。
其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池中等待对象的锁。
48. 请说出与线程同步以及线程调度相关的方法。
wait():使一个线程处于阻塞
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法状态,并且释放所持有的对象的锁;
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态
49. 编写多线程程序有几种实现方式?
两种:
继承Thread类
实现Runnable接口
50. synchronized关键字的用法?
synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符。
51. 启动一个线程是调用run()还是start()方法?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行
run()方法是线程启动后要进行回调的方法。
52. 什么是线程池
在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。
所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。
线程池顾名思义就是事先创建若干个可执行的线程放入一个池中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。
53.简述synchronized 和java.util.concurrent.locks.Lock的异同?
相同点: Lock 能完成synchronized所实现的所有功能
不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally 块中释放
54. Java中如何实现序列化,有什么意义?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题
要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出;如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象
55. Java中有几种类型的流?
字节流和字符流
字节流继承于InputStream、OutputStream
字符流继承于Reader、Writer
56. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
XML文档定义分为DTD和Schema两种形式
区别在于Schema本身也是一个XML文件,可以被XML解析器解析,而且可以为XML承载的数据定义类型,约束能力较之DTD更强大。
XML的解析主要有DOM、SAX和StAX
57. 你在项目中哪些地方用到了XML?
XML的主要作用有两个方面:数据交换和信息配置
58. 阐述JDBC操作数据库的步骤。
- 加载驱动: Class.forName("oracle.jdbc.driver.OracleDriver");
- 创建连接:Connection con = DriverManager.getConnection("url", "用户名", "密码");
- 创建语句: PreparedStatement ps = con.prepareStatement("sql语句");
- 执行语句:ResultSet rs = ps.executeQuery();
- 处理结果。
- 关闭资源。
59. Statement和PreparedStatement有什么区别?哪个性能更好?
PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性
PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;
当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快
60. 在进行数据库编程时,连接池有什么作用?
由于创建连接和释放连接都有很大的开销,为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略
61. 什么是DAO模式?
DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。
在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。
62. 事务的ACID是指什么?
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
63. JDBC中如何进行事务处理?
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。
64. JDBC能否处理Blob和Clob?
Blob是指二进制大对象,而Clob是指大字符对象,因此其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据而设计的。
JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。
65. 简述正则表达式及其用途。
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
66. Java中是如何支持正则表达式操作的?
Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()
67. 获得一个类的类对象有哪些方式?
三种:
- 类型.class,例如:String.class
- 对象.getClass(),例如:"hello".getClass()
- Class.forName(),例如:Class.forName("java.lang.String")
68. 如何通过反射创建对象?
- 通过类对象调用newInstance()方法
- 通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象并调用其newInstance()方法创建对象
69. 简述一下你了解的设计模式。
所谓设计模式,就是一套被反复使用的代码设计经验的总结
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
70. 阐述Servlet和CGI的区别?
Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
71.Servlet接口中有哪些方法?
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
init();
service();
doGet();
doPost();
destroy();
72. 转发(forward)和重定向(redirect)的区别?
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址
73. JSP有哪些内置对象?作用分别是什么?
JSP有9个内置对象
request:封装客户端的请求,其中包含来自GET或POST请求的参数;
response:封装服务器对客户端的响应;
pageContext:通过该对象可以获取其他对象;
session:封装用户会话的对象;
application:封装服务器运行环境的对象;
out:输出服务器响应的输出流对象;
config:Web应用的配置对象;
page:JSP页面本身(相当于Java程序中的this);
exception:封装页面抛出异常的对象。
74. get和post请求的区别?
get请求用来从服务器上获得资源,而post是用来向服务器提交数据
get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。
75.常用的Web服务器有哪些?
Unix和Linux平台下使用最广泛的免费HTTP服务器是Apache服务器
Windows平台的服务器通常使用IIS作为Web服务器
选择Web服务器应考虑的因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等
76.JSP和Servlet是什么关系?
Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容
JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成.
Servlet和JSP最主要的不同点在于,Servlet的
应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件
77. 讲解JSP中的四种作用域。
JSP中的四种作用域包括page、request、session和application
page代表与一个页面相关的对象和属性
request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域
78.如何实现JSP或Servlet的单线程模式?
对于JSP页面,可以通过page指令进行设置。 <%@page isThreadSafe=”false”%>
对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
79. 过滤器有哪些作用和用法?
对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等
和过滤器相关的接口主要有:Filter、FilterConfig和FilterChain。
80. 监听器有哪些作用和用法?
ServletContextListener:对Servlet上下文的创建和销毁进行监听。
ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换。
HttpSessionListener:对Session的创建和销毁进行监听。
81. web.xml文件中可以配置哪些内容
web.xml用于配置Web应用的相关信息
监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等
82. 、表达式语言(EL)支持哪些运算符?
算术运算符:+、-、*、/或div、%或mod
关系运算符:==或eq、!=或ne、>或gt、>=或ge、<或lt、<=或le逻辑运算符:&&或and、||或or、!或not
条件运算符:${statement? A : B}(跟Java的条件运算符类似)
empty运算符:检查一个值是否为null或者空(数组长度为0或集合中没有元素也返回true)
83. 持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?
所谓"持久"就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中
持久层设计的目标包括:
- 数据存储逻辑的分离,提供抽象化的数据访问接口。
- 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。
- 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。
- 数据抽象,提供更面向对象的数据操作。
-Hibernate
- MyBatis
- TopLink
- Guzz
- jOOQ
- Spring Data
- ActiveJDBC
84. Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗
SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建
Session是一个轻量级非线程安全的对象,它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后它会被关闭
85. Hibernate中Session的load和get方法的区别是什么
如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。
get方法直接返回实体类对象,load方法返回实体类对象的代理。
在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。
86. MyBatis中使用#和$书写占位符有什么区别?
#将传入的数据都当成一个字符串,会对传入的数据自动加上引号;
$将传入的数据直接显示生成在SQL中
使用$占位符可能会导致SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该用$而不是#。
87. 解释一下MyBatis中命名空间(namespace)的作用。
在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。
为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。
88. MyBatis中的动态SQL是什么意思?
对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在
如果不使用持久层框架我们可能需要自己拼装SQL语句,还好MyBatis提供了动态SQL的功能来解决这个问题
89. 什么是IoC和DI?DI是如何实现的?
IoC叫控制反转;DI叫依赖注入
控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理
依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中
90. Spring中Bean的作用域有哪些?
在Spring的早期版本中,仅有两个作用域:singleton和prototype,前者表示Bean以单例的方式存在;后者表示每次从容器中调用Bean时,都会返回一个新的实例,prototype通常翻译为原型。
Spring 2.x中针对WebApplicationContext新增了3个作用域,分别是:request、session(同一个HttpSession共享同一个Bean,不同的HttpSession使用不同的Bean和globalSession。
91. 解释一下什么叫AOP(面向切面编程)
AOP指一种程序设计范型,该范型以一种称为切面的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点。
92. 你是如何理解"横切关注"这个概念的?
"横切关注"是会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。
93. 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
连接点(Joinpoint):程序执行的某个特定位置。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。
切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点
增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译期;②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。
切面(Aspect):切面是由切点和增强组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。
94. Spring中自动装配的方式有哪些?
no:不进行自动装配,手动设置Bean的依赖关系。
byName:根据Bean的名字进行自动装配。
byType:根据Bean的类型进行自动装配。
constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配
95. Spring中如何使用注解来配置Bean?有哪些相关的注解?
首先需要在Spring配置文件中增加如下配置:<context:component-scan base-package="全限定名"/>
然后可以用@Component、@Controller、@Service、@Repository注解来标注需要由Spring IoC容器进行对象托管的类。
@Controller通常用于控制器
@Service通常用于业务逻辑类
@Repository通常用于仓储类
普通的类用@Component来标注。
96. Spring支持的事务管理类型有哪些?你在项目中使用哪种方式?
Spring支持编程式事务管理和声明式事务管理。
声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,因为编程式事务允许你通过代码控制业务。
事务分为全局事务和局部事务。
全局事务由应用服务器管理,需要底层服务器JTA支持。局部事务和底层采用 的持久化方案有关,例如使用JDBC进行持久化时,需要使用Connetion对象来操作事务;而采用Hibernate 进行持久化时,需要使用Session对象来操作事务。
Spring提供了如下所示的事务管理器
事务管理器实现类 目标对象 DataSourceTransactionManager 注入DataSource HibernateTransactionManager 注入SessionFactory JdoTransactionManager 管理JDO事务 JtaTransactionManager 使用JTA管理事务 PersistenceBrokerTransactionManager 管理Apache的OJB事务 父接口都是PlatformTransactionManager
Spring的事务管理机制是一种典型的策略模式,PlatformTransactionManager代表事务管理接口,该接口定义了三个方法,该接口并不知道底层如何管理事务,但是它的实现类必须提供getTransaction()方法(开启事务)、commit()方法(提交事务)、rollback()方法(回滚事务)的多态实现,这样就可以用不同的实现类代表不同的事务管理策略。
97. Spring MVC的工作原理是怎样的?
- 客户端的所有请求都交给前端控制器DispatcherServlet来处理,它会负责调用系统的其他模块来真正处理用户的请求。
- DispatcherServlet收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到处理该请求的Handler(任何一个对象都可以作为请求的Handler)。
- 在这个地方Spring会通过HandlerAdapter对该处理器进行封装。
- HandlerAdapter是一个适配器,它用统一的接口对各种Handler中的方法进行调用。
- Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。
- ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。
- 当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。
- 客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件。
98. 选择使用Spring框架的原因
- 非侵入式:支持基于POJO的编程模式,不强制性的要求实现Spring框架中的接口或继承Spring框架中的类。
- IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试
- AOP(面向切面编程):将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
- MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
- 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。
99. Spring IoC容器配置Bean的方式?
- 基于XML文件进行配置。
- 基于注解进行配置。
- 基于Java程序进行配置(Spring 3+)
100. 阐述Spring框架中Bean的生命周期?
- Spring IoC容器找到关于Bean的定义并实例化该Bean。
- Spring IoC容器对Bean进行依赖注入。
- 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
- 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
- 如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。
- 如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。
- 如果有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。
- 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
101. 依赖注入时如何注入集合属性?
可以在定义Bean属性时,通过
/
/
102. Spring中的自动装配有哪些限制?
- 如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。
- 基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。
- 优先考虑使用显式的装配来进行更精确的依赖注入而不是使用自动装配。
103. 大型网站在架构上应当考虑哪些问题?
- 分层:分层是处理任何复杂系统最常见的手段之一,将系统横向切分成若干个层面,每个层面只承担单一的职责,然后通过下层为上层提供的基础设施和服务以及上层对下层的调用来形成一个完整的复杂的系统。
- 分割:分割是对软件的纵向切分。我们可以将大型网站的不同功能和服务分割开,形成高内聚低耦合的功能模块(单元)。
- 分布式:除了上面提到的内容,网站的静态资源(JavaScript、CSS、图片等)也可以采用独立分布式部署并采用独立的域名,这样可以减轻应用服务器的负载压力,也使得浏览器对资源的加载更快。
- 集群:集群使得有更多的服务器提供相同的服务,可以更好的提供对并发的支持。
- 缓存:所谓缓存就是用空间换取时间的技术,将数据尽可能放在距离计算最近的位置。使用缓存是网站优化的第一定律。
- 异步:异步是实现软件实体之间解耦合的又一重要手段。异步架构是典型的生产者消费者模式,二者之间没有直接的调用关系,只要保持数据结构不变,彼此功能实现可以随意变化而不互相影响,这对网站的扩展非常有利。使用异步处理还可以提高系统可用性,加快网站的响应速度(用Ajax加载数据就是一种异步技术),同时还可以起到削峰作用(应对瞬时高并发)。
- 冗余:各种服务器都要提供相应的冗余服务器以便在某台或某些服务器宕机时还能保证网站可以正常工作,同时也提供了灾难恢复的可能性。
104. 你用过的网站前端优化的技术有哪些?
- 浏览器访问优化:
- 减少HTTP请求数量:合并CSS、合并JavaScript、合并图片(CSS Sprite)
- 使用浏览器缓存:通过设置HTTP响应头中的Cache-Control和Expires属性,将CSS、JavaScript、图片等在浏览器中缓存,当这些静态资源需要更新时,可以更新HTML文件中的引用来让浏览器重新请求新的资源
- 启用压缩
- CSS前置,JavaScript后置
- 减少Cookie传输
- CDN加速:CDN的本质仍然是缓存,将数据缓存在离用户最近的地方,CDN通常部署在网络运营商的机房,不仅可以提升响应速度,还可以减少应用服务器的压力。当然,CDN缓存的通常都是静态资源。
- 反向代理:反向代理相当于应用服务器的一个门面,可以保护网站的安全性,也可以实现负载均衡的功能,当然最重要的是它缓存了用户访问的热点资源,可以直接从反向代理将某些内容返回给用户浏览器。
105. 你使用过的应用服务器优化技术有哪些?
分布式缓存:缓存的本质就是内存中的哈希表,如果设计一个优质的哈希函数,那么理论上哈希表读写的渐近时间复杂度为O(1)。
使用缓存需要解决以下几个问题:
- 频繁修改的数据;
- 数据不一致与脏读;
- 缓存雪崩
- 缓存预热;
- 缓存穿透
异步操作:可以使用消息队列将调用异步化,通过异步处理将短时间高并发产生的事件消息存储在消息队列中,从而起到削峰作用。
- 使用集群。
- 代码优化
- 多线程
- 非阻塞I/O
- 资源复用
106. 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?
XSS:
XSS是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式。
跨站脚本攻击分有两种形式:反射型攻击和持久型攻击。
XSS虽然不是什么新鲜玩意,但是攻击的手法却不断翻新,防范XSS主要有两方面:消毒和HttpOnly。
SQL注入
SQL注入攻击是注入攻击最常见的形式,当服务器使用请求参数构造SQL语句时,恶意的SQL被嵌入到SQL中交给数据库执行。
SQL注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者想要获得表结构有多种方式:(1)如果使用开源系统搭建网站,数据库结构也是公开的;(2)错误回显(3)盲注。防范SQL注入攻击也可以采用消毒的方式,通过正则表达式对请求参数进行验证,此外,参数绑定也是很好的手段,这样恶意的SQL会被当做SQL的参数而不是命令被执行,JDBC中的PreparedStatement就是支持参数绑定的语句对象,从性能和安全性上都明显优于Statement。
CSRF
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oxoyu4jC-1590504784972)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200526172356173.png)]
CSRF攻击是攻击者通过跨站请求,以合法的用户身份进行非法操作。
CSRF的原理是利用浏览器的Cookie或服务器的Session,盗取用户身份。
防范CSRF的主要手段是识别请求者的身份,主要有以下几种方式:
(1)在表单中添加令牌(token);
(2)验证码;
(3)检查请求头中的Referer。
令牌和验证都具有一次消费性的特征,因此在原理上一致的,但是验证码是一种糟糕的用户体验,不是必要的情况下不要轻易使用验证码,目前很多网站的做法是如果在短时间内多次提交一个表单未获得成功后才要求提供验证码,这样会获得较好的用户体验。
107. SSH和SSM的组成及其区别
SSH指的是:spring+Struts+hibernate;
SSH 通常指的是 Struts2 做前端控制器,spring 管理各层的组件,hibernate 负责持久化层。
SSM指的是:spring +SpringMVC + MyBatis。
SSM 则指的是 SpringMVC 做前端控制器,spring 管理各层的组件,MyBatis 负责持久化层
共同之处是都使用了Spring的依赖注入DI来管理各层的组件,使用了面向切面编程AOP来实现日志管理,权限认证,事务等通用功能的切入。
不同之处是 Struts2 和 SpringMVC 做前端控制器的区别,以及 hibernate 和 MyBatis 做持久化时的区别。但
是,Struts2 也可以和 MyBatis 搭配使用,SpringMVC 也可以和 Hibernate 搭配使用。
108. HashMap和Hashtable的区别
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
109. J2EE是什么?
Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
一个另类的回答:j2ee就是增删改查。
110.J2EE是技术还是平台还是框架? 什么是J2EE
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
111. J2EE常用的设计模式?说明工厂模式。
总共23种,分为三大类:创建型,结构型,行为型
我只记得其中常用的6、7种,分别是:
- 创建型(工厂、工厂方法、抽象工厂、单例)
- 结构型(包装、适配器,组合,代理)
- 行为(观察者,模版,策略)
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 Responsibleity(责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
112.开发中都用到了那些设计模式?用在什么场合?
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
113.BS与CS的联系与区别。
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、InFORMix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。
C/S 与 B/S 区别:
- 硬件环境不同
1. C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
2. B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行- 对安全要求不同
1. C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.
2. B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。- 对程序架构不同
1. C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.
2. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.- 软件重用不同
1. C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
2. B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子- 系统维护不同
1. C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
2. B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.- 处理问题不同
1. C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统
2. B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.- 用户接口不同
1. C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
2. B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,- 信息流不同
1. C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
2. B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。
114. 应用服务器与WEB SERVER的区别?
应用服务器:Weblogic、Tomcat、Jboss
WEB SERVER:IIS、 Apache
115. 应用服务器有那些?
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat
116. SQL Server 和 Oracle 以及 MySQL 有哪些区别?
- 数据库对比
- Oracle:.Oracle:最贵,功能最多,安装最不方便,Oracle环境里的其他相关组件最多,支持平台数量一般,使用中等方便,开发中等方便,运维中等方便,不开源,速度最慢,最安全。
- Microsoft SQL Server 2014:中等贵,功能最少,安装中等方便,Microsoft SQL Server 2014环境里的其他相关组件最少,支持平台最少,使用最方便,开发最方便,运维最方便,不开源,速度中等,一般安全。
- Mysql:免费,功能中等,安装最方便,Mysql环境里的其他相关组件数量中等,支持平台最多,使用最不方便,开发最不方便,运维最不方便,有开源版本,速度最快,最不安全。
- 从不同职业的角度来看
- 对于初学数据库的孩子来说,比如学生,建议学习Microsoft SQL Server 2014。原因主要是方便。
- 对于在国企、事业单位里的人来说,建议精通Windows\Office\C#\Microsoft SQL Server 2014,因为这类工作岗位上会经常做一些小软件的快速开发,以及数据的快速处理。
- 对于在百度、阿里巴巴这类互联网企业的人来说,建议精通Mysql。因为这类企业不愿意花钱购买正版软件,同时又需要对源代码进行定制,因此Mysql最适合这类企业。
- 对于专门从事大型软件项目开发,以及电信、电商、金融等,这类企业有钱,并且对数据安全最重视,因此,这类企业适合使用Oracle。