/ z$ @7 u' T- A2 G- b% e& K 第六,Collection 和 Collections的区别。 5 c; d: |( M- n. v4 G% ?
6 b5 x2 z Y L4 g* G
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 i6 t n: u$ V+ L v6 M; }
, w/ o0 m- k. T+ F; ` System.gc() 1 c' F2 l# o2 \3 V- z+ @+ @
Runtime.getRuntime().gc() 1 S8 }, P6 q! x0 N, E
$ m4 L, v- M# r5 s
第九,String s = new String("xyz");创建了几个String Object? ; G* L& ]& l! E, g n
& a8 e7 @3 C+ T$ C. Q: X/ Z: p5 d 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 # c! T+ [% r, j1 r: J! P4 Z7 o" ]% P+ q4 y+ G6 j. I
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少? , S1 d7 M7 U5 O! j' {# K. ^ ! G- D. \' @/ a% o( y Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11; & e1 Q( y, S. K/ O- s- ?! `1 C9 B/ Z7 E( O& h( W4 q, L$ d- a
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? ) f0 ^- L1 U9 f/ O( d6 L4 ^; |. w" v* r
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。 / f5 I: Z: B3 f" g( J
* G( [1 D/ c, R/ _' S, G
第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱 4 }7 a# v* V" Q5 c
, [' s: R9 j" X- c& N o. ]7 r
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。 & i: O3 K) {9 l# y1 |' B7 {5 b+ g5 H1 Y3 N, Q6 S$ w
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 + h( Q8 f8 D0 ]* I4 I
2 d; m6 C' B* c& T% A' Y8 C5 Z 第十三,Java有没有goto? / z# b4 G/ W# G3 v" ` % n1 m2 B+ _: @- i3 T9 Z Goto?java中的保留字,现在没有在java中使用。 ' _- b9 g9 I" f* W
9 {6 l& w2 d8 ]# ~6 V 第十四,数组有没有length()这个方法? String有没有length()这个方法? - f' O( E9 d9 [' w & w2 x. q! O8 H* S# H9 A 数组没有length()这个方法,有length的属性。 ) g9 G. o3 B0 b* N6 m7 b String有有length()这个方法。 $ W2 t/ t1 I" ?4 }, g4 Y ' { U9 T( K4 k 第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? + z* Q$ _. ?) F/ m- H- ?8 m# N6 H/ |; Y; N
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 ) t9 q5 a2 z+ s: q' y + W8 `" G* D" H7 s3 B 第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? / k" v: q% P* N
- u$ W6 n* @. R* Q% d
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 2 v) t+ ?$ r7 ^# b/ [
, @# S$ x2 U# S; ]9 l
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 / V& I3 T. e; _& q3 X ^ 4 h- m* e. K8 ^ }0 }4 i$ }; q: F# H( q 第十七,给我一个你最常见到的runtime exception。 6 W; C, h+ T4 b: I: a
( X2 [& _8 E+ ?/ J" Z
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, 4 b; d% P$ H0 m4 o
CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, # \1 m* d4 [& {. B9 h' s; `+ A
DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, ! \- B# i; U# U# H1 t7 S
IllegalPathStateException, IllegalStateException, * V% Y U7 v: w3 L% g8 k* m3 eImagingOpException, v" m$ s" B8 R
IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, 6 [, c+ m, ^! [) v8 PNullPointerException, ProfileDataException, ProviderException, 0 f" x2 ]1 V# r N2 `
RasterFormatException, SecurityException, SystemException, 8 E: D, O4 o5 \& Y I% I
UndeclaredThrowableException, " ?5 a# x! d9 {+ \6 f1 i: FUnmodifiableSetException, UnsupportedOperationException ( X/ R+ H2 o1 K& V7 B" v
' v4 B. q- T, J8 h) X) r
第十八,error和exception有什么区别? 6 ^8 S9 o! @5 ?( g1 K, n4 r' b6 P. l7 T% ] H5 j+ |8 ^
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 / Q4 S/ s1 I' O+ W* g+ f5 X# w
3 C3 | [$ N6 m5 p6 n# [6 [
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 ' U4 Q* G4 w i) l# ^ c- O0 L$ [# v4 y/ u4 x0 a
E' }& Z+ C q4 s& {. X4 e3 p
第十九,List, Set, Map是否继承自Collection接口? 6 x7 n3 x" e: i4 P* @$ G ( A) }0 U- c8 X1 u+ u! P List,Set是 1 [5 v3 E% G% {! V
7 c# H. L6 k4 m* ]; K# h Map不是 ; Y. b/ K! h/ v( z$ L0 b* ^1 ~
8 m1 M# K* m- `# ^( {: I" @) {
第二十,abstract class和interface有什么区别? ( V4 _, z8 Z/ v4 U p& X I 6 m3 h G! e; e* ]" h: D 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 * e/ B6 Y- j7 s3 a . t6 s" U) j' b9 [! X; t 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 ! ]& {2 j( o7 z" u- h. l& j* f1 i2 g* a1 @% I% \
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 8 [' S' P( c5 w& b' b0 |5 n% B7 P% Y! T8 y
都不能 6 Y; ]; _6 S$ U6 p( p1 P, P
- D1 E" ~( L; ]0 ?' v 第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? ! n4 D8 n3 B; W2 G" v
- H/ |# {2 h3 r0 w9 m 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 ! \) i* E* B0 w
4 `* g1 }7 M+ ?; t+ _
第二十三,启动一个线程是用run()还是start()? / S+ } j4 i4 ?* D; G- _, C2 v9 |- ^2 V" n5 ^ B! k. V
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 4 q: G# Q* M6 x3 m U- O8 q% g
5 I/ y- q/ H% a2 r: h; a % B) x G( o# E: h2 s5 H9 i+ @' ] $ U3 F4 ^+ u U6 y- g 第二十四,构造器Constructor是否可被override? 8 w1 B. ~6 C! _' S8 O
3 j+ ^4 C! h3 q* s* m) i
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 * _0 V: M8 V! X. @
& i: L: ~" D2 ~; L7 {5 o. r
第二十五,是否可以继承String类? 8 \1 I; B. w# l' ]+ l6 x' ] 8 |" K* R( y Q. ? String类是final类故不可以继承。 8 `# N9 i" M8 A( {" A$ {, s7 R1 A. A. O8 G( Y% ~2 w& V2 u, A# X1 ]
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? : u$ V- s( W8 \5 M* t& B3 V v2 q
1 Q( K2 l$ d- k6 z, J 不能,一个对象的一个synchronized方法只能由一个线程访问。 4 j% x k& s j0 S/ ]
( L, Y- x1 W6 X9 ~8 n$ i
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? _# n' L- u" s3 k7 C) C _6 u
* z" o0 c& k, T( z 会执行,在return前执行。 3 F3 e2 }( Z6 R2 j& w* }% L' s : T* C1 w* {" H 第二十八,编程题: 用最有效率的方法算出2乘以8等於几? 7 D. m3 X$ ?4 P1 i 7 @5 y0 r7 x, a0 U 有C背景的程序员特别喜欢问这种问题。 3 \8 X, s8 r2 w8 k9 U- s1 u# P# ]: e/ F3 L+ C3 Y
2 << 3 0 u1 T% ~. Q% x8 `7 y- W# e
; K- X& h c' f0 i
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? " i# c0 Y( T6 F( [ g e! K" t5 j5 |# e1 F 不对,有相同的hash code。 : D1 `! r1 ^1 F / h: J# `: a% d! A6 h 第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 9 ~# I, {" |" t8 u" K; O2 [- U4 @. \3 d : T) j6 v) Z- j( V- J% K 是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 " f$ C2 s2 F$ l$ P7 k3 [2 j 2 x p. P4 K0 w- p& n- D 7 W2 y% G. |! N* g G- |0 Y* r 第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? ; {$ Y8 F6 A9 F' G. c' w( q . a7 G$ w+ [5 P1 h2 O) N ?3 f, R+ E$ ? switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 4 J5 O. |8 d: x% O7 X* J 5 L r1 m, f) t( E3 d 第三十二,编程题: 写一个Singleton出来。 ! T# ^/ v: Y. u
* T& c5 i8 X$ O
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 + t% K# x' l+ r& V% g: w& i% l1 Z% O
一般Singleton模式通常有几种种形式: 7 {: o2 V0 Y- U8 z6 O; D H. U/ N' t9 ~, w
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 ; A* p/ n, k5 I0 P4 c' Q; o( f$ c, ]8 b* r8 a
public class Singleton { / g( F4 ^* B% \: f B. r9 B) T
private Singleton(){} , B& U- |% B% ^ P9 t5 i
//在自己内部定义自己一个实例,是不是很奇怪? : |1 `2 c3 U% U D //注意这是private 只供内部调用 - N5 H* q) O! f5 h7 w# x& a
private static Singleton instance = new Singleton(); 8 \5 ~. e! H4 Y) x5 g' J# F
//这里提供了一个供外部访问本class的静态方法,可以直接访问 # e8 a1 c. Z( i, a
public static Singleton getInstance() { ' U2 h) m( u) I4 N+ Q return instance; v# V. @! R1 [1 x( i6 ~" Y } $ i8 ` @+ S/ r8 R8 P0 Z} , `$ _: ^( i2 A+ i' e* O: N3 D" W . H( Y" X4 Y8 J 第二种形式: ^* y8 q9 u9 i * m9 f0 J7 {; d6 G3 L6 I% ]public class Singleton { ) y6 E c/ }5 J* n
private static Singleton instance = null; 3 o' L- m" X- i4 V9 r* F9 E$ F public static synchronized Singleton getInstance() { / { ^& L1 x0 q2 }: K9 U6 h
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 3 L) m* X& [, _! u4 e //使用时生成实例,提高了效率! % g( @. E. B/ N9 c0 q; W
if (instance==null) ! m1 i5 i: X3 Z5 e9 I* h instance=new Singleton(); t9 t3 g# v B. S
return instance; } ' s0 Z! z5 Q; R M5 A h# B) l4 w0 m} : P' U: F; K, Y. I7 x* L1 Z5 n5 K/ s7 e
其他形式: & S5 g6 [/ q# j/ r2 s- m- x9 i) `+ i! v# s7 w0 C) G
定义一个类,它的构造函数为private的,所有方法为static的。 ! ^( f+ S% j0 k0 t/ J 9 ^) F0 M X7 U6 s6 D7 _$ | 一般认为第一种形式要更加安全些 % ]$ h' l2 S! ~2 l # W' x+ P, M l5 L& D- q& f! p 第三十三 Hashtable和HashMap % I# \" d) @- Q; l 0 y. j. X' ?+ e# Y Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现 ' z: h3 b, J& N, K2 G# H3 ]7 A + |+ I$ a% z" x0 I0 V5 Y s' G HashMap允许将null作为一个entry的key或者value,而Hashtable不允许 N7 G/ P3 G) u5 K _8 f " ^$ k u. x- |) }. Y# @ 还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 * Q! G- Y6 m) t' Y
+ u; k' K! W9 d0 u 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。 - e) }5 M6 G ~& o1 O
) O s9 ?. F1 a3 u E7 U Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。