1.一個“.java”源文件中是否可以包括多個類(不是內(nèi)部類)愤炸?有什么限制题造?
可以有多個類垛孔,但是只能有一個public類找颓,并且public的類名必須與文件名一致吧彪。
2.Java有沒有g(shù)oto氧急?
java中的保留字斯辰,現(xiàn)在沒有在Java中使用帆焕。
3.說說&和&&的區(qū)別救氯。
&和&&都可以用作邏輯與的運算符找田,表示邏輯與(and),當(dāng)運算符兩邊的表達(dá)式都為true時着憨,整個運算結(jié)果才為true墩衙,否則,只要一方為false甲抖,則結(jié)果為false漆改。
&&還具有短路的功能,即如果一個表達(dá)式為false准谚,則不再計算第二個表達(dá)式挫剑,例如,對于if(str柱衔!=null&&樊破!str.equals(“”))表達(dá)式,當(dāng)str為null時唆铐,后面的表達(dá)式不會執(zhí)行哲戚,所以不會出現(xiàn)NullPointException如果將&&改為&,則會拋出NullPointException異常艾岂。if(x==33&++y>0)y會增長惫恼,if(x==33&&++y>0)不會增長。
&還可以用作位運算符澳盐,當(dāng)&操作符兩邊的表達(dá)式不是boolean類型時,&表示按位與操作令宿,我們通常使用0x0f來與一個整數(shù)進(jìn)行&運算叼耙,來獲取該整數(shù)的的最低4個bit位,例如粒没,0x31&0x0f的結(jié)果為0x01筛婉。
4.在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)?
在Java中,要想跳出多重循環(huán)爽撒,可以在外面的循環(huán)語句前定義一個標(biāo)號入蛆,然后在里層循環(huán)體的代碼中使用帶有標(biāo)號的break語句,即可跳出外層循環(huán)硕勿。例如哨毁,
ok: for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
System.out.println(“i=” + i + “,j=” + j);
if(j == 5) break ok;
}
}
另外,我個人通常并不使用標(biāo)號這種方式源武,而是讓外層的循環(huán)條件表達(dá)式的結(jié)果可以受到里層循環(huán)體 代碼的控制扼褪,例如,要在二維數(shù)組中查找到某個數(shù)字粱栖。
int arr[][] = {{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length&&!found;i++){
for(int j=0;j<=arr[i].length;j++){
System.out.println("i="+i+"j="+j);
if(arr[i][j]==5){
found=true;
break;
}
}
}
5 话浇、switch 語句能否作用在 byte 上,能否作用在 long 上闹究,能 否作用在 String 上幔崖?
在 switch(expr1)中,expr1 只能是一個整數(shù)表達(dá)式或者枚舉常量(更大字體)渣淤,整數(shù)表達(dá)式可以是 int 基本類型或 Integer 包裝類型赏寇,由于,byte,short,char 都可以隱含轉(zhuǎn)換為 int砂代,所以蹋订,這些類型以及這些類型 的包裝類型也是可以的。顯然刻伊,long 和 String 類型都不符合 switch 的語法規(guī)定露戒,并且不能被隱式轉(zhuǎn)換成 int 類型,所以捶箱,它們不能作用于 swtich 語句中智什。另外由于 JDK1.7 中引入新特性,所以 swtich 語句可以接收 一個 String 類型的值丁屎,String 可以作用在 swtich 上荠锭。
6 、short s1 = 1; s1 = s1 + 1; 有什么錯? short s1 = 1; s1 += 1; 有什么錯?
對于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 運算時會自動提升表達(dá)式的類型晨川,所以結(jié)果是 int 型证九,再賦值 給 short 類型 s1 時,編譯器將報告需要強制轉(zhuǎn)換類型的錯誤共虑。
對于 short s1 = 1; s1 += 1;由于 += 是 java 語言規(guī)定的運算符愧怜,java 編譯器會對它進(jìn)行特殊處理,因此 可以正確編譯妈拌。
7 拥坛、char 型變量中能不能存貯一個中文漢字? 為什么?
char 型變量是用來存儲 Unicode 編碼的字符的,unicode 編碼字符集中包含了漢字猜惋,所以丸氛,char 型變量 中當(dāng)然可以存儲漢字啦。不過著摔,如果某個特殊的漢字沒有被包含在 unicode 編碼字符集中缓窜,那么,這個 char 型變量中就不能存儲這個特殊漢字梨撞。補充說明:unicode 編碼占用兩個字節(jié)雹洗,所以,char 類型的變量也是占 用兩個字節(jié)卧波。
備注:后面一部分回答雖然不是在正面回答題目时肿,但是,為了展現(xiàn)自己的學(xué)識和表現(xiàn)自己對問題理解 的透徹深入港粱,可以回答一些相關(guān)的知識螃成,做到知無不言,言無不盡查坪。
8 寸宏、用最有效率的方法算出 2 乘以 8 等於幾?
2 << 3,
因為將一個數(shù)左移 n 位偿曙,就相當(dāng)于乘以了 2 的 n 次方氮凝,那么,一個數(shù)乘以 8 只要將其左移 3 位即可望忆, 而位運算 cpu 直接支持的罩阵,效率最高,所以启摄,2 乘以 8 等於幾的最效率的方法是 2 << 3稿壁。
9 、請設(shè)計一個一百億的計算器
首先要明白這道題目的考查點是什么歉备,一是大家首先要對計算機原理的底層細(xì)節(jié)要清楚傅是、要知道加減 法的位運算原理和知道計算機中的算術(shù)運算會發(fā)生越界的情況,二是要具備一定的面向?qū)ο蟮脑O(shè)計思想蕾羊。 首先喧笔,計算機中用固定數(shù)量的幾個字節(jié)來存儲的數(shù)值,所以計算機中能夠表示的數(shù)值是有一定的范圍 的龟再,為了便于講解和理解溃斋,我們先以 byte 類型的整數(shù)為例,它用 1 個字節(jié)進(jìn)行存儲吸申,表示的最大數(shù)值范圍 為-128 到+127。-1 在內(nèi)存中對應(yīng)的二進(jìn)制數(shù)據(jù)為 11111111,如果兩個-1 相加截碴,不考慮 Java 運算時的類型提升梳侨,運算后會產(chǎn)生進(jìn)位,二進(jìn)制結(jié)果為 1,11111110日丹,由于進(jìn)位后超過了 byte 類型的存儲空間走哺,所以進(jìn)位部 分被舍棄,即最終的結(jié)果為 11111110哲虾,也就是-2丙躏,這正好利用溢位的方式實現(xiàn)了負(fù)數(shù)的運算。-128 在內(nèi)存 中對應(yīng)的二進(jìn)制數(shù)據(jù)為 10000000束凑,如果兩個-128 相加晒旅,不考慮 Java 運算時的類型提升,運算后會產(chǎn)生進(jìn)位汪诉, 二進(jìn)制結(jié)果為 1,00000000废恋,由于進(jìn)位后超過了 byte 類型的存儲空間,所以進(jìn)位部分被舍棄扒寄,即最終的結(jié)果 為 00000000鱼鼓,也就是 0,這樣的結(jié)果顯然不是我們期望的该编,這說明 計算機中的算術(shù)運算是會發(fā)生越 界情況 的迄本,兩個數(shù)值的運算結(jié)果不能超過計算機中的該類型的數(shù)值范圍。由于 Java 中涉及表達(dá)式運算時的類型自 動提升课竣,我們無法用 byte 類型來做演示這種問題和現(xiàn)象的實驗嘉赎,大家可以用下面一個使用整數(shù)做實驗的例 子程序體驗一下:
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);
先不考慮 long 類型,由于 int 的正數(shù)范圍為 2 的 31 次方稠氮,表示的最大數(shù)值約等于 210001000*1000曹阔, 也就是 20 億的大小,所以隔披,要實現(xiàn)一個一百億的計算器赃份,我們得自己設(shè)計一個類可以用于表示很大的整數(shù), 并且提供了與另外一個整數(shù)進(jìn)行加減乘除的功能奢米,大概功能如下:
()這個類內(nèi)部有兩個成員變量抓韩,一個表示符號,另一個用字節(jié)數(shù)組表示數(shù)值的二進(jìn)制數(shù)
()有一個構(gòu)造方法鬓长,把一個包含有多位數(shù)值的字符串轉(zhuǎn)換到內(nèi)部的符號和字節(jié)數(shù)組中
()提供加減乘除的功能
public class BigInteger{
int sign;
byte[] val;
public Biginteger(String val) {
sign = ;
val = ;
}
public BigInteger add(BigInteger other) {
}
public BigInteger subtract(BigInteger other) {
}
public BigInteger multiply(BigInteger other){
}
public BigInteger divide(BigInteger other){
}
}
備注:要想寫出這個類的完整代碼谒拴,是非常復(fù)雜的,如果有興趣的話涉波,可以參看 jdk 中自帶的 java.math.BigInteger 類的源碼英上。面試的人也知道誰都不可能在短時間內(nèi)寫出這個類的完整代碼的炭序,他要的 是你是否有這方面的概念和意識,他最重要的還是考查你的能力苍日,所以惭聂,你不要因為自己無法寫出完整的 最終結(jié)果就放棄答這道題,你要做的就是你比別人寫得多相恃,證明你比別人強辜纲,你有這方面的思想意識就可以了,畢竟別人可能連題目的意思都看不懂拦耐,什么都沒寫耕腾,你要敢于答這道題,即使只答了一部分杀糯,那也 與那些什么都不懂的人區(qū)別出來扫俺,拉開了距離,算是矮子中的高個火脉,機會當(dāng)然就屬于你了牵舵。另外,答案中 的框架代碼也很重要倦挂,體現(xiàn)了一些面向?qū)ο笤O(shè)計的功底畸颅,特別是其中的方法命名很專業(yè),用的英文單詞很 精準(zhǔn)方援,這也是能力没炒、經(jīng)驗、專業(yè)性犯戏、英語水平等多個方面的體現(xiàn)送火,會給人留下很好的印象,在編程能力和 其他方面條件差不多的情況下先匪,英語好除了可以使你獲得更多機會外种吸,薪水可以高出一千元。
10使用 final 關(guān)鍵字修飾 一個變量時呀非,是引用不能變坚俗,還 是引用的對象不能變?
使用 final 關(guān)鍵字修飾一個變量時,是指引用變量不能變岸裙,引用變量所指向的對象中的內(nèi)容還是可以改 變的猖败。例如,對于如下語句:
final StringBuffer a=new StringBuffer("immutable");
執(zhí)行如下語句將報告編譯期錯誤:
a=new StringBuffer("");
但是降允,執(zhí)行如下語句則可以通過編譯:
a.append(" broken!");
有人在定義方法的參數(shù)時恩闻,可能想采用如下形式來阻止方法內(nèi)部修改傳進(jìn)來的參數(shù)對象:
public void method(final StringBuffer param){
}
實際上,這是辦不到的剧董,在該方法內(nèi)部仍然可以增加如下代碼來修改參數(shù)對象:
param.append("a");