1、&和&& |和|| 的区别?
a&b,会执行a,执行b ,得出结论
a&&b,会执行a,如果a false,则不执行b,直接返回false
2、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
round(x)方法是获取最进阶
Math.round(11.5)= 12
Math.round(-11.5)= -11
该方法的实现:将括号内的数+0.5之后,向下取值,
比如:round(3.4)就是3.4+0.5=3.9,向下取值是3,所以round(3.4)=3;
round(-10.5)就是-10.5+0.5=-10,向下取值就是-10,所以round(-10.5)=-10
3、switch 是否能作⽤用在byte 上,是否能作⽤用在long 上,是否能作⽤用在String 上?
switch表达式后面的数据类型只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean类型
4、用最有效率的⽅方法计算2乘以8
2<<2
左移相当于乘以2,右移相当于除以2
5、在Java中,如何跳出当前的多重嵌套循环
1)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
ok: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i=" + i + ",j=" + j); if (j == 5) break ok; }
2)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i=" + i + ",j=" + j); if (j == 5) return; } }
3)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
boolean isStop=false; for (int i = 0; i < 10&&!isStop; i++) { for (int j = 0; j < 10; j++) { System.out.println("i=" + i + ",j=" + j); if (j == 5){ isStop=true; break; } } }
6、当⼀一个对象被当作参数传递到⼀一个⽅方法后,此⽅方法可改变这个对象的属性,并可返回变化后的结果,那么这⾥里里到底是值传递还是引⽤用传递?
其实java都是值传递
基本数据类型:是将变量的一个副本传递到方法中,方法中如何操作该变量副本,都不会改变原变量的值
引用类型:是将引用的拷贝,传递给方法,方法操作变量时会找到保存在该地址的变量,对其进行操作,所以内容会改变。但是将该引用赋值,是不会影响原来的对象的
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class MainTest { public static void main(String[] args) { int a = 5; User u=new User(); test(a,u); System.out.println("a:"+a + " user age:" +u.getAge() ); } public static void test(int a, User u) { a++; u.setAge(u.getAge()+1); } } class User { int age = 3; public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
7、重载(Overload)和重写(Override)的区别。重载的⽅方法能否根据返回 类型进⾏行行区分吗?
重写的规则:
-
- 重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载
- 重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private
- 重写的方法的返回值必须和被重写的方法的返回一致
- 重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类
- 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写
- 静态方法不能被重写为非静态的方法(会编译出错)
重载的规则:
-
- 在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样)
- 不能通过访问权限、返回类型、抛出的异常进行重载
- 方法的异常类型和数目不会对重载造成影响
8)访问修饰符的作用?
控制访问
类 包 子类 其他包
public ∨ ∨ ∨ ∨ (对任何人都是可用的)
protect ∨ ∨ ∨ × (继承的类可以访问以及和private一样的权限)
default ∨ ∨ × × (包访问权限,即在整个包内均可被访问)
private ∨ × × × (除类型创建者和类型的内部方法之外的任何人都不能访问的元素)
9)char变量能不能存储一个中文汉字,为什么?
不能
Java 的char用两字节存储,表示范围从 '\u0000' 到 '\uffff' ,也就是从0到65535。事实上,一个 char不能表示65535个字符,因为只有U+0000 到 U+D7FF 和 U+E000 到U+FFFF能用来表示 一个完整的字符,这些叫做 BMP,另外的作为high surrogate和 low surrogate 拼接组成由4字节表 示的字符。
在UTF-16编码中,大于U+10000码位将被编码为一对16比特长的码元,即按4个字节编码,此时char无法表示。utf16编码格式
所以Java的char只能表示utf16中的bmp部分字符。对于CJK(中日韩统一表意文字)部分扩展字符集则无法表示
10)抽象类和接口的异同?
从语言层面上:
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口
设计层面上:
- 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口
- 设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动
11、面向对象的特征?
抽象
忽略一个主题中与当前目标无关的东西,专注的注意与当前目标有关的方面.(就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口).抽象并不打算了解全部问题,而是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一个数据抽象,而是过程抽象.
数据抽象 -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)
过程抽象 -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法)
封装
封装就是把过程和数据包围起来,对数据的访问只能通过特定的界面.如私有变量,用set,get方法获取
继承
一种联结类的层次模型,并且允许和鼓励类的重用,提供一种明确表达共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),原始类称为新类的基类(父类).派生类可以从它的父类哪里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要.因此可以说,继承为了重用父类代码,同时为实现多态性作准备.
多态
多态是指允许不同类的对象对同一消息做出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活/抽象/行为共享/代码共享的优势,很好的解决了应用程序函数同名问题.总的来说,方法的重写,重载与动态链接构成多态性.java引入多态的概念原因之一就是弥补类的单继承带来的功能不足.
动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接
12、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不不同?
嵌套类分为静态嵌套类 和 非静态嵌套类。而非静态内部类又称为内部类
内部类包括:成员内部类,局部内部类,匿名内部类
静态嵌套类和内部类的区别:静态嵌套类只能访问静态变量。内部类既可以访问非静态变量,又可以访问静态变量
13、Java 中会存在内存泄漏漏吗,请简单描述
存在
对于应用程序来说,当对象已经不再被使用,但是Java的垃圾回收器不能回收它们的时候,就产生了内存泄露
防止内存泄漏:
-
- 使用List、Map等集合时,在使用完成后赋值为null
- 使用大对象时,在用完后赋值为null
- 目前已知的jdk1.6的substring()方法会导致内存泄露
- 避免一些死循环等重复创建或对集合添加元素,撑爆内存
- 简洁数据结构、少用静态集合等
- 及时的关闭打开的文件,socket句柄等
- 多关注事件监听(listeners)和回调(callbacks),比如注册了一个listener,当它不再被使用的时候,忘了注销该listener,可能就会产生内存泄露
14、抽象的(abstract)⽅方法是否可同时是静态的(static),是否可同时是本地 ⽅方法(native),是否可同时被synchronized修饰?
abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用
static:用来声明静态方法,静态方法可以被类及其对象调用
native:用来声明本地方法,该方法的实现由非java 语言实现,比如C。一般用于java与外环境交互,或与操作系统交互
synchronized:用于防止多个线程同时调用一个对象的该方法,与static连用可防止多个线程同时调用一个类的该方法
static与abstract不能同时使用:用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用,两者矛盾
native与abstract不能同时使用: 因为 native 暗示这些方法是有实现体的,只不过这些实现体是非java 的,但是abstract却显然的指明这些方法无实现体
abstract与synchronized不能同时使用: 从synchronized的功能也可以看出,用synchronized的前提是该方法可以被直接调用,显然和abstract连用
15、阐述静态变量量和实例变量的区别
语法上:
静态变量:需要static修饰
实例变量:不需要static修饰
被谁所有:
静态变量:属于类
实例变量:属于对象实例
初始化时间:
静态变量:加载类的时候,初始化
实例变量:创建类的对象时
存储位置:
静态变量:方法区(jdk1.8 元空间)
实例变量:堆
16、是否可以从⼀一个静态(static)⽅方法内部发出对⾮非静态(non-static)⽅方法 的调⽤用?
不能
但是 从非静态方法内,可以调用静态方法
17、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以extends接口
抽象类可以implements接口
抽象类可以extends具体类
18、 一个".java"源⽂文件中是否可以包含多个类(不不是内部类)?有什什么限制?
可以包含多个类
但是只能有一个public修饰的,并且该类要与文件名相同
JVM虚拟机实例通过调用某个类的main()来执行程序,这个main()必须时public static void 并接受一个字符串作为参数,但是该类不一定是public类
19、 Anonymous Inner Class(匿匿名内部类)是否可以继承其它类?是否可以实 现接口?
匿名内部类在实现时必须借助一个类或一个接口,若从这个层次上讲它是可以继承其他类也可以实现接口的,但若是通过extends或implements关键字那是不可能的
20、Java 中的final关键字有哪些⽤用法?
http://www.cnblogs.com/amei0/p/8073853.html
21、Error和Exception有什么区别?
http://www.cnblogs.com/amei0/p/4591770.html
22、 try{}里有一个return语句句,那么紧跟在这个try后的finally{}里的代码会不会被执行?什么时候被执行,在return前还是后?如果finally{}里有return,try{}里的return会不会执行?如果try里分别返回值int a=1;Map map; 在finally{}里对以上返回值a,map做了修改。那么最终的返回会被影响吗?
try{}里有一个return语句句,那么紧跟在这个try后的finally{}里的代码会不会被执行:finally{}代码块始终被执行
在return前还是后:在return后
如果finally{}里有return,try{}里的return会不会执行?:不会
如果try里分别返回值int a=1;Map map; 在finally{}里对以上返回值a,map做了修改。那么最终的返回会被影响吗?:a不会被影响,map会被引用(值传递&引用传递)
https://www.cnblogs.com/lanxuezaipiao/p/3440471.html
23、Java语言如何进行异常处理,关键字:throws、throw、try、catch、 finally分别如何使用?
throws是抛出异常的声明,说明有抛异常的可能性,但不一定会抛异常
throw是抛出异常
try是将会发生异常的语句括起来,从而进行异常的处理
catch是如果有异常就会执行他里面的语句
而finally不论是否有异常都会进行执行的语句
24、阐述final、finally、finalize的区别
- final:可修饰类,方法,变量,参数,表示不可变
- finally:通常和try catch搭配使用,保证不管有没有发生异常,资源都能够被释放(释放连接、关闭IO流)
- Finalize:是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收。垃圾回收只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收,这个方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用。
25、List、Set、Map是否继承自Collection接口?
list,set是
map不是
集合详解:http://www.cnblogs.com/amei0/p/4589243.html
26、Collection和Collections的区别?
java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。常用方法如下
Collections.sort(list) 排序
Collections.Shuffling(list) 随机排序
Collections.reverse(list) 反转
Collections.copy(list,li) 复制
Collections.min(list) 获取集合中最小元素
27、 TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort() 方法如何比较元素?
TreeSet:要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小
TreeMap:要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序
Collections工具类:的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)
28、阐述 sleep(),wait(),yield()
sleep():
Thread类的方法,用于当前线程短暂休眠
用来暂停线程的执行,将CPU放给线程调度器
线程执行sleep()方法后转入阻塞(blocked)状态,会给低优先级的线程以运行的机会,休眠时间结束后,直接进入就绪状态。
不释放对象锁,如果有synchronized同步快,其他线程仍然不能访问共享数据
是一个静态方法,它暂停的是当前执行的线程
如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception(为什么要抛出该异常:https://www.ibm.com/developerworks/cn/java/j-jtp05236.html)
休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU
wait():
Object类的方法,用于线程间的通讯
执行wait()方法后转入等待(阻塞状态的一种)状态,一直到被唤醒,被唤醒以后,先要获得对象锁,获得锁后进入就绪状态。
释放对象锁
wait方法是针对一个被同步代码块加锁的对象
在使用这个方法时,必须处于synchronized代码块或者synchronized方法中,否则就会抛出IllegalMonitorStateException异常,这是因为调用这个方法前必须拿到当前对象的监视器monitor对象,也就是说notify/notifyAll和wait方法依赖于monitor对象
yield():
Thread类的方法
执行yield()方法后转入就绪(ready)状态,让有同样优先级的正在等待的线程有机会执行
yield方法不保证当前的线程会暂停或者停止,但是可以保证当前线程在调用yield方法时会放弃CPU
29、 synchronized关键字的用法
http://www.cnblogs.com/amei0/p/5051003.html
30、什么是线程池(thread pool)?
http://www.cnblogs.com/amei0/p/8422800.html
31、线程的基本状态以及状态之间的关系?
http://www.cnblogs.com/amei0/p/8473613.html
32、简述synchronized 和java.util.concurrent.locks.Lock的异同?
http://www.cnblogs.com/amei0/p/8475972.html
33、Java中如何实现序列化,有什么意义
http://www.cnblogs.com/amei0/p/8480260.html
34、 Java中有几种类型的流?
http://www.cnblogs.com/amei0/p/8480663.html
35、阐述JDBC操作数据库的步骤
http://www.cnblogs.com/amei0/p/8480776.html
36、 使⽤用JDBC操作数据库时,如何提升读取数据的性能?如何提升更更新数据的性能?
37、 在进行数据库编程时,连接池有什么作用?
http://www.cnblogs.com/amei0/p/8482877.html
38、 什么是DAO模式?
DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作。
DAO设计模式提供了一种通用的模式,来简化大量的代码,增强程序的可移植性。
DAO组成
在这个模式中DAO主要完成数据的操作,客户端依靠DAO接口进行操作,服务端要将接口进行具体实现。DAO的主要组成由以下几个部分组成。
1、DatabaseConnection:专门负责数据库打开与关闭操作的类。
2、VO:主要由属性、setter、getter方法,VO类中的属性与数据表中的字段相对应。每一个VO对象相当于表中的一条记录。
3、DAO接口:主要定义数据库操作的接口,定义数据库的原子性操作,如增删改,按ID查询。
4、Impl:DAO的具体实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭,接口类的名称首字母用“I”,表示其是一个接口。
5、Proxy:代理实现类。主要完成数据库的打开和关闭,并调用Impl类对象(真实对象类)的操作,之所以增加代理类是为了以后的拓展,如果一个程序可以A-B,那么中间最好加一个过渡,使用A-C-B的形式,可以有效减少程序的耦合度,使开发结构更加清晰。
6、Factory:工厂类,通过工厂类取得一个DAO的实例化对象,编写工厂类也是为了降低代码的耦合度,工厂类产生实例的方法通常是静态函 数,这样一来就可以通过工厂类名直接生成实例
39、 事务的ACID是指什么?
原子性(Atomic):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分
一致性(Consistency):在事务处理执行之前和之后,数据是一致的
隔离性(Isolation):一个事务处理对另一个事务处理没有影响
持久性(Durabiliy):当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来
http://www.cnblogs.com/amei0/p/4512573.html
40、JDBC中如何进行事务处理?
设置事务的提交方式为非自动提交:
conn.setAutoCommit(false);
将需要添加事务的代码放入try,catch块中
在try块内添加事务的提交操作,表示操作无异常,提交事务
conn.commit()
在catch块内添加回滚事务,表示操作出现异常,撤销事务:
conn.rollback();
41、JDBC能否处理理Blob和Clob?
可以
CLOB:
Character Large Object 字符大对象
在一些数据库系统里,也使用Text 作为CLOB的别名,比如SQL Server
使用CHAR来保存数据。 如:保存XML文档
BLOB:
binary large object 二进制大对象
是一个可以存储二进制文件的容器
使用二进制保存数据。 如:保存图片
42、 简述正则表达式及其用途
正则表达式就是记录文本规则的代码
43、 Java中是如何支持正则表达式操作的
Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()
Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作
String str = "北京市(朝阳区)(西城区)(海淀区)"; Pattern p = Pattern.compile(".*?(?=\\()"); Matcher m = p.matcher(str); if(m.find()) { System.out.println(m.group()); }
44、 获得一个类的类对象有哪些方式?
new:
new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕
反射
a:Student stu = (Student)Class.forName("根路径.Student").newInstance()
b:Student stu = Student.class.newInstance()
区别:
> Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。
> Class类的newInstance需要其构造方法是共有的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。
> Class类的newInstance抛出类构造函数的异常,而构造器类的newInstance包装了一个InvocationTargetException异常。
clone
先分配内存,将原来对象内存里的内容copy一份。不会调用构造方法
反序列化
45、什么是UML
UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言
UML的分类
结构型的图(Structure Diagram)
类图(Class Diagram)
对象图(Object Diagram)
构件图(Component Diagram)
部署图(Deployment Diagram)
包图(Package Diagram)
行为型的图(Behavior Diagram)
活动图(Activity Diagram)
状态机图(State Machine Diagram)
顺序图(Sequence Diagram)
通信图(Communication Diagram)
用例图(Use Case Diagram)
时序图(Timing Diagram)
详解:http://www.360doc.com/content/15/0322/16/14009801_457172619.shtml
46、阐述Servlet
http://www.cnblogs.com/amei0/p/8485140.html
47、常用的Web服务器有哪些
IIS
IIS服务是Windows产品自带的一种免费的Web服务器,安装配置简单,主要解析的是ASP程序代码,对于小型的、利用ASP编程的项目,可以采用其作为Web服务器。一般可以跟Apache整合起来使用。这种服务在配置过程中需要注意权限的问题。
Apache
世界排名第一、免费开源的Web服务器软件,可以安装运行在绝大多数的计算机平台上,支持大多数语言开发的B/S结构软件。一般情况下Apache与其他的Web服务器整合使用,功能非常强大,尤其在静态页面处理速度上表现优异。
Tomcat
Tomcat是Apache下的一个核心子项目,是目前使用量最大的免费的JAVA服务器。主要处理的是JSP页面和Servlet文件。Tomcat常常与Apache整合起来使用,Apache处理静态页面,比如Html页面,而Tomcat负责编译处理JSP页面与Servlet。在静态页面处理能力上,Tomcat不如Apache。由于Tomcat是开源免费、功能强大易用的,很多JAVA的初学者都喜欢用它。当然,也有不少中小企业用其与Apache整合做Web服务器。熟练掌握Tomcat的使用是非常必要的。可以这么说,熟练安装配置Tomcat是软件测试工程师的必备技能。
Jboss
Jboss是RedHat的产品(RedHat于2006年收购了Jboss)。与Tomcat相比,Jboss要专业些。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3.0的规范,本身不支持JSP/Servlet,需要与Tomcat集成才行。一般我们下载的都是这两个服务器的集成版。与Tomcat一样,Jboss也是开源免费的。Jboss在性能上的表现相对于单个Tomcat要好些。当然并非是绝对的,因为Tomcat做成集群,威力不容忽视。Jboss没有图形界面,也不需要安装,下载后解压,配置好环境变量后即可使用。
Resin
Resin是CAUCHO公司的产品,它也是一个常用的、支持JSP/Servlet的引擎,速度非常快,不仅在表现在动态内容的处理,还包括静态页面的处理上,Tomcat、Jboss在静态页面上的处理能力明显不足,一般都需要跟Apache进行整合使用。而Resin可以单独使用,当然Resin也可以与Apache,IIS整合使用。
Weblogic
WebLogic是BEA的产品,用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。与前面的几种小型Web服务器相比,更具专业性,但安装配置也更为复杂。WebLogic是一个商业的软件,使用是收费的,费用还挺贵的。
WebSphere
WebSphere是IBM的产品,是因特网的基础架构软件,也就是我们通常所说的中间件。它使企业能够开发、部署和集成新一代电子商务应用(如B2B的电子交易),并且支持从简单的Web发布到企业级事务处理的商务应用。比WebLogic更专业,当然价格也更贵。一般部署在IBM专业的服务器上
47、Java是如何实现跨平台的?
跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM)。 JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码
,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码⽂文件翻译 成特定平台下的机器器码然后运⾏行行。也就是说,只要在不同平台上安装对应的 JVM,就可以运⾏行行字节码⽂文件,运⾏行行我们编写的Java程序。 ⽽而这个过程中,我们编写的Java程序没有做任何改变,仅仅是通过JVM这⼀一”中间 层“,就能在不同平台上运⾏行行,真正实现了了”⼀一次编译,到处运⾏行行“的⽬目的。 JVM是⼀一个”桥梁梁“,是⼀一个”中间件“,是实现跨平台的关键,Java代码⾸首先被编译 成字节码⽂文件,再由JVM将字节码⽂文件翻译成机器器语⾔言,从⽽而达到运⾏行行Java程序 的⽬目的。 注意:编译的结果不是⽣生成机器器码,⽽而是⽣生成字节码,字节码不能直接运⾏行行,必 须通过JVM翻译成机器器码才能运⾏行行。不同平台下编译⽣生成的字节码是⼀一样的,但 是由JVM翻译成的机器器码却不⼀一样。 所以,运⾏行行Java程序必须有JVM的⽀支持,因为编译的结果不是机器器码,必须要经 过JVM的再次翻译才能执⾏行行。即使你将Java程序打包成可执⾏行行⽂文件(例例如 .exe),仍然需要JVM的⽀支持。 注意:跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机 器器码,不能跨平台,不同平台下需要安装不同版本的JVM
48、理解spiring ioc aop
IOC:http://blog.csdn.net/qq_22654611/article/details/52606960/
49、comparable与comparator的区别?
Comparable: 内比较器 若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。
Comparator: 外比较器 我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。适用场景:
1)一个对象没有实现Comparable接口,但是需要比较
2)一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式