Java笔试题集锦java
1.MVC的各个部分都有那些技术来实现?怎样实现? c++
答:MVC是Model-View-Controller的简写。"Model" 表明的是应用的业务逻辑(经过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),经过这样的设计模型把应用逻辑,处理过程和显示逻辑分红不一样的组件实现。这些组件可以进行交互和重用。 web
2.J2EE是什么? 算法
答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这种一个应用系统中,可依照功能划分为不一样的组件,这些组件又可在不一样计算机上,并且处于对应的层次(tier)中。所属层次包含客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。 sql
3.J2EE是技术仍是平台仍是框架? 数据库
答:J2EE自己是一个标准,一个为企业分布式应用的开发提供的标准平台。 编程
J2EE也是一个框架,包含JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 设计模式
4.STRUTS的应用(如STRUTS架构) 数组
答:Struts是採用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源代码的framework。 採用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有例如如下的主要功能: 浏览器
一.包括一个controller servlet,能将用户的请求发送到对应的Action对象。
二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员建立交互式表单应用。
三.提供了一系列有用对象:XML处理、经过Java reflection APIs本身主动处理JavaBeans属性、国际化的提示和消息。
5.WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
答:Web ServiceWeb Service是基于网络的、分布式的模块化组件,它运行特定的任务,遵照详细的技术规范,这些规范使得Web Service能与其它兼容的组件进行互操做。
JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你仅仅要使用这些通用的接口,当你需要改变详细的实现时候也不需要改动代码。
JAXM(Java API for XML Messaging) 是为SOAP通讯提供訪问方法和传输机制的API。
WSDL是一种 XML 格式,用于将网络服务描写叙述为一组端点,这些端点对包括面向文档信息或面向过程信息的消息进行操做。这样的格式首先对操做和消息进行抽象描写叙述,而后将其绑定到详细的网络协议和消息格式上以定义端点。相关的详细端点即组合成为抽象端点(服务)。
SOAP即简单对象訪问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务创建标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注冊中心的实现标准规范,同一时候也包括一组使企业能将自身提供的Web Service注冊,以使别的企业能够发现的訪问协议的实现标准。
6.C/S 与 B/S 差异:
答:有例如如下八个方面的不一样:
(1)硬件环境不一样:
C/S 通常创建在专用的网络上, 小范围里的网络环境, 局域网之间再经过专门server提供链接和数据交换服务.
B/S 创建在广域网之上的, 没必要是专门的网络硬件环境,例与电话上网, 租用设备. 信息本身管理. 有比C/S更强的适应范围, 通常仅仅要有操做系统和浏览器便可
(2)对安全要求不一样
C/S 通常面向相对固定的用户群, 对信息安全的控制能力很是强. 通常高度机密的信息系统採用C/S 结构适宜. 可以经过B/S公布部分可公开信息.
B/S 创建在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
(3)对程序架构不一样
C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统执行速度可以较少考虑.
B/S 对安全以及訪问速度的多重的考虑, 创建在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.
(4)软件重用不一样
C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌能够再利用,而不是作在墙上的石头桌子
(5)系统维护不一样
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 多是再作一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上本身下载安装就可以实现升级.
(6)处理问题不一样
C/S 程序可以处理用户面固定, 并且在一样区域, 安全要求高需求, 与操做系统相关. 应该都是一样的系统
B/S 创建在广域网上, 面向不一样的用户群, 分散地域, 这是C/S没法做到的. 与操做系统平台关系最小.
(7)用户接口不一样
C/S 可能是创建的Window平台上,表现方法有限,对程序猿广泛要求较高
B/S 创建在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.
(8)信息流不一样
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。
7.什么是JNDI
答:(Java Naming & Directory Interface)JAVA命名文件夹服务。主要提供的功能是:提供一个文件夹系统,让其余各地的应用程序在其上面留下本身的索引,从而知足高速查找和定位分布式应用程序的功能。
8.什么是JMS
答:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通信。包含点对点和广播
9.什么是JTA
答:(Java Transaction API)JAVA事务服务。提供各类分布式事务服务。应用程序仅仅需调用其提供的接口就能够。
10.开发中都用到了那些设计模式?用在什么场合?
答:每个模式都描写叙述了一个在咱们的环境中不断出现的问题,而后描写叙述了该问题的解决方式的核心。经过这样的方式,你可以无数次地使用那些已有的解决方式,无需在反复一样的工做。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
11.、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 Responsibleity(责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式,依据工厂模式实现的类可以依据提供的数据生成一组类中某一个类的实例,一般这一组类有一个公共的抽象父类并且实现了一样的方法,但是这些方法针对不一样的数据进行了不一样的操做。首先需要定义一个基类,该类的子类经过不一样的方法实现了基类中的方法。而后需要定义一个工厂类,工厂类可以依据条件生成不一样的子类实例。当获得子类的实例后,开发者可以调用基类中的方法而没必要考虑究竟返回的是哪个子类的实例。
12.UML方面
答:标准建模语言UML。用例图,静态图(包含类图、对象图和包图),行为图,交互图(顺序图,合做图),实现图
13.RMI
RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,可让在某个 Java 虚拟机上的对象调用还有一个 Java 虚拟机中的对象上的方法。能够用此方法调用的不论什么对象必须实现该远程接口。调用这样一个对象时,其參数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的參数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。假设方法调用致使抛出异常,则该异常将指示给调用方。
JAVA 基础
1.怎样得到数组的长度?
数组名.length
2.訪问修饰符“public/private/protected/缺省的修饰符”的使用类?
public : 公共,都可訪问
private: 私有的,同一个java类中可以訪问.子类不能訪问.
protected: 同一个包中的类均可訪问.子类可以訪问.
缺省,friendly :当前类,同一个包,都可以訪问.
做用域 当前类 同一package 子孙类 其它package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
3.Anonymous Inner Class (匿名内部类) 可否够extends(继承)其余类,可否够implements(实现)interface(接口)?
匿名内部类是没有名字的内部类,不能继承其余类,但一个内部类可以做为一个接口,由还有一个内部类实现.
1、因为匿名内部类没有名字,因此它没有构造函数。因为没有构造函数,因此它必须全然借用父类的构造函数来实例化,换言之:匿名内部类全然把建立对象的任务交给了父类去完毕。
2、在匿名内部类里建立新的方法没有太大意义,但它可以经过覆盖父类的方法达到奇妙效果,如上例所看到的。这是多态性的体现。
3、因为匿名内部类没有名字,因此没法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型必定是它的直接或间接父类类型。
new <类或接口> <类的主体>
匿名类
匿名类是不能有名称的类,因此没办法引用它们。必须在建立时,做为new语句的一部分来声明它们。
这就要採用还有一种形式的new语句,例如如下所看到的:
new <类或接口> <类的主体>
这样的形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还建立那个类的一个新实例,并把它做为语句的结果而返回。要扩展的类和要实现的接口是new语句的操做数,后跟匿名类的主体。
假设匿名类对还有一个类进行扩展,它的主体可以訪问类的成员、覆盖它的方法等等,这和其它不论什么标准的类都是同样的。假设匿名类实现了一个接口,它的主体必须实现接口的方法。
注意匿名类的声明是在编译时进行的,实例化在执行时进行。这意味着for循环中的一个new语句会建立一样匿名类的几个实例,而不是建立几个不一样匿名类的一个实例。
从技术上说,匿名类可被视为非静态的内部类,因此它们具备和方法内部声明的非静态内部类同样的权限和限制。
假设要运行的任务需要一个对象,但却不值得建立全新的对象(缘由多是所需的类过于简单,或者是由于它仅仅在一个方法内部使用),匿名类就显得很实用。匿名类尤为适合在Swing应用程序中高速建立事件处理程序。
exp:
return new Contents() {
private int i = 11;
public int value() { return i; }
};
这样的奇怪的语法要表达的意思是:“建立从Contents衍生出来的匿名类的一个对象”。由new表达式返回的句柄会本身主动上溯造型成一个Contents句柄。匿名内部类的语法事实上要表达的是:
class MyContents extends Contents {
private int i = 11;
public int value() { return i; }
}
return new MyContents();
若试图定义内部类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象必须是final属性.
public class Parcel9 {
public Destination
dest(final String dest, final float price) {
return new Destination() {
private int cost;
// Instance initialization for each object:
{
cost = Math.round(price);
if(cost > 100)
System.out.println("Over budget!");
}
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.dest("Tanzania", 101.395F);
}
}
4.static nested class 和 inner class的不一样?
nested class在c++中是嵌套类,inner class在java中是内部类.不一样就是在因而否有指向外部的引用上.静态内部类意味着建立一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的一个对象訪问到一个外部类的对象.
5.&和&&的差异
&是位运算符,表示按位与运算;&&是逻辑运算符,表示逻辑与(and)
6.Collection和Collections的差异
collection是集合类的上级接口,继承与它的接口主要是set和list
当中list必须以特定的顺序容纳元素;而一个set不能包括反复的元素.
映射(Map)一系列"键-值"对.可以返回本身键的一个set,一个包括本身值的list,或者包括本身(键-值)对的一个list.
都可构建本身的重复器.
collections类是针对集合类的一个帮助类.它提供一系列的静态方法对各类集合的搜索,排序,线程安全化等操做.
public class SimpleCollection {
public static void main(String[] args) {
Collection c = new ArrayList();
for(int i = 0; i < 10; i++)
c.add(Integer.toString(i));
Iterator it = c.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
7.何时用assert
assertion(断言)在软件开发中是一种常用的调试方式,很是多开发语言中都支持这样的机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;假设该值为false,说明程序已经处于不对的状态下,系统将给出警告或退出。通常来讲,assertion用于保证程序最基本、关键的正确性。assertion检查一般在开发和測试时开启。为了提升性能,在软件公布后,assertion检查通常是关闭的.
8.String s = new String("xyz");建立了几个String Object***
两个,一个字符对象,一个字符对象引用对象
9.math.round(11.5)和math.round(-11.5)
前者等于12,后者等于-11.round方法返回与參数最接近的长整数.參数加0.5,求其floor
10. short s1 = 1;s1 = s1+1;是否有错误? short s1 = 1;s1 += 1;是否有错误?
前者s1+1返回一个int型,需要强制类型转换.
后者正确.
11.java种有没有goto?
有,为保留字.但是还没有使用.
12.Overload和Override的差异。Overloaded的方法可否够改变返回值的类型?
答:方法的重写Overriding和重载Overloading是Java多态性的不一样表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。假设在子类中定义某方法与其父类有一样的名称和參数,咱们说该方法被重写 (Overriding)。子类的对象使用这种方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。假设在一个类中定义了多个同名的方法,它们或有不一样的參数个数或有不一样的參数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型
13.Set里的元素是不能反复的,那么用什么方法来区分反复与否呢? 是用==仍是equals()? 它们有何差异
答:Set里的元素是不能反复的,那么用iterator()方法来区分反复与否。equals()是判读两个Set是否相等
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值
14.给我一个你最多见到的runtime exception?
答:常见的执行时异常有例如如下这些
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..
15.error和exception有什么差异?
答:error 表示恢复不是不可能但很是困难的状况下的一种严重问题。比方说内存溢出。不可能期望程序能处理这种状况
exception 表示一种设计或实现问题。也就是说,它表示假设程序执行正常,从不会发生的状况
16.List, Set, Map是否继承自Collection接口
答: List,Set是,Map不是
17.abstract class和interface的差异
答:声明方法的存在而不去实现它的类叫虚拟类(abstract class).它用于建立一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的状况.不能建立abstract class的实例.但是可以声明一个abstract class变量,将其指向其详细子类的一个实例.不能有抽象构造函数或抽象静态方法.Abstract 类的子类为它们父类中的所有抽象方法提供实现,不然它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其余类可以在类中实现这些方法.
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可经过实现这种接口而得到。接口中的所有方法都是抽象的,没有一个有程序体。接口仅仅可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。而后,它可以在实现了该接口的类的不论什么对象上调用接口的方法。由于有抽象类,它赞成使用接口名做为引用变量的类型。一般的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口.
接口是一个更纯的抽象类.
18.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明白的构造函数
19.abstract的method是否可同一时候是static,是否可同一时候是native,是否可同一时候是synchronized
答:都不能.当中synchronized:(同步.避免在你和别人同一时候訪问一个属性的时候,属性的值发生不一样步的问题.)
native:(声明本地方法的keyword,可以经过声明的方法调用本地的动态连接库或者有C、C++等开发的函数。)
20.构造器Constructor是否可被override(构造函数)
答:构造器Constructor不能被继承,所以不能重写Overriding,但可以被重载Overloading
1). 构造器不能是native,final,static,synchronized 的,可以是public,private,或什么都没有。
2). 构造器函数里可以写return呢,但后面什么都不准有(包含null)
3). 构造器不能返回值.
但假设有个"构造器"返值了,它就不是构造器喽,仅仅是个普通方法
4). super();this();这两个方法仅仅能在构造方法里调用.
5). 成员变量声明时候赋值,比构造函数还早.
21.可否够继承String类
答:String类是final类故不可以继承
22.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被运行,何时被运行,在return前仍是后
答:会运行,在return前运行
23.用最有效率的方法算出2乘以8等於几
答:2 << 3
24.两个对象值一样(x.equals(y) == true),但却可有不一样的hash code,这句话对不正确
答:不正确,有一样的hash code
在C++中,每个类多有地址。
java也同样,只是hash code不是地址,而是一个标识对象用的。(我的以为)
每个对象的hash code是不同的,Object的默认hash code记得是按引用地址的。
对于String例外,是按String内容输出hash code的,这样可以用equals()来比較String的
内容是否相等了,而不是地址
在 Java 应用程序运行期间,在同一对象上屡次调用 hashCode 方法时,必须一致地返回一样的整数,前提是对象上 equals 比較中所用的信息没有被改动。从某一应用程序的一次运行到同一应用程序的还有一次运行,该整数无需保持一致。
假设依据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成一样的整数结果。
下面状况不 是必需的:假设依据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必然会生成不一样的整数结果。但是,程序猿应该知道,为不相等的对象生成不一样整数结果可以提升哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不一样的对象返回不一样的整数。(这一般是经过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这样的实现技巧。)
25.当一个对象被看成參数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递仍是引用传递
答:是值传递。Java 编程语言仅仅有值传递參数。当一个对象实例做为一个參数被传递到方法中时,參数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
26.swtich可否做用在byte上,可否做用在long上,可否做用在String上
答:witch(expr1)中,expr1是一个整数表达式。所以传递给 switch 和 case 语句的參数应该是 int、 short、 char 或者 byte。long,string 都不能做用于swtich
27.ArrayList和Vector的差异,HashMap和Hashtable的差异
答:就ArrayList与Vector主要从二方面来讲.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增加:当需要增加时,Vector默认增加为原来一培,而ArrayList倒是原来的一半
就HashMap与HashTable主要从三方面来讲。
一.历史缘由:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:仅仅有HashMap可以让你将空值做为一个表的条目的key或value
28.GC是什么? 为何要有GC
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员easy出现故障的地方,忘记或者错误的内存回收会致使程序或系统的不稳定甚至崩溃,Java提供的GC功能可以本身主动监測对象是否超过做用域从而达到本身主动回收内存的目的,Java语言没有提供释放已分配内存的显示操做方法。
29.float型float f=3.4是否正确?
答:不对。精度不许确,应该用强制类型转换,例如如下所看到的:float f=(float)3.4
30.介绍JAVA中的Collection FrameWork(包含怎样写本身的数据结构)?
答:Collection FrameWork例如如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最主要的集合接口,一个Collection表明一组Object,即Collection的元素(Elements)
Map提供key到value的映射.
31.抽象类与接口?
答:抽象类与接口都用于抽象,但是抽象类(JAVA中)可以有本身的部分实现,而接口则全然是一个标识(同一时候有多重继承的功能)
JAVA类实现序例化的方法是实现java.io.Serializable接口
Collection框架中实现比較要实现Comparable 接口和 Comparator 接口
32.STRING与STRINGBUFFER的差异。
答:STRING的长度是不可变的,STRINGBUFFER的长度是可变的。假设你对字符串中的内容经常进行操做,特别是内容要改动时,那么使用StringBuffer,假设最后需要String,那么使用StringBuffer的toString()方法
33.谈谈final, finally, finalize的差异
答:final—修饰符(keyword)假设一个类被声明为final,意味着它不能再派生出新的子类,不能做为父类被继承。所以一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在之后的引用中仅仅能读取,不可改动。被声明为final的方法也相同仅仅能使用,不能重载
finally—再异常处理时提供 finally 块来运行不论什么清除操做。假设抛出一个异常,那么相匹配的 catch 子句就会运行,而后控制就会进入 finally 块(假设有的话)
finalize—方法名。Java 技术赞成使用 finalize() 方法在垃圾收集器将对象从内存中清除出去以前作必要的清理工做。这种方法是由垃圾收集器在肯定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,所以所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者运行其它清理工做。finalize() 方法是在垃圾收集器删除对象以前对这个对象调用的
34.面向对象的特征有哪些方面
答:主要有下面四方面:
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而仅仅是选择当中的一部分,临时不用部分细节。抽象包含两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且赞成和鼓舞类的重用,它提供了一种明白表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以改动或添加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的訪问仅仅能经过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列全然自治、封装的对象,这些对象经过一个受保护的接口訪问其它对象。
4. 多态性:
多态性是指赞成不一样类的对象对同一消息做出响应。多态性包括參数化多态性和包括多态性。多态性语言具备灵活、抽象、行为共享、代码共享的优点,很是好的攻克了应用程序函数同名问题。
35.String是最主要的数据类型吗
答:基本数据类型包含byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,所以不可以继承这个类、不能改动这个类。为了提升效率节省空间,咱们应该用StringBuffer类
36.int 和 Integer 有什么差异
答:Java 提供两种不一样的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。原始类型封装类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用类型和原始类型的行为全然不一样,并且它们具备不一样的语义。引用类型和原始类型具备不一样的特征和使用方法,它们包含:大小和速度问题,这样的类型以哪一种类型的数据结构存储,当引用类型和原始类型用做某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关.
37.执行时异常与通常异常有何异同
答:异常表示程序执行过程当中可能出现的非正常状态,执行时异常表示虚拟机的一般操做中可能遇到的异常,是一种常见执行错误。java编译器要求方法必须声明抛出可能发生的非执行时异常,但是并不要求必须声明抛出未被捕获的执行时异常。
38.说出ArrayList,Vector, LinkedList的存储性能和特性
答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便添加和插入元素,它们都赞成直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操做,因此索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),一般性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时仅仅需要记录本项的先后项就能够,因此插入速度较快
39.HashMap和Hashtable的差异
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完毕了Map接口,主要差异在于HashMap赞成空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap赞成将null做为一个entry的key或者value,而Hashtable不一样意。
HashMap把Hashtable的contains方法去掉了,改为containsvalue和containsKey。因为contains方法easy让人引发误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不一样是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程訪问Hashtable时,不需要本身为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap採用的hash/rehash算法都大概同样,因此性能不会有很是大的差别。
40.heap和stack有什么差异****
答:栈是一种线形集合,其加入和删除元素的操做应在同一段完毕。栈依照后进先出的方式进行处理。堆是栈的一个组成元素
41.Java中的异常处理机制的简单原理和应用
答:当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包含2种状况。一种是JAVA类库内置的语义检查。好比数组下标越界,会引起IndexOutOfBoundsException;訪问null的对象时会引起NullPointerException。还有一种状况就是JAVA赞成程序猿扩展这样的语义检查,程序猿可以建立本身的异常,并自由选择在什么时候用throwkeyword引起异常。所有的异常都是java.lang.Thowable的子类。
42.垃圾回收的长处和原理。并考虑2种回收机制
答:Java语言中一个显著的特色就是引入了垃圾回收机制,使c++程序猿最头疼的内存管理的问题迎刃而解,它使得Java程序猿在编敲代码的时候再也不需要考虑内存管理。由于有个垃圾回收机制,Java中的对象再也不有"做用域"的概念,仅仅有对象的引用才有"做用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是做为一个单独的低级别的线程执行,不可预知的状况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序猿不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
43.你所知道的集合类都有哪些?主要方法?
答:最常用的集合类是 List 和 Map。 List 的详细实现包含 ArrayList 和 Vector,它们是可变大小的列表,比較适合构建、存储和操做不论什么类型对象的元素列表。 List 适用于按数值索引訪问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称做"键"和"值"),当中每个键映射到一个值。
44.描写叙述一下JVM载入class文件的原理机制?
答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java执行时系统组件。它负责在执行时查找和装入类文件的类。
45.排序都有哪几种方法?请列举
答: 排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、高速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
高速排序的伪代码。
/ /使用高速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素做为m i d d l e,该元素为支点
把余下的元素切割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用高速排序方法对left 进行排序
递归地使用高速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t
46.JAVA语言怎样进行异常处理,keyword:throws,throw,try,catch,finally分别表明什么意义?在try块中可以抛出异常吗?
答:Java经过面向对象的方法进行异常处理,把各类不一样的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其余子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包括有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是经过5个关键词来实现的:try、catch、throw、throws和finally。普通状况下是用try来运行一段程序,假设出现异常,系统会抛出(throws)一个异常,这时候你可以经过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包括一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明白地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各类"异常"。
Finally为确保一段代码不管发生什么"异常"都被运行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写还有一个try语句保护其它代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完毕。假设下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这样的"异常"的try语句。
47.一个".java"源文件里可否够包含多个类(不是内部类)?有什么限制?
答:可以。必须仅仅有一个类名与文件名称一样。
48.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们各自是哪些类?
答:字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有更多的流,主要是为了提升性能和使用方便。
49.java中会存在内存泄漏吗,请简单描写叙述。
答:会。本身实现堆载的数据结构时有可能会出现内存泄露
50.垃圾回收器的基本原理是什么?垃圾回收器可以当即回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
答:对于GC来讲,当程序猿建立对象时,GC就開始监控这个对象的地址、大小以及使用状况。一般,GC採用有向图的方式记录和管理堆(heap)中的所有对象。经过这样的方式肯定哪些对象是"可达的",哪些对象是"不可达的"。当GC肯定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序猿可以手动运行System.gc(),通知GC运行,但是Java语言规范并不保证GC必定会运行。
51.静态变量和实例变量的差异?
答:static i = 10; //常量 class A a; a.i =10;//可变
52.什么是java序列化,怎样实现java序列化?*****
答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操做,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操做时所引起的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable仅仅是为了标注该对象是可被序列化的,而后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将參数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
53.可否够从一个static方法内部发出对非static方法的调用?
答:不可以,假设当中包括对象的method();不能保证对象初始化.
54.写clone()方法时,一般都有一行代码,是什么?
答:Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。
55.在JAVA中,怎样跳出当前的多重嵌套循环?
答:用break; return 方法。
56.List、Map、Set三个接口,存取元素时,各有什么特色?
答:List 以特定次序来持有元素,可有反复元素。Set 没法拥有反复元素,内部排序。Map 保存key-value值,value可多值。
57.说出一些常用的类,包,接口,请各举5个
答:常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的接口:Remote List Map Document NodeList
58.描写叙述使用JDBC链接数据库的过程
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:obdc:mydb";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
ResultSet rs = stmt.execte("select * from mytable");
59.什么是JNDI?
java命名文件夹接口
60.Java 的通讯编程,编程题(或问答),用JAVA SOCKET编程,读server几个字符,再写入本地显示?
答:Server端程序:
package test;
import java.net.*;
import java.io.*;
public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss=new ServerSocket(10000);
while(true)
{
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
}catch (IOException e)
{
out.println("wrong");
}
}
public static void main(String[] args)
{
new Server();
}
};
Client端程序:
package test;
import java.io.*;
import java.net.*;
public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
System.out.println("Try to Connect to 127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new
InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e)
{
out.println("Wrong");
}
}
public static void main(String[] args)
{
new Client();
}
};
61. 线程的基本概念、线程的本状态以及状态之间的关系
•新建 (Born) : 新建的线程处于新建状态
•就绪 (Ready) : 在建立线程后,它将处于就绪状态,等待 start() 方法被调用
•执行 (Running) : 线程在開始执行时进入执行状态
•睡眠 (Sleeping) : 线程的运行可经过使用 sleep() 方法来临时停止。在睡眠后,线程将进入就绪状态
•等待 (Waiting) : 假设调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发执行时。
•挂起 (Suspended) : 在暂时中止或中断线程的运行时,线程就处于挂起状态。
•恢复 (Resume) : 在挂起的线程被恢复运行时,可以说它已被恢复。
•堵塞 (Blocked) – 在线程等待一个事件时(好比输入/输出操做),就称其处于堵塞状态。
•死亡 (Dead) – 在 run() 方法已完毕运行或其 stop() 方法被调用以后,线程就处于死亡状态。
串行化的注意事项以及怎样实现串行化答:假设有循环引用是不可以串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法
62.内部类要点?
静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
静态内部类的非静态成员可以訪问外部类的静态变量,而不可訪问外部类的非静态变量。
非静态内部类的非静态成员可以訪问外部类的非静态变量。
63.java中有几种方法可以实现一个线程?用什么keyword修饰同步方法? stop()和suspend()方法为什么不推荐使用?
答:有两种实现方法,各自是继承Thread类与实现Runnable接口
用synchronizedkeyword修饰同步方法
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且假设对象处于一种不连贯状态,那么其它线程能在那种状态下检查和改动它们。结果很是难检查出真正的问题所在。suspend()方法easy发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这以前得到的锁定。此时,其它不论什么线程都不能訪问锁定的资源,除非被"挂起"的线程恢复执行。对不论什么线程来讲,假设它们想恢复目标线程,同一时候又试图使用不论什么一个锁定的资源,就会形成死锁。因此不该该使用suspend(),而应在本身的Thread类中置入一个标志,指出线程应该活动仍是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()又一次启动线程。
64.sleep() 和 wait() 有什么差异?
答:sleep是线程类(Thread)的方法,致使此线程暂停运行指定时间,给运行机会给其它线程,但是监控状态依旧保持,到时后会本身主动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法致使本线程放弃对象锁,进入等待此对象的等待锁定池,仅仅有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备得到对象锁进入执行状态。
65.同步和异步有何异同,在什么状况下分别使用他们?举例说明。
答:假设数据将在线程间共享。好比正在写的数据之后可能被还有一个线程读到,或者正在读的数据可能已经被还有一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很是长时间来运行的方法,并且不但愿让程序等待方法的返回时,就应该使用异步编程,在很是多状况下採用异步途径每每更有效率。
66.启动一个线程是用run()仍是start()?
答:启动一个线程是调用start()方法,使线程所表明的虚拟处理机处于可执行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立刻执行。run()方法可以产生必须退出的标志来中止一个线程。
67.当一个线程进入一个对象的一个synchronized方法后,其余线程是否可进入此对象的其它方法?
答:不能,一个对象的一个synchronized方法仅仅能由一个线程訪问。
68.请说出你所知道的线程同步的方法。
答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在执行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM肯定唤醒哪一个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
69.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,各自是继承Thread类与实现Runnable接口
同步的实现方面有两种,各自是synchronized,wait与notify
70.线程的基本概念、线程的基本状态以及状态之间的关系
答:线程指在程序运行过程当中,能够运行程序代码的一个运行单位,每个程序至少都有一个线程,也就是程序自己。
Java中的线程有四种状态各自是:执行、就绪、挂起、结束
71.简述synchronized和java.util.concurrent.locks.Lock的异同 ?
答:主要一样点:Lock能完毕synchronized所实现的所有功能
主要不一样点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会本身主动释放锁,而Lock必定要求程序猿手工释放,并且必须在finally从句中释放。
jsp笔试
1.jsp有哪些内置对象?做用各自是什么?
答:JSP共同拥有下面9种基本内置组件(可与ASP的6种内部组件相相应):
request 用户端请求,此请求会包括来自GET/POST请求的參数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在运行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页自己
exception 针对错误网页,未捕捉的例外
2.jsp有哪些动做?做用各自是什么?
答:JSP共同拥有下面6种基本动做
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:依据浏览器类型为Java插件生成OBJECT或EMBED标记
4.JSP中动态INCLUDE与静态INCLUDE的差异?
答:动态INCLUDE用jsp:include动做实现
<jsp:include page="included.jsp" flush="true" />它老是会检查所含文件里的变化,适合用于包括动态页面,并且可以带參数
静态INCLUDE用include伪码实现,但不会检查所含文件的变化,适用于包括静态页面
<%@ include file="included.htm" %>
5.两种跳转方式各自是什么?有什么差异?
答:有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,仅仅是显示该页的结果,主页面仍是原来的页面。运行完后还会回来,至关于函数调用。并且可以带參数.后者全然转向新页面,不会再回来。至关于go to 语句。
6.JSP的内置对象及方法。
答:request表示HttpServletRequest对象。它包括了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的实用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各类范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化參数。
page表示从该页面产生的一个servlet实例
servlet笔试题目
1.说一说Servlet的生命周期?
答:servlet有良好的生存期的定义,包含载入和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 Servlet被server实例化后,容器执行其init方法,请求到达时执行其service方法,service方法本身主动派遣执行与请求相应的doXXX方法(doGet,doPost)等,当server决定将实例销毁的时候调用其destroy方法。
与cgi的差异在于servlet处于server进程中,它经过多线程方式执行其service方法,一个实例可以服务于多个请求,并且事实上例通常不会销毁,而CGI对每个请求都产生新的进程,服务完毕后就销毁,因此效率上低于servlet。
2.JAVA SERVLET API中forward() 与redirect()的差异?
答:前者仅是容器中控制权的转向,在client浏览器地址栏中不会显示出转向后的地址;后者则是全然的跳转,浏览器将会获得跳转的地址,并又一次发送请求连接。这样,从浏览器的地址栏中可以看到跳转后的连接地址。因此,前者更加高效,在前者可以知足需要时,尽可能使用forward()方法,并且,这样也有助于隐藏实际的连接。在有些状况下,比方,需要跳转到一个其余server上的资源,则必须使用sendRedirect()方法。
3.Servlet的基本架构
答:
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}
4.什么状况下调用doGet()和doPost()?
答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
5.servlet的生命周期
答:web容器载入servlet,生命周期開始。经过调用servlet的init()方法进行servlet的初始化。经过调用service()方法实现,依据请求的不一样调用不一样的do***()方法。结束服务,web容器调用servlet的destroy()方法。
6.怎样现实servlet的单线程模式
答:<%@ page isThreadSafe="false"%>
7. 页面间对象传递的方法
答:request,session,application,cookie等
8.四种会话跟踪技术
答:会话做用域ServletsJSP 页面描写叙述
page否是表明与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有不论什么的 include 指令,但是没有 include 动做)表示。这既包含 servlet 又包含被编译成 servlet 的 JSP 页面
request是是表明与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动做的关系)
session是是表明与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求
application是是表明与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包含多个页面、请求和会话的一个全局做用域
10.咱们在web应用开发过程当中经常遇到输出某种编码的字符,如iso8859-1等,怎样输出一个某种编码的字符串?
答:
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
11.Servlet运行时通常实现哪几个方法?
答:
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
12.说出数据链接池的工做机制是什么?
答:J2EEserver启动时会创建必定数量的池链接,并一直维持很多于此数目的池链接。client程序需要链接时,池驱动程序会返回一个未使用的池链接并将其表记为忙。假设当前没有空暇链接,池驱动程序就新建必定数量的链接,新建链接的数量有配置參数决定。当使用的池链接调用完毕后,池驱动程序将此链接表记为空暇,其它调用就可以使用这个链接。
13.Class.forName的做用?为何要用?
答:调用该訪问返回一个以字符串指定类名的类的对象。