. ~; S$ D, v2 ?* d$ ~7 o3 g 第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱 : _6 S. ~( U+ G$ ]% R. h: `8 m
( O) `0 E7 V: k& d9 H+ l8 D- S1 j
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。 . |8 Y1 j1 V8 J, z; ` # n2 a: j0 Z# e1 K wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 & `( X7 i z+ ]& w. o% f# m, q3 p6 `
第十三,Java有没有goto? ; r& c7 z$ v0 j& o* k# w5 a " y2 R- Q+ D* V; _/ F, U M Goto?java中的保留字,现在没有在java中使用。 ! D0 ~% |! `1 a8 s* q7 [
" b h$ n8 t g! y 第十四,数组有没有length()这个方法? String有没有length()这个方法? 2 f* N- [) c0 n1 v3 w 7 z s8 e( ^' R2 z: R6 g5 i 数组没有length()这个方法,有length的属性。 " U/ E! E4 X; Y( S, C
String有有length()这个方法。 5 r7 g/ j; C3 t/ j* |" S- G& ]7 Y( X : o5 n x) N3 x: ^ C7 k# u1 F+ e 第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 4 f6 Q6 C! s% G2 X. t
3 R; C, g1 B5 P. w
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 . [& R( ^! n$ K. l6 W8 Q8 ~
! v7 w; h, r( B* ?' }( B5 A4 t
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 9 Y9 O" w- _' t2 \3 T
) I9 k8 |8 n3 k/ Z$ Y Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 ( n2 h) F9 w" y# n, S 5 `! Z4 T2 V. A: V( P2 ^ equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 * X. O7 P- F0 g5 ]+ J2 f" n. `8 r- [! N3 F- c, x! P
第十七,给我一个你最常见到的runtime exception。 # j$ @. d6 z w' S X) y7 ~# n% c
# y. ? x; b+ w6 H2 b0 \3 H
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, % C; l* m7 L+ U \. K& y" @+ jCannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, % ^- J3 ~# |9 NDOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, 1 B `# G- ]" R4 R8 ?/ DIllegalPathStateException, IllegalStateException, 8 O" ^' g: c0 }. b% j0 C
ImagingOpException, " U; Y! ]. M% U' I" sIndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, 6 @" _* T1 d# W/ g! z
NullPointerException, ProfileDataException, ProviderException, 5 L8 y: |& k" t% K3 r7 _, a8 l3 y0 j RasterFormatException, SecurityException, SystemException, ; ^; w* l( r( I0 e( N+ h* A UndeclaredThrowableException, 4 Z' L# U) c! M, T' n
UnmodifiableSetException, UnsupportedOperationException # n4 ?5 G8 y' I) b: D4 ? Y0 G% \" x; _8 P
第十八,error和exception有什么区别? ; u" f* R: s* u6 B
3 r# R% ~& Q" j& s, P# u' n ?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 5 m4 i, g3 U. y! }& w , i8 |. Y' B" t exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 # _$ i4 I) x: x9 H$ V ! x9 M* ~3 p) m1 O- T: M8 O' ?. l- f) r
第十九,List, Set, Map是否继承自Collection接口? & H& n5 E# ^7 \- t' D; g `/ f1 Z , q6 F. l' q6 X+ _$ ? List,Set是 ! W2 w5 ]/ M/ l7 _* W7 L' z: _
9 H# W6 u: ]" }
Map不是 , Z J, d$ p5 `" r+ r* K ( z( D% \; p7 }* p1 c" K: V 第二十,abstract class和interface有什么区别? & [4 X5 P0 n9 K2 ~; U4 J6 N/ G6 j2 X4 d# a, r5 o6 K( l
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 # Z" R! F, j4 I- i4 S% \: u6 ~" `4 ]6 C) f: r
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 % ~$ c2 c7 ~* H$ p; U
~5 X. e y& `/ g$ L1 ? 第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? ; _3 b8 \ n: {/ e- F $ ~7 }- l3 z! a6 ^; O 都不能 ) T6 y, `/ r8 W( z
5 ~: L3 B6 H0 V' \3 \, \! N9 l
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? ! j& _( w. b Y+ [$ F. r" e8 \ ( e* R, _2 d' C& ^+ U. J5 ] 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 3 L" @8 o0 o+ i' B/ s3 t 6 f4 f& m& g% Z- ` 第二十三,启动一个线程是用run()还是start()? - x. L* R; {6 C0 c! ^! |# |% v3 R; l9 O
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 # w+ d" z H: F& q5 ?1 x+ X( y: Q/ [8 S8 T* I( e6 d
' {3 o4 S( [: q d! F, F " V/ D' x& {+ d6 L0 z* O; f 第二十四,构造器Constructor是否可被override? ! S( o" E) [* ]. x. N( { ( B! h% V+ D6 l; }+ h) k! W# L 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 7 j, O) B1 p) D+ f/ T e% b3 S 6 s& s. f( Z8 s+ ~3 D2 j7 Y 第二十五,是否可以继承String类? # R$ q H8 U* s- ~; f . C4 f0 B, a3 q v, E$ r+ _6 c String类是final类故不可以继承。 & f% o' k4 Z" }+ L 9 @4 j2 c' M# ]" M& f! c 第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? . E1 P1 e4 `9 c: H 7 w) I3 E: {8 m& o G; @; H$ s 不能,一个对象的一个synchronized方法只能由一个线程访问。 4 E6 z8 R; G f: [" w A5 s; @' S3 @" b
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? / z( ^9 k A. G: j; ^, R2 t4 j2 g% t & U J. E- g' s0 i6 {; _) r; g; v4 G 会执行,在return前执行。 6 |! |6 v$ x) t m1 V, U2 J/ L. [6 K! |% n; j" V0 Q7 k# }7 V
第二十八,编程题: 用最有效率的方法算出2乘以8等於几? # n+ j. {( o' f* D% R* Q# N3 o
7 `/ v k3 C) X4 ^
有C背景的程序员特别喜欢问这种问题。 ) b# L5 g) w1 @$ _' M7 |
% r+ f7 u# {- E/ b/ J
2 << 3 : t* y/ u8 H' N, e+ [8 X( y9 t
7 \! ^+ g# z4 D! O) c
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? - f# I& E. h% ? x + S: j9 b7 J. }- O. n7 V 不对,有相同的hash code。 / }7 I. i/ D1 N5 j) o2 t
/ u/ A7 e' ~! A, H. j/ K 第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 1 ^3 X' H4 m! \ R3 T
1 k' ^" ~' h7 a- F1 `" }( D 是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 5 {- l9 }$ f4 N* x) Y5 `- c& I% c. ~
4 s2 }/ C/ y* |' b 第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 6 Z- |' h: f# J7 A1 J2 v; L % |1 L( P7 a& R7 ?7 h; \ switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 0 I* L8 p( X, F0 ]. V
4 {8 ~6 V2 h- K& N" S: p
第三十二,编程题: 写一个Singleton出来。 % y- h5 k {2 ~0 D# C
0 D. C4 G" O* S7 {8 X Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 0 [, f( a) y! f4 k! @: z( G ' F3 Y1 \+ ~" N! N& h% K 一般Singleton模式通常有几种种形式: e5 G- o. E7 E5 I2 U. Q4 r
1 I& k& d5 R9 I) R7 C 第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 + z9 G9 s B, W5 N5 Y: R % u, u* J. W1 s" _public class Singleton { . Y: m5 C# @' k4 W3 Y7 r$ C& ] private Singleton(){} ! d1 y5 f3 B# l5 E1 h1 |
//在自己内部定义自己一个实例,是不是很奇怪? 5 e$ {& d& Y! ^# N //注意这是private 只供内部调用 # S' K! }& o" K7 @7 E) ^ private static Singleton instance = new Singleton(); # ~% k* {- U6 Y' M3 | //这里提供了一个供外部访问本class的静态方法,可以直接访问 * t3 s6 i2 `' h( [; r" h$ i% i6 c H( | public static Singleton getInstance() { ( B# U; |9 J" F8 o
return instance; _! I/ d# a2 A2 @1 n } 0 ^! S2 }6 g8 x( t$ i2 K} $ u' Z) w! \$ c, }4 L* [- o1 t; [7 @% `. Q1 q) X: h' P
第二种形式: ; C9 H, G- y0 _ & j0 R5 o" L0 W4 ~$ A8 C+ B8 v Ipublic class Singleton { $ ~8 t* E* q( e+ ^1 y2 p private static Singleton instance = null; 7 M k0 p& [, c6 x
public static synchronized Singleton getInstance() { ! a5 w, M$ i0 O
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 5 _3 Q/ F# @8 c2 i
//使用时生成实例,提高了效率! 9 s' U/ e1 @8 I/ ^3 J N/ L
if (instance==null) ( G* k: B v+ P
instance=new Singleton(); - g; x; p- i* i
return instance; } 6 k0 ]5 s- J6 r) A+ Y- v+ o} ; S" c9 e) y3 V% E& H& O( [$ f* o+ \
" C& A4 B z& Z" o" [; Q' y# U
其他形式: 3 S% H9 G0 p9 |5 E) [
4 G Q6 R" X8 L" g" O, f8 D
定义一个类,它的构造函数为private的,所有方法为static的。 + p- A0 U% m( S$ p) c" K
! S+ z' B( h9 u% _ 一般认为第一种形式要更加安全些 3 M( n0 c' z* f/ I3 V
# w0 M6 P0 A y9 t' e: Y* _
第三十三 Hashtable和HashMap : N! P+ |, k# O 5 B- `: m- c0 T! H Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现 $ l$ \2 |2 w/ O. n5 T+ V! w