STAX:Streaming API for XML (StAX) k4pvp5}%
71、简述synchronized和java.util.concurrent.locks.Lock的异同 ? ,Q(n(m'
主要相同点:Lock能完成synchronized所实现的所有功能 bLu6|YB
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。 JS&l
h
72、EJB的角色和三个对象 S?hM
一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator) R9S7p)B
三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类 0g]ABzTn
73、EJB容器提供的服务 TKoO\\
主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。 D6bCC;
h=
74、EJB规范规定EJB中禁止的操作有哪些? bL
*; N3#E
1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等),2.不能操作awt,3.不能实现服务器功能,4.不能对静态属生存取,5.不能使用IO操作直接存取文件系统,6.不能加载本地库.,7.不能将this作为变量和返回,8.不能循环调用。 k>VP<Zm13
75、remote接口和home接口主要作用 ),bdj+wr78
remote接口定义了业务方法,用于EJB客户端调用业务方法。 X@x:
F|/P
home接口是EJB工厂用于创建和移除查找EJB实例 ^ 9;s
nr
76、bean 实例的生命周期 X~GZI*P
对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。 &xH>U*c
77、EJB的激活机制 f=~@e#U
以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。 i-sE\m
78、EJB的几种类型 xZ`t~4qR
会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean ]}>GUXe)^
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种 <%pi*:E|
实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种 jE2ziK
79、客服端调用EJB对象的几个基本步骤 8Mws?]\/q
设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。 _z,/!>J
80、如何给weblogic指定大小的内存? Y0|~]J(B
在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M .vQ2w
81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? Yz-b~D/=}
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。 J9poqp@`MG
82、如何启动时不需输入用户名与密码? HaB=nLAT
修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码. $Ae/NwIlc
83、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? Kh<v2
保存在此Domain的config.xml文件中,它是服务器的核心配置文件。 ;1{S"UY
84、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办? vU{ZB^+&6o
Domain目录\服务器目录\applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。 2Y 6/,W
85、在weblogic中发布ejb需涉及到哪些配置文件 a^Zn
}R r
不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml 4pA<s-
86、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置 #J2856bzS
缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。 ?/dz!{JC
87、如何查看在weblogic中已经发布的EJB? `mCcD
可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB >Cd%tIie*
88、CORBA是什么?用途是什么? 7
hnTHL
CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。 F;q I^{m2
89、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法 .^JID~<?#
Session Facade Pattern:使用SessionBean访问EntityBean >)#*}JI
Message Facade Pattern:实现异步调用 -fUz$Df/R
EJB Command Pattern:使用Command JavaBeans取代SessionBean,实现轻量级访问 T'Jw\u>"R
Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性 ml?+JbLg0
Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性 V7rcnk#
Business Interface:通过远程(本地)接口和Bean类实现相同接口规范业务逻辑一致性 @gxO%@@
EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。 puXJ:yo(
90、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 y"@~5e477$
persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方式的消息将被丢弃。 I|WBT
91、Servlet执行时一般实现哪几个方法?
& k1Ez
public void init(ServletConfig config) )-
2^Jvc
public ServletConfig getServletConfig() Yl-09)7s
public String getServletInfo() [&+wW
public void service(ServletRequest request,ServletResponse response) XHpoaHyx
public void destroy() Fzu"&&>0$
92、j2ee常用的设计模式?说明工厂模式。 [gv2fqpP
Java中的23种设计模式: JvHJ*E
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), >b{%j8uM
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), ;Kkn7&'F
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), :4Q_\'P
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), ,3fw"P$
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), mGL%<4R,
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), qQpR gzw
Observer(观察者模式), State(状态模式), Strategy(策略模式), $)7-wCl</
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) p(0!TCBs
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 7z%zXDe~T[
93、EJB需直接实现它的业务接口或Home接口吗,请简述理由。 II~D66 bF
远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。 >DbG$V<v'
94、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 zhN'@Wj'_
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序) Iupk+x>
快速排序的伪代码。 b;x^>(It
/ /使用快速排序方法对a[ 0 :n- 1 ]排序 O^:Rm=,$
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 d(To)ly.
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 _v2FXm
递归地使用快速排序方法对left 进行排序 K bwWrf>
递归地使用快速排序方法对right 进行排序 [ HNGTde&
所得结果为l e f t + m i d d l e + r i g h t R
)?8A\<E
95、请对以下在J2EE中常用的名词进行解释(或简单描述) BT#'<!7!
web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。 :_Ng`b/
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。 7sLs+|<"
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。 ! *pK#
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。 Q'Q+mt8u5
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。 |n6nRE wW
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。 Ns1u0$fg
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。 \f{C2d/6j
96、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? '{OZ[$E
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。 {mkYW-4Se
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。 kTC6fNj[
throw语句用来明确地抛出一个"异常"。 SrHRpxy
throws用来标明一个成员函数可能抛出的各种"异常"。 7Bmt^J5i&t
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。 C'5i>;
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。 :Z=A,G
97、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? MWhFNfS8=
可以。必须只有一个类名与文件名相同。 IL>Gi`Y&
98、MVC的各个部分都有那些技术来实现?如何实现? r ."Dc
MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。 ~@sx}u
99、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? +Do7rl
有两种实现方法,分别是继承Thread类与实现Runnable接口
ze#LX4b I
用synchronized关键字修饰同步方法 z
^a,7}4
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。 Y%wF;I1x
100、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? >nl*aN
字节流,字符流。字节流继承于InputStream \ OutputStream,字符流继承于InputStreamReader \ OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。 =cRJtn
101、java中会存在内存泄漏吗,请简单描述。 M:C*?;K:
会。如:int i,i2; return (i-i2); //when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。 KZDB \T
102、java中实现多态的机制是什么? TR:D
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 -4hX-
103、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? &1B)mj
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。 .6.oqb
104、静态变量和实例变量的区别? :5"|iRP'
static i = 10; //常量 5RlJybN"o
class A a; a.i =10;//可变 I{1w8m4O6
105、什么是java序列化,如何实现java序列化? #j; &g1
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 |0-5-.
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。 O[`n{Vl/
106、是否可以从一个static方法内部发出对非static方法的调用? y f+/Kj<
a
不可以,如果其中包含对象的method();不能保证对象初始化. _Thc\{aV#
107、写clone()方法时,通常都有一行代码,是什么? NrL%]dl3/
Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。 a(BC(^1!
108、在JAVA中,如何跳出当前的多重嵌套循环? U'lrdc"Q
用break; return 方法。 wetkmd
109、List、Map、Set三个接口,存取元素时,各有什么特点? 0Y"==g+>f
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。 pK$^@~DE
110、J2EE是什么? RHB>svT^K>
J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。 cQ+V4cW
Z
111、UML方面 WJJ!NoP
标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。 b5H[~8mf
112、说出一些常用的类,包,接口,请各举5个 ICV67(Ui
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer |dXS+R1
常用的包:java.lang java.awt java.io java.util java.sql .GS|H d
常用的接口:Remote List Map Document NodeList Vw)\#6FL
113、开发中都用到了那些设计模式?用在什么场合? nGyY`wt&Rg
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。 O'5(L9,
114、jsp有哪些动作?作用分别是什么? B VPf8!-
JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。 KQr=;O\T
115、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 5(U.<
可以继承其他类或完成其他接口,在swing编程中常用此方式。 r*,]=M W
116、应用服务器与WEB SERVER的区别? `CHgTkv
应用服务器:Weblogic、Tomcat、Jboss 1S_KX.
WEB SERVER:IIS、 Apache lYy0
117、BS与CS的联系与区别。 Grw_SVa^
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。 ;GE0iSC
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。 fT'A{&h|U
C/S 与 B/S 区别: #UGbSOoCtn
1.硬件环境不同: (cA=~Bw[=
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. S liF$}J
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行 zHx?-Q&3
2.对安全要求不同 LU%g>?m.]
C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息. `D GO~RMp9
B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。 %*r Pd>*
3.对程序架构不同 !TG"AW
C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. 1uD}V7_y"
B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟. 6|9];)
4.软件重用不同 iOD9lR`s
C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好. wePMBL1P*
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子 w|$;$a7)
5.系统维护不同 JXvHsCd?
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统 iAXx`>}m
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级. DpTQP u9
6.处理问题不同 3HfT9
C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统 -98bX]8
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小. ;N4mR6
7.用户接口不同 wV(_=LF
C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高 dn5T7a~
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本. 9Uk9TG 5
8.信息流不同 /=-E`%R}!
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低 Q2k\8i
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。 @c.QrKSaD
118、LINUX下线程,GDI类的解释。 ,sJ{2,]~
LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。 5F0sfX
GDI类为图像设备编程接口类库。 guf+AVPno
119、STRUTS的应用(如STRUTS架构) @o>2:D1G
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属性、国际化的提示和消息。 5a_K|(~3I
120、Jdo是什么? _39b8s{
JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。 1M<'^(t3d
121、内部类可以引用他包含类的成员吗?有没有什么限制? cvc.-7IO
一个内部类对象可以访问创建它的外部类对象的内容 'MC)%N,
122、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 j[=f;&1
Web ServiceWeb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。 9N-mIGJ
JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。 LWIU7dw
JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。 jPbL3"0A&
WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。 [9$>N
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。 ;Hm\?n)a
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。 0ED(e1K#B
f#5mX&j
7AtJ6
JAVA代码查错 7Qq>?H -
1. b},OCVT?
abstract class Name { &uk?1Z#j
private String name; W]reQ&<Z
public abstract boolean isStupidName(String name) {} eBBh/=Zc
} 7]
~'8
大侠们,这有何错误? B%r)~?6DM
答案: 错。abstract method必须以分号结尾,且不带花括号。 LR`/pet
2. aP4r6lLv+
public class Something { I-+D+DhRx
void doSomething () { P:CwC"z>sS
private String s = ""; m~X:KwK4
int l = s.length(); WXGLo;+>I
} ^>]p4Q3 6
} 3pl.<;9r
有错吗? ^8We}bs-c
答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量 HgG"9WBe%
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。 sd#a_
3. t1Cyyb
abstract class Something { hX[hR
private abstract String doSomething (); ]l&_Pv!!
} jQ`cfE$sV
这好像没什么错吧? =FdS'<GM
答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract S* <:He&1
method封锁起来呢? (同理,abstract method前不能加final)。 oBIKtS*L
4. !&! sn"yD
public class Something { (8{h I
public int addOne(final int x) { o'Po<I
return ++x; 4UG7{[!+
} ]k >S0
} |-Y,:sY:
这个比较明显。 "y5c)l(Rg
答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。 x/5%a{~j2
5. UJlKw `4
public class Something { 8<IOX
public static void main(String[] args) { M-0BQs`N
Other o = new Other(); C2bN<K
new Something().addOne(o); 'N'EC`R
} Qv[@ioc
public void addOne(final Other o) { Jf4D">h
o.i++; .pG_j]
} iQs(Dh=*
} 3kQky
class Other { }6ec2I%`o
public int i; :8\z 0
} u9sffX5x[J
和上面的很相似,都是关于final的问题,这有错吗? ~eE2!/%9
答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference ;h3c+7u1
(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable dsrzXmE0
(成员变量),而o的reference并没有改变。 BTGPP@p4
6. M0 =K#/
class Something { _ jF,
k>F
int i; YDdmT7Ow
public void doSomething() { m[(2
System.out.println("i = " + i); [7Q |vu
} <5?.S{Z9
} m03;'Nj'7#
有什么错呢? 看不出来啊。 AfFFu\
答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。 _Su$oOy(Ea
7. D+#QQH
class Something { #k5Nnv#(J
final int i; w}YO+
public void doSomething() { x4R[Q&:M
System.out.println("i = " + i); U
$e-e/
} !&?(ty^F
} 0P&rTtU6
和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗? 3zv_q&+8b
答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int i = 0;"。 -h8A<
8. @6(4}&sEdm
public class Something { >o%.`)Ar
public static void main(String[] args) { c$bb0J%
Something s = new Something(); S0,p:Wey
System.out.println("s.doSomething() returns " + doSomething()); b&s"x?
7
} Wyw/imr
public String doSomething() { D$!(Iae
return "Do something ..."; \:%e 6M
} " :@5|4qK
} @=isN'>] O
看上去很完美。 |^8l8u
答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能访问non-static instant variable。 #4DEb<D
9. }e&
此处,Something类的文件名叫OtherThing.java d
0$)Y|d>
class Something { #-Ehg4W
private static void main(String[] something_to_do) { +t,JCY6
System.out.println("Do something ..."); %9uLxC;
} yM=%a3
} ,J!G-?:@n
这个好像很明显。 fu"#C}{
答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。 IBo)fE\O
10. ~\6Kq`Y
interface A{ x?y)a9&Hm
int x = 0; 6"/cz~h
} n2Q ~fx<6%
class B{ CcG{+-=H)
int x =1; "+~La{POc
} 'K"V{
class C extends B implements A { 48Vmz
public void pX(){ tF+m/}PM^
System.out.println(x); 294
0M4
} QcU&G*
public static void main(String[] args) { u|BD=4*
new C().pX(); *G7/
} )!s f@F?
} Oc}4`?oy<O
答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。 jhr:QS/9
11.
")q
interface Playable { LK-2e$1
void play(); I'Ui` :A
} -iLp3m<ai
interface Bounceable { -hZlFAZi
void play(); 9nu!|reS
} &Egw94l
interface Rollable extends Playable, Bounceable { \_bk+}WJ]s
Ball ball = new Ball("PingPang"); ( d#E16y
} >TK:&V
class Ball implements Rollable { \Z{6j&;
private String name; \7n ;c
public String getName() { iO4Yfj#?
return name; h8iic
} \fj*.[,
public Ball(String name) { A NR?An
this.name = name; |08b=aR6ro
} 1MkQ$v7m
public void play() { V^sZXdDNL
ball = new Ball("Football"); e`27 ?
System.out.println(ball.getName()); qb'4x){
} h mC.5mY
} C2OBgM+
这个错误不容易发现。 %{?EfULg
答案: 错。"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。 _r@
FWUZ
v0+mh]
,l+lokD-#
JAVA编程题 b*i_'k}*<g
1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset f*)8bZDD
import java.util.*; >rJ9^rS
public class bycomma{ l6]:Zcd0
public static String[] splitStringByComma(String source){ l.[S.@\ =.
if(source==null||source.trim().equals("")) >1q
W*
return null; 'M8wjU
StringTokenizer commaToker = new StringTokenizer(source,","); t@m!k+0
String[] result = new String[commaToker.countTokens()]; qtlXDgppO
int i=0; !:"$1kh1("
while(commaToker.hasMoreTokens()){ WD.td
result = commaToker.nextToken(); T rK-XTev
i++; wyWe2d
} /&1FgSARK
return result; k;BXt:jDq
} Z'=:Bo{
public static void main(String args[]){ PggjuPPh
String[] s = splitStringByComma("5,8,7,4,3,9,1"); [[
{L#
int[] ii = new int[s.length]; t,H=;U#
for(int i = 0;i<s.length;i++){ jMFLd
ii =Integer.parseInt(s); G)5R
iRcs
} sKDsps^$
Arrays.sort(ii); dA4DW
//asc &/wd_;d^A
for(int i=0;i<s.length;i++){ X^Dklqqy
System.out.println(ii); nSR7$yS_
} 9=RfGx
//desc Q1hHK'3w
for(int i=(s.length-1);i>=0;i--){ +8p4\l$<`
System.out.println(ii); P?WS=w*O0
} .t53+<A
} -(~OzRfYi
} % )'#
d
2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 y(81| c#
package test.format; b~oQhU??"
import java.text.NumberFormat; ZDn5d%
import java.util.HashMap; ^/c v8M=
public class SimpleMoneyFormat { aUZh_<@
public static final String EMPTY = ""; Sr Vo0$5)
public static final String ZERO = "零"; =*2_B~`
public static final String ONE = "壹"; *z852@
public static final String TWO = "贰"; g_8A1lt
public static final String THREE = "叁"; e 97Ll=>
public static final String FOUR = "肆"; ZhvZe/
public static final String FIVE = "伍"; bEvlk\iql
public static final String SIX = "陆"; ) oypl+y
public static final String SEVEN = "柒"; %)o'9
public static final String EIGHT = "捌"; IZ2(F,{o
public static final String NINE = "玖"; kz30! L
public static final String TEN = "拾"; d-%bRGo/
public static final String HUNDRED = "佰"; 4{zz-4=
public static final String THOUSAND = "仟"; 9szUN;:ZZ
public static final String TEN_THOUSAND = "万"; `|rF^~6(dR
public static final String HUNDRED_MILLION = "亿"; ,ICn]Pdz@
public static final String YUAN = "元"; 2?c##Izn
public static final String JIAO = "角"; ]:"<if gp$
public static final String FEN = "分"; 9Ub##5$[,
public static final String DOT = "."; |J:|56kVZq
-6KNMk
private static SimpleMoneyFormat formatter = null; r%=} e++^%
private HashMap chineseNumberMap = new HashMap(); T5<851rH
private HashMap chineseMoneyPattern = new HashMap(); 'GyO
private NumberFormat numberFormat = NumberFormat.getInstance(); PAYS~MnV@3
2oBT
_o%/J
private SimpleMoneyFormat() { F x4s)(
numberFormat.setMaximumFractionDigits(4); (i 2R1HCa
numberFormat.setMinimumFractionDigits(2); uE'O}Y95
numberFormat.setGroupingUsed(false); b@s6jNhVO^
./l^Iz&0
chineseNumberMap.put("0", ZERO); v^0*{7N'
chineseNumberMap.put("1", ONE); =%=lq0GF0
chineseNumberMap.put("2", TWO); &hnI0m=X
chineseNumberMap.put("3", THREE); or<n[<D-C
chineseNumberMap.put("4", FOUR); iY[+BI:
chineseNumberMap.put("5", FIVE); 3bU(ea^e$
chineseNumberMap.put("6", SIX); Bz+zEXBC
chineseNumberMap.put("7", SEVEN); R"2wop
chineseNumberMap.put("8", EIGHT); %$Smei
chineseNumberMap.put("9", NINE); 5|<j Pc
chineseNumberMap.put(DOT, DOT); ,h<xL-
kN~:Bh$
chineseMoneyPattern.put("1", TEN); d}:eLC
chineseMoneyPattern.put("2", HUNDRED); <6rc8jYz
chineseMoneyPattern.put("3", THOUSAND); [aS<u`/g|
chineseMoneyPattern.put("4", TEN_THOUSAND); R]LuZN
chineseMoneyPattern.put("5", TEN); fFe{oR
chineseMoneyPattern.put("6", HUNDRED); (,`R >Dk
chineseMoneyPattern.put("7", THOUSAND); Q4R*yRk
chineseMoneyPattern.put("8", HUNDRED_MILLION); VZ3{$0
+
} Y?'Krw `
tEam6xNf,
public static SimpleMoneyFormat getInstance() { ATG;*nIP
if (formatter == null) E3vYVuw
formatter = new SimpleMoneyFormat(); {9
.sW/
return formatter; 3xX^pjk
} :5W8S6[o
w\}@+w3b~
public String format(String moneyStr) { GZt L-
checkPrecision(moneyStr); OaH1xZNOC`
String result; ?:AD&Dn
result = convertToChineseNumber(moneyStr); qG)M8xk
result = addUnitsToChineseMoneyString(result); yQz6K6p
return result; ;Pw\p^wz
} $p;<1+!
:3N&&]
public String format(double moneyDouble) { \?_M_5Nb
return format(numberFormat.format(moneyDouble)); o)2KQ$b>Q
} umo<9Y
zg>)Lq|VsT
public String format(int moneyInt) { '>:c:Tewy
return format(numberFormat.format(moneyInt)); S.,5vI"s,
} DQI
b57j
;R[w}#Sm
public String format(long moneyLong) { Z<IN>:l
return format(numberFormat.format(moneyLong)); x@LNjlP
} "tF#]iQQ
u
/?Y]wY
public String format(Number moneyNum) { |MMaaW^"
return format(numberFormat.format(moneyNum)); ;@<Rh^g]
} YwizA}a#
H.)Y*zK0.
private String convertToChineseNumber(String moneyStr) { ;O~k{5.iS
String result; e2_p7
StringBuffer cMoneyStringBuffer = new StringBuffer(); DD fw&
y
for (int i = 0; i < moneyStr.length(); i++) { ;.U<Lr^9#
cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1))); ss0`9:z
} X#Sgf|$
//拾佰仟万亿等都是汉字里面才有的单位,加上它们 0&$,?CL?
int indexOfDot = cMoneyStringBuffer.indexOf(DOT); MU>6s`6O
int moneyPatternCursor = 1; E=#
O|[=
for (int i = indexOfDot - 1; i > 0; i--) { dRL*TT0NW
cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor)); i9+qU
moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1; +R2+?v6
} <N(r-
>[0t@Tu,D
String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf(".")); {oftZXwf
cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length()); f2iA5 rCV]
while (cMoneyStringBuffer.indexOf("零拾") != -1) { 7U1^=Y@t}
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO); -T=sY/O
} {2.zzev'
while (cMoneyStringBuffer.indexOf("零佰") != -1) { &V(;zy4(R
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO); #ZyY(S1.
} Zg&o][T
while (cMoneyStringBuffer.indexOf("零仟") != -1) { 6Z#$(oC
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO); G0Y]-*1
} f\vMdY
while (cMoneyStringBuffer.indexOf("零万") != -1) { b*)F7{/Z
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"), cMoneyStringBuffer.indexOf("零万") + 2, TEN_THOUSAND); i4}+n^oSYo
} 2|A?9aE%0
while (cMoneyStringBuffer.indexOf("零亿") != -1) { k?;@5r) y-
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"), cMoneyStringBuffer.indexOf("零亿") + 2, HUNDRED_MILLION); M(U<H;Csk
} 4DgH/Yo
while (cMoneyStringBuffer.indexOf("零零") != -1) { ]%2y`Jrl^W
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO); 6]|-%
} z'&tmje[?
if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1) U1;&G
cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.length()); e'|IRhr
cMoneyStringBuffer.append(fractionPart); zQ#2BOx1
6L<QKE=
result = cMoneyStringBuffer.toString(); %Y-5L;MI
return result; HChlkj'7w0
} (Xl+Zi>\{
H7
"r^s]D
e<$s~ UXv
private String addUnitsToChineseMoneyString(String moneyStr) { ^{Fo,7
String result; }2hU7YWt
StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr); B|K^:LUk9
int indexOfDot = cMoneyStringBuffer.indexOf(DOT); Mx Dqp;
cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN); ]@!3os,CNF
l:+$K s
<Rfx`mn
k&9[}a*
0at['zw
sSy!mtS
&!F"3bD0
WH_
W:
i ?%_Pu
找工作要面试,有面试就有对付面试的办法。以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司。 watTV\b
Vg~10Q
面试是没什么道理可讲的,它的题目有的不合情理、脱离实际。有在纸上写的,有当面考你的,也有在电话里问的,给你IDE的估计很少(否则你赶快去买彩票, 说不定中)。所以如果你看完此文后,请不要抱怨说这些问题都能用IDE来解决。你必须在任何情况下准确回答这些问题,在面试中如果出现一两题回答不准确很 有可能你就被拒之门外了。 H X{K5 +
当然这些都是Java的基本题,那些面试的人大多数不会问你Hibernate有多先进,Eclipse的三个组成部分,或command design pattern,他们都是老一辈了,最喜欢问的就是基础知识。别小看了这些基础,我朋友水平一流,结果就栽在一到基础知识的问题下,和高薪无缘。 N
u3B02D*
?vP6~$*B
好了废话少说,开始正题。 "*LQr~k~}
下面是答案 y!c<P,Lt3f
'#a;n
第一,谈谈final, finally, finalize的区别。 &$heW,
[jR>.H'
final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 wGw<z[:f
op($+Q
finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 O7oq1JI]Y
finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 uD\rmO{
3 MCV?"0
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? ${e5Ka
hmB`+?,z*
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 @<3kj
R?j
n_(f"Uv
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 >d(:XP6J
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1 $DdC|gMK
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象 7+;.Q
M8R/a[ -A
第四,&和&&的区别。 "R\D:Olb#
&是位运算符。&&是布尔逻辑运算符。 ,3
[FD9
t?H
sfN
第五,HashMap和Hashtable的区别。 mNlbiB
都属于Map接口的类,实现了将惟一键映射到特定的值上。 TBZhL
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 3hVuC1;"
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。 CfT(a!;Eox
zY2x_}#Q\"
第六,Collection 和 Collections的区别。 i|rC Ga0}
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 \D1@UyE
Collection是个java.util下的接口,它是各种集合结构的父接口。 LYr9a(
t&i