標籤:ram main get javase 運算 keyword targe ase 異常
一、&和&&的差別?
&和&&都能夠用作邏輯與的運算子。表示邏輯與(and),當運算子兩邊的運算式的結果都為true時。整個運算結果才為true,否則,僅僅要有一方為false,則結果為false。
&&還具有短路的功能,即假設第一個運算式為false,則不再計算第二個運算式,比如,對於if(str != null && !str.equals(“”))運算式,當str為null時,後面的運算式不會運行,所以不會出現NullPointerException假設將&&改為&,則會拋出NullPointerException異常。
If(x==33& ++y>0) y會增長,If(x==33 && ++y>0)不會增長
&
不具有短路性質,對於if(str != null && !str.equals(“”))運算式,當str為null時。後面的運算式
依舊會運行,所以
會出現NullPointerException,除此之外,&還能夠用作位元運算符。
二、switch語句是否能作用在byte上,是否能作用在long上,是否能作用在String上?
在switch(expr1)中。expr1能夠是 byte, char, short,int 以及它們的封裝類 Byte ,Character, Short, Integer,還有enum(枚舉)、String(JavaSE 7添加的)
參考官網http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
三、使用finalkeyword修飾一個變數時。是引用不能變,還是引用的對象不能變?
使用finalkeyword修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是能夠改變的。比如,對於例如以下語句:
final StringBuffer a=new StringBuffer("immutable");
運行例如以下語句將報告編譯期錯誤:
a=new StringBuffer("");
可是,運行例如以下語句則能夠通過編譯:
a.append(" broken!");
有人在定義方法的參數時,可能想採用例如以下形式來阻止方法內部改動傳進來的參數對象:
public void method(final StringBuffer param)
{
}
實際上,這是辦不到的,在該方法內部仍然能夠添加例如以下代碼來改動參數對象:
param.append("a");
四、當運行String str=new String("abc")。時,究竟建立了多少個String對象?
假設再網上搜答案,差點兒都是這樣回答的:
假設String pool沒有abc這個字串 的話就在字串池建立abc的對象,再是在堆裡建立一個abc的對象,把堆裡的abc對象地址返回給str 這個情況是建立2個對象,否則就僅僅有在堆裡建立一個abc的對象
但是。我今天看到一個解說視頻。他說不論什麼情況都僅僅建立一個String對象。不論什麼情況都不會在字串池建立abc的對象。論據:
String s1="hjk";String s2=s1.intern(); //intern()的作用是假設在常量池中存在s1的字串值“hjk”,則 //返回該字串對象。否則在常量池加入“hjk”,並把該字串對象返回。System.out.println(s2==s1); //trueString s3=new String("abc");String s4=s3.intern();System.out.println(s3==s4); //falseString s5=s3.intern();System.out.println(s5==s4); //true
另可參考:Java面試題視頻解說http://study.163.com/course/courseMain.htm?courseId=519065#/courseMain
一些Java面試題深入分析