1.
簡述邏輯操作
(&,|,^)
與條件操作
(&&,||)
的區別。
(15
分
)
2.
下面程序運行會發生什么結果
?
如果有錯誤,如何改正
? (15
分
)
interfaceA{
int x = 0;
}
class B{
int x =1;
}
class C
extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
}
3.
簡述
Java Server Page
和
Servlet
的聯系和區別。
(20
分
)
4.XML
文檔定義有幾種形式?它們之間有何本質區別?
解析
XML
文檔有哪幾種方式?
(20
分
)
5.
簡述
synchronized
和
java.util.concurrent.locks.Lock
的異同?
(15
分
)
6.EJB
規范規定
EJB
中禁止的操作有哪些?
(15
分
)
7.
最后還有一題考考你的眼力
:
public String toString(){
return this + "@" + this.hashCode();
}
這個
toString()
方法實現有無不當的地方
?(toString
方法其實可以按你想輸出的任何內容輸出一些該類的信息
)
答案:
1.
簡述邏輯操作
(&,|,^)
與條件操作
(&&,||)
的區別。
(15
分
)
區別主要答兩點
:
a.
條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型
,
而且可以操作數值型
b.
邏輯操作不會產生短路
.
如
:
int a = 0;
int b = 0;
if( (a = 3) > 0 || (b = 3) > 0 ) //
操后
a =3,b=0.
if( (a = 3) > 0 | (b = 3) > 0 ) //
操后
a =3,b=3.
答對第一點得
5
分,答對第二點得
10
分
.
本題考察最最基本的知識
,
但仍然有很多大牛級開發人員下馬,任何語言在開始的部分
都會詳細介紹這些基本知識,但除了學習第一種語言時,沒有人在學習新的語言時愿意
花五分鐘來復習一下
.
2.
下面程序運行會發生什么結果
?
如果有錯誤,如何改正
? (15
分
)
interfaceA{
int x = 0;
}
class B{
int x =1;
}
class C
extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
}
本題在編譯時會發生錯誤
(
錯誤描述不同的
JVM
有不同的信息,意思就是未明確的
x
調用,
兩個
x
都匹配,就象在同時
import java.util
和
java.sql
兩個包時直接聲明
Date
一樣
)
本題主要考察對接口和類的最最基本的結構的了解
.
對于父類的變量,可以用
super.x
來
明確,而接口的屬性默認隱含為
public static final.
所以可以通過
A.x
來明確
.
3.
簡述
Java Server Page
和
Servlet
的聯系和區別。
(20
分
)
本題不用多說,在答相同點時應該明確知道
jsp
編譯后是
"
類
servlet"
而
"
不是
Servlet"
,
答區別時應該回答出
"
側重于
(
視圖
/
控制邏輯
)".
其它可根據情況加減分值
.
知識很簡單,
但從面試的角度看,被試者不僅要能知道它們的區別,而且要能比較準確地表達出來
(
以
后寫文檔要能讓別人看得懂,不產生歧義
)
,回答
"jsp
編譯后就是
servlet"
視為錯誤,回答
"jsp
用于視圖,
servlet
用于控制邏輯
"
視為錯誤,應該用側重于,主要
(
多數
)
用于等詞語
表達
.
4.XML
文檔定義有幾種形式?它們之間有何本質區別?
解析
XML
文檔有哪幾種方式?
(20
分
)
本題三個答題點
:
a:
兩種形式
dtd
,
schema
b:
本質區別
:schema
本身是
xml
的,可以被
XML
解析器解析
(
這也是從
DTD
上發展
schema
的
根本目的
)
c:
兩種主要方式
:dom
,
sax.
答出兩種得全分,如能答出
saxt
,或其它
(
在答出
dom
,
sax
的基
礎上,如果應試者認為其它方式也可以視為對
xml
的解析應該允許
.
但沒有答出
dom
,
sax
把
其它方式說成是對
XML
的解析不得分
)
應該加分
.
5.
簡述
synchronized
和
java.util.concurrent.locks.Lock
的異同?
(15
分
)
主要相同點
:
Lock
能完成
synchronized
所實現的所有功能
.(
其它不重要
)
主要不同點
:
Lock
有比
synchronized
更精確的線程語義和更好的性能
(
在相同點中回答此點也行
)
synchronized
會自動釋放鎖
.
而
Lock
一定要求程序員手工釋放
.
并且必須在
finally
從句
中釋放,如果沒有答出在
finally
中釋放不得分
.
就如
Connection
沒有在
finally
中關閉一
樣
.
連最基本的資源釋放都做不好,還談什么多線程編程
.
6.EJB
規范規定
EJB
中禁止的操作有哪些?
(15
分
)
共有
8
點,答出下列
3-4
點得滿分
.
·
不能操作線程和線程
API(
線程
API
指非線程對象的方法如
notify
,
wait
等
)
·
不能操作
awt
·
不能實現服務器功能
·
不能對靜態屬生存取
.
·
不能使用
IO
操作直接存取文件系統
·
不能加載本地庫
.
·
不能將
this
作為變量和返回
.
·
不能循環調用
.
7
public String toString(){
return this + "@" + this.hashCode();
}
會變成
public String toString(){
return String.valueOf(this) + "@" + String.valueOf(this.hashCode());
}
而
valueOf
方法又將去調用
toString();
/**
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
*/
這樣好像會有問題
原文地址:
Java
本身沒有這個能力,不過利用操作系統的命令可以做到。
public static String getMACAddress() {
String address = "";
String os = System.getProperty("os.name");
if ( os != null && os.startsWith("Windows")) {
try {
String command = "cmd.exe /c ipconfig /all";
Process p = Runtime.getRuntime().exec(command);
BufferedReader br =
new BufferedReader(
new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
if (line.indexOf("Physical Address") > 0) {
int index = line.indexOf(":");
index += 2;
address = line.substring(index);
break;
}
}
br.close();
return address.trim();
}
catch (IOException e) { }
}
return address;
}
原文地址:
equals
方法的重要性毋須多言,只要你想比較的兩個對象不愿是同一對象,你就應該實現
equals
方法,讓對象用你認為相等的條件來進行比較
.
下面的內容只是
API
的規范,沒有什么太高深的意義,但我之所以最先把它列在這兒,是因為
這些規范在事實中并不是真正能保證得到實現
.
1.
對于任何引用類型,
o.equals(o) == true
成立
.
2.
如果
o.equals(o1) == true
成立,那么
o1.equals(o)==true
也一定要成立
.
3.
如果
o.equals(o1) == true
成立且
o.equals(o2) == true
成立,那么
o1.equals(o2) == true
也成立
.
4.
如果第一次調用
o.equals(o1) == true
成立再
o
和
o1
沒有改變的情況下以后的任何次調用
都成立
.
5.o.equals(null) == true
任何時間都不成立
.
以上幾條規則并不是最完整的表述,詳細的請參見
API
文檔
.
對于
Object
類,它提供了一個最最嚴密的實現,那就是只有是同一對象是,
equals
方法才返回
true
,也就是人們常說的引用比較而不是值比較
.
這個實現嚴密得已經沒有什么實際的意義,所以在具體子類
(
相對于
Object
來說
)
中,如果我們要進行對象的值比較,就必須實現自己的
equals
方法
.
先來看一下以下這段程序
:
public boolean equals(Object obj)
{
if (obj == null) return false;
if (!(obj instanceof FieldPosition))
return false;
FieldPosition other = (FieldPosition) obj;
if (attribute == null) {
if (other.attribute != null) {
return false;
}
}
else if (!attribute.equals(other.attribute)) {
return false;
}
return (beginIndex == other.beginIndex
&& endIndex == other.endIndex
&& field == other.field);
}
這是
JDK
中
java.text.FieldPosition
的標準實現,似乎沒有什么可說的
.
我信相大多數或絕大多數程序員認為,這是正確的合法的
equals
實現
.
畢竟它是
JDK
的
API
實現啊
.
還是讓我們以事實來說話吧
:
package debug;
import java.text.*;
public class Test {
public static void main(String[] args) {
FieldPosition fp = new FieldPosition(10);
FieldPosition fp1 = new MyTest(10);
System.out.println(fp.equals(fp1));
System.out.println(fp1.equals(fp));
}
}
class MyTest extends FieldPosition{
int x = 10;
public MyTest(int x){
super(x);
this.x = x;
}
public boolean equals(Object o){
if(o==null) return false;
if(!(o instanceof MyTest )) return false;
return ((MyTest)o).x == this.x;
}
}
運行一下看看會打印出什么
:
System.out.println(fp.equals(fp1));
打印
true
System.out.println(fp1.equals(fp));
打印
flase
兩個對象,出現了不對稱的
equals
算法
.
問題出在哪里
(
腦筋急轉彎:當然出在
JDK
實現的
BUG)?
我相信有太多的程序員
(
除了那些根本不知道實現
equals
方法的程序員外
)
在實現
equals
方法
時都用過
instanceof
運行符來進行短路優化的,實事求是地說很長一段時間我也這么用過。
太多的教程,文檔都給了我們這樣的誤導。而有些稍有了解的程序員可能知道這樣的優化可能
有些不對但找不出問題的關鍵。另外一種極端是知道這個技術缺陷的骨灰級專家就提議不要這
樣應用。
我們知道,
"
通常
"
要對兩個對象進行比較,那么它們
"
應該
"
是同一類型。所以首先利用
instanceof
運行符進行短路優化,如果被比較的對象不和當前對象是同一類型則不用比較返回
false
,但事實
上,
"
子類是父類的一個實例
"
,所以如果子類
o instanceof
父類,始終返回
true
,這時肯定
不會發生短路優化,下面的比較有可能出現多種情況,一種是不能造型父類而拋出異常,另一種
是父類的
private
成員沒有被子類繼承而不能進行比較,還有就是形成上面這種不對稱比較。可能
會出現太多的情況。
那么,是不是就不能用
instanceof
運行符來進行優化?答案是否定的,
JDK
中仍然有很多實現是正
確的,如果一個
class
是
final
的,明知它不可能有子類,為什么不用
instanceof
來優化呢?
為了維護
SUN
的開發小組的聲譽,我不說明哪個類中,但有一個小組成員在用這個方法優化時在后加
mar
發表評論
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論