凹数科技笔试
一、Java
1、成員變量作用域public/protected/defaultprivate/區別?
public:該成員變量或其方法對當前類、同一包、子類、其他包都可見,所有類和對象都可以直接訪問。
protected:該成員變量或其方法對當前類、同一包、子類都可見。
default:該成員變量或其方法對當前類、同一包可見,子類與該成員變量所在的父類位于同一包,子類可以訪問,否則不能。
private:該成員變量或其方法只對當前類可見。
2、Override(覆蓋)和Overload(重載)區別?
重載和覆蓋是Java多態性的不同表現方式。
覆蓋是子類函數覆蓋基類函數,覆蓋一個方法并對其重寫以達到不同的作用。
Note:
- 子類中的覆蓋方法必須父類中被覆蓋的方法有相同的函數名和參數。
- 子類中覆蓋方法的返回值必須和父類中被覆蓋方法的返回值相同。
- 子類中覆蓋方法所拋出的異常類必須和父類中被覆蓋方法相同。
- 父類中被覆蓋方法不能為private,負責子類只是定義了一個新方法而不是覆蓋。
重載是通過不同的參數列表來區分,如不同的參數個數,參數類型,參數順序。
Note:
- 不能通過方法的訪問權限、返回值類型,拋出異常類型來區分重載。
- 對于繼承來說,如果父類方法的訪問權限為private,就不能在子類中對其重載,只是新定義的一個方法。
覆蓋與重載的區別:
1)Override是子類與父類之間的關系,是垂直關系;Overload 是同一個類中方法之間的關系,是水平關系。
2)覆蓋關系中,是根據對象的類型決定調用哪個方法(父類或子類的);重載是根據參數列表的不同決定調用哪個方法。
3)覆蓋要求參數列表相同,重載不同。
4)覆蓋只能由一個方法或由一對方法產生關系;重載是多個方法之間的關系。
3、ArrayList與Vector區別?
均在java.util包中,均為可伸縮數組,可以動態改變長度。兩者都是基于存儲元素的Object[] array實現的,在內存中開辟連續的空間來存儲,支持用下標訪問。ArrayList和Vector都有一個初始化的容量大小,當超過時,Vector默認擴充為原來的2倍,ArrayList默認擴充為原來的1.5倍。
最大區別:同步( synchronization)的使用,ArrayList的方法都不是同步的,Vector的大部分方法是同步的(add/insert/remove等)。Vector是線程安全的,提供了線程安全機制,因此其性能上要略遜于ArrayList;ArrayList不是線程安全的。
4、HahMap與HashTable區別?(待補充)
5、類加載器class loader加載類的步驟?Java提供的類加載器有?
見(Tanks):http://blog.csdn.net/gjanyanlig/article/details/6818655
6、閱讀程序填空,輸出,有關Java程序初始化順序(static、構造函數)
二、數據結構
7、給出前序遍歷判斷不可能的中序順序。
8、鄰接表,給出鄰接表寫出深度優先廣度優先,偽代碼
見(Tanks):https://segmentfault.com/a/1190000002685939
三、操作系統
9、臨界區、互斥量、信號量、事件概念,Java中怎么實現?
見(Thanks):http://blog.csdn.net/vividonly/article/details/6415748 ?Java中怎么實現?(待解決)
10、進程調度算法有?區別?適用場合?
11、進程的狀態有?三個基本狀態:運行、就緒、阻塞 。見:http://blog.sina.com.cn/s/blog_7c03bb1f0100wcco.html
12、進程的數據結構?
13、實現復數Complex類,支持加減
public class ComplexDemo { // main方法 public static void main(String[] a) { Complex b = new Complex(2, 5); Complex c = new Complex(3, -4); System.out.println(b + "+" + c + "=" + b.add(c)); System.out.println(b + "-" + c + "=" + b.minus(c)); System.out.println(b + "*" + c + "=" + b.multiply(c)); System.out.println(b + "/" + c + "=" + b.divide(c)); } } // Complex類 class Complex { private double m;// 實部 private double n;// 虛部 public Complex(double m, double n) { this.m = m; this.n = n; } // add public Complex add(Complex c) { return new Complex(m + c.m, n + c.n); } // minus public Complex minus(Complex c) { return new Complex(m - c.m, n - c.n); } // multiply public Complex multiply(Complex c) { return new Complex(m * c.m - n * c.n, m * c.n + n * c.m); } // divide public Complex divide(Complex c) { double d = Math.sqrt(c.m * c.m) + Math.sqrt(c.n * c.n); return new Complex((m * c.m + n * c.n) / d, Math.round((m * c.n - n * c.m) / d)); } public String toString() { String rtr_str = ""; if (n > 0) rtr_str = "(" + m + "+" + n + "i" + ")"; if (n == 0) rtr_str = "(" + m + ")"; if (n < 0) rtr_str = "(" + m + n + "i" + ")"; return rtr_str; } }運行結果:
13、編程:線程A不斷向隊列Queue寫數據,線程B不斷向隊列Queue讀數據。
已上傳至GitHub:https://github.com/HiSunny/InterviewXianChengQue
總結