1、一個".java"源文件中是否能夠包括多個類(不是內部類)?有什麼限制?java
答:能夠,但只能有一個public,而且public類名與文件名一致面試
2、Java有沒有goto? 算法
答:保留爲關鍵字編程
3、說說&和&&的區別。bootstrap
答:&&有短路功能,&能夠作位運算符數組
4、在JAVA中如何跳出當前的多重嵌套循環?併發
答:1、使用帶有標號的break 語句,便可跳出外層循環。app
2、循環條件邏輯與布爾標誌符,知足條件後取反jvm
5、switch語句可否做用在byte上,可否做用在long上,可否做用在String上? ide
答: 在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量,整數表達式能夠是int基本類型或Integer包裝類型,因爲,byte,short,char均可以隱含轉換爲int,因此,這些類型以及這些類型的包裝類型也是能夠的。
因爲在JDK7.0中引入了新特性,因此witch語句能夠接收一個String類型的值,String能夠做用在switch語句上
6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
答:1、s1+1爲int型,轉換爲short報錯,編譯器將報告須要強制轉換類型的錯誤。
2、隱含強制轉換,不報錯
7、char型變量中能不能存貯一箇中文漢字?爲何?
答: char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,因此,char型變量中固然能夠存儲漢字啦。不過,若是某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變量中就不能存儲這個特殊漢字。
補充說明:unicode編碼佔用兩個字節,因此,char類型的變量也是佔用兩個字節。
8、用最有效率的方法算出2乘以8等於幾?
答:2<<3。位運算cpu直接支持的,效率最高
9、請設計一個一百億的計算器
先不考慮long類型,因爲int的正數範圍爲2的31次方,表示的最大數值約等於2*1000*1000*1000,也就是20億的大小,因此,要實現一個一百億的計算器,咱們得本身設計一個類能夠用於表示很大的整數,而且提供了與另一個整數進行加減乘除的功能,大概功能以下:
()這個類內部有兩個成員變量,一個表示符號,另外一個用字節數組表示數值的二進制數
()有一個構造方法,把一個包含有多位數值的字符串轉換到內部的符號和字節數組中
()提供加減乘除的功能
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)
{
}
}
參看jdk中自帶的java.math.BigInteger類的源碼。
10、使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變?
答:a:基本類型 值不能發生改變
b:引用類型 地址值不能發生改變,可是對象的內容是能夠改變的
tips:有人在定義方法的參數時,可能想採用以下形式來阻止方法內部修改傳進來的參數對象:public void method(final StringBuffer param){ }
實際上,這是辦不到的,在該方法內部仍然能夠增長以下代碼來修改參數對象:param.append("a");
11、"=="和equals方法究竟有什麼區別?
答:若是一個類沒有本身定義equals方法,它默認的equals方法(從Object 類繼承的)就是使用==操做符,也是在比較兩個變量指向的對象是不是同一對象,這時候使用equals和使用==會獲得一樣的結果,若是比較的是兩個獨立的對象則總返回false。若是你編寫的類但願可以比較該類建立的兩個實例對象的內容是否相同,那麼你必須覆蓋equals方法,由你本身寫代碼來決定在什麼狀況便可認爲兩個對象的內容是相同的。
12、靜態變量和實例變量的區別?
對於下面的程序,不管建立多少個實例對象,永遠都只分配了一個staticVar變量,而且每建立一個實例對象,這個staticVar就會加1;可是,每建立一個實例對象,就會分配一個instanceVar,便可能分配多個instanceVar,而且每一個instanceVar的值都只自加了1次。
public class VariantTest
{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(「staticVar=」 + staticVar + 」,instanceVar=」 + instanceVar);
}
}
13、是否能夠從一個static方法內部發出對非static方法的調用?
答:不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部發出對非static方法的調用。
14、Integer與int的區別
答:Integer是java爲int提供的封裝類。int的默認值爲0,而Integer的默認值爲null,即Integer能夠區分出未賦值和值爲0的區別,int則沒法表達出未賦值的狀況。Integer提供了多個與整數相關的操做方法
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
答:四捨五入算法爲Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整
16、下面的代碼有什麼不妥之處?
都是些括號問題
17、請說出做用域public,private,protected,以及不寫時的區別
只要記住了有4種訪問權限(public,protected,friendly,private),4個訪問範圍(當前類,當前包,子類,不一樣包),水平和垂直方向上分別按排從小到大排列
18、Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型?
區別很大
重寫Override:表示子類中的方法能夠與父類中的某個方法的名稱和參數徹底相同,經過子類建立的實例對象調用這個方法時,將調用子類中的定義方法,這至關於把父類中定義的那個徹底相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,由於子類能夠解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。
(非重寫)若是父類的方法是private類型,那麼,子類則不存在覆蓋的限制,至關於子類中增長了一個全新的方法。
1九、 線程如何同步和通信。同窗回答說synchronized方法或代碼塊!面試官彷佛不太滿意!
只有多個synchronized代碼塊使用的是同一個監視器對象,這些synchronized代碼塊之間才具備線程互斥的效果,假如a代碼塊用obj1做爲監視器對象,假如b代碼塊用obj2做爲監視器對象,那麼,兩個併發的線程能夠同時分別進入這兩個代碼塊中。 …這裏還能夠分析一下同步的原理。
對於同步方法的分析,所用的同步監視器對象是this
接着對於靜態同步方法的分析,所用的同步監視器對象是該類的Class對象
接着對如何實現代碼塊與方法的同步進行分析。
20、ClassLoader如何加載class 。
jvm裏有多個類加載,每一個類加載能夠負責加載特定位置的類,例如,bootstrap類加載負責加載jre/lib/rt.jar中的類, 咱們平時用的jdk中的類都位於rt.jar中。extclassloader負責加載jar/lib/ext/*.jar中的類,appclassloader負責classpath指定的目錄或jar中的類。除了bootstrap以外,其餘的類加載器自己也都是java類,它們的父類是ClassLoader。