2019年,離開京東後的跳槽之旅(歷史回顧和感悟)

寫在最前面,我總結出了很多互聯網公司的面試題及答案,並整理成了文檔,以及各種學習的進階學習資料,加羣:810589193免費分享給大家,也歡迎各位一起在羣里探討技術。

2019年,打算離開京東,換個地方,然後開始了跳槽之旅。

先和boss們打了招呼,然後請假專心面試,2周內請假了6天左右時間,敲定了offer。

然後交接了2周,離開了我大京東

webp

image


前言

先介紹下我的情況。2015年某大學本科畢業,專業算是半個科班。大學時候該學的東西只學會了一半。去年11月,朋友說做技術的還是要來北京試試。自己思考了兩天時間,於是就下定了決心年後要來北京。

目前情況是找到好幾個都達到我目標的offer,總結下這次跳槽的經歷還是有很多成長和收穫。這次跳槽主要有好幾個階段,包括調研階段、準備階段、面試階段。貫穿這個三個階段的是不斷的學習和總結。

一、調研階段

對自己進行調研,思考自己想來北京去什麼樣的公司,最低接受什麼樣的公司。調研北京一線公司對3~5年經驗的要求。調研自己的學習內容和學習目標。

二、準備階段

首先要技術方面要準備的內容包括:Java基礎、數據結構和算法、技術輪子、中間件(redis、mysql)、計算機網絡、基礎運維、常用的解決方案。我主要學習的通過視頻進行學習,最重要的是堅持!準備階段還有一個最重要的點是,面前先找幾個進行面試,找找差距。

三、面試階段

我是年後提的離職,大約半個月時間辦完離職,安心來北京找工作。一遍面試一遍總結學習,在北京租了一個短租一個月的,不想租朋友家,因爲面試中的學習和總結太重要了,如果和朋友住在一起影響學習就不好了。

第一週,面試基本都掛了,然後週末狠狠的總結和學習,第二週面試通過的概率高達80%。然後在糾結中選了兩個,目前還在考慮最後去哪個~~~。

在這裏把我跳槽準備的面試題分享給大家,希望對正準備跳槽和打算跳槽的朋友們一些幫助。(由於文章篇幅原因30—55題的答案沒有在文中分享,需要答案和我學習的學習資料加羣:810589193免費分享給大家。)

1、面向對象的特徵有哪些方面?

  • 抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。

  • 繼承:繼承是從已有類得到繼承信息創建新類的過程。提供繼承的類叫父類(超類、基類)、得到繼承的類叫子類(派生類)。

  • 封裝:通常認爲封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現在使用的智能手機也是封裝得足夠好的,因爲幾個按鍵就搞定了所有的事情)。

  • 多態性:多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。實現多態需要做兩件事:1). 方法重寫(子類繼承父類並重寫父類中的方法);2). 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行爲)

2、訪問修飾符public,private,protected,以及不寫(默認)時的區別?

修飾符當前類同 包子 類其他包public√√√√protected√√√×default√√××private√×××

3、String 是最基本的數據類型嗎?

答:不是。Java中的基本數據類型只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type)和枚舉類型(enumeration type),剩下的都是引用類型(reference type)。

4、float f=3.4;是否正確?

答:不正確。3.4是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱爲窄化)會造成精度損失,因此需要強制類型轉換float f =(float)3.4; 或者寫成float f =3.4F;。

5、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?

答:對於short s1 = 1; s1 = s1 + 1;由於1是int類型,因此s1+1運算結果也是int 型,需要強制轉換類型才能賦值給short型。而short s1 = 1; s1 += 1;可以正確編譯,因爲s1+= 1;相當於s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。

6、int和Integer有什麼區別?

答:Java是一個近乎純潔的面向對象編程語言,但是爲了編程的方便還是引入了基本數據類型,但是爲了能夠將這些基本數據類型當成對象操作,Java爲每一個基本數據類型都引入了對應的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

class AutoUnboxingTest {

public static void main(String[] args) {

Integer a = new Integer(3);

Integer b = 3; // 將3自動裝箱成Integer類型

int c = 3;

System.out.println(a == b); // false 兩個引用沒有引用同一對象

System.out.println(a == c); // true a自動拆箱成int類型再和c比較

}

}

最近還遇到一個面試題,也是和自動裝箱和拆箱有點關係的,代碼如下所示:

public class Test03 {

public static void main(String[] args) {

Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;

System.out.println(f1 == f2);

System.out.println(f3 == f4);

}

}

如果不明就裏很容易認爲兩個輸出要麼都是true要麼都是false。首先需要注意的是f1、f2、f3、f4四個變量都是Integer對象引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什麼呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOf

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

簡單的說,如果整型字面量的值在-128到127之間,那麼不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1==f2的結果是true,而f3==f4的結果是false。

7、&和&&的區別?

雖然二者都要求運算符左右兩端的布爾值都是true整個表達式的值纔是true。&&之所以稱爲短路運算是因爲,如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是null而且不是空字符串,應當寫爲:username != null &&!username.equals(“”),二者的順序不能交換,更不能用&運算符,因爲第一個條件如果不成立,根本不能進行字符串的equals比較,否則會產生NullPointerException異常。注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。

8、解釋內存中的棧(stack)、堆(heap)和靜態區(static area)的用法。

棧空間操作起來最快但是棧很小,通常大量的對象都是放在堆空間

String str = new String("hello");

上面的語句中變量str放在棧上,用new創建出來的字符串對象放在堆上,而”hello”這個字面量放在靜態區。

9、Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?

答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四捨五入的原理是在參數上加0.5然後進行下取整。

10、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?

expr可以是byte、short、char、int、enum、String類型,但是long類型不能

11、用最有效率的方法計算2乘以8?

答: 2 << 3(左移3位相當於乘以2的3次方,右移3位相當於除以2的3次方)。

12、數組有沒有length()方法?String有沒有length()方法?

答:數組沒有length()方法,有length 的屬性。String 有length()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點容易和Java混淆。

13、構造器(constructor)是否可被重寫(override)?

答:構造器不能被繼承,因此不能被重寫,但可以被重載。

14、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

答:不對,如果兩個對象x和y滿足x.equals(y) == true,它們的哈希碼(hash code)應當相同。Java對於eqauls方法和hashCode方法是這樣規定的:(1)如果兩個對象相同(equals方法返回true),那麼它們的hashCode值一定要相同;(2)如果兩個對象的hashCode相同,它們並不一定相同

15、是否可以繼承String類?

答:String 類是final類,不可以被繼承。

16、當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞?

答:是值傳遞。Java語言的方法調用只支持參數的值傳遞。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性可以在被調用過程中被改變,但對對象引用的改變是不會影響到調用者的

17、String和StringBuilder、StringBuffer的區別?

答:Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們可以儲存和操作字符串。其中String是隻讀字符串,也就意味着String引用的字符串內容是不能被改變的。而StringBuffer/StringBuilder類表示的字符串對象可以直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單線程環境下使用的,因爲它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。

18、重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分?

答:方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時的多態性,而後者實現的是運行時的多態性。重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視爲重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對返回類型沒有特殊的要求。

19、描述一下JVM加載class文件的原理機制?

答:JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現的,Java中的類加載器是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件中的類。類的加載是指把類的.class文件中的數據讀入到內存中,通常是創建一個字節數組讀入.class文件

20、抽象類(abstract class)和接口(interface)有什麼異同?

答:抽象類和接口都不能夠實例化,但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明爲抽象類。接口比抽象類更加抽象,因爲抽象類中可以定義構造器,可以有抽象方法和具體方法,而接口中不能定義構造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private、默認、protected、public的,而接口中的成員全都是public的。抽象類中可以定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明爲抽象類,而抽象類未必要有抽象方法。

21、Java 中會存在內存泄漏嗎,請簡單描述。

答:理論上Java因爲有垃圾回收機制(GC)不會存在內存泄露問題(這也是Java被廣泛使用於服務器端編程的一個重要原因);然而在實際開發中,可能會存在無用但可達的對象,這些對象不能被GC回收,因此也會導致內存泄露的發生。例如hibernate的Session(一級緩存)中的對象屬於持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象,如果不及時關閉(close)或清空(flush)一級緩存就可能導致內存泄露

22、GC是什麼?爲什麼要有GC?

答:GC是垃圾收集的意思,垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存

23、String s = new String(“xyz”);創建了幾個字符串對象?

答:兩個對象,一個是靜態區的”xyz”,一個是用new創建在堆上的對象。

24、接口是否可繼承(extends)接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concrete class)?

答:接口可以繼承接口,而且支持多重繼承。抽象類可以實現(implements)接口,抽象類可繼承具體類也可以繼承抽象類。

25、Java 中的final關鍵字有哪些用法?

答:(1)修飾類:表示該類不能被繼承;(2)修飾方法:表示方法不能被重寫;(3)修飾變量:表示變量只能一次賦值以後值不能被修改(常量)。

26、指出下面程序的運行結果。

class A {

static {

System.out.print("1");

}

public A() {

System.out.print("2");

}

}

class B extends A{

static {

System.out.print("a");

}

public B() {

System.out.print("b");

}

}

public class Hello {

public static void main(String[] args) {

A ab = new B();

ab = new B();

}

}

答:執行結果:1a2b2b。創建對象時構造器的調用順序是:先初始化靜態成員,然後調用父類構造器,再初始化非靜態成員,最後調用自身構造器。

27、數據類型之間的轉換:

  • 如何將字符串轉換爲基本數據類型?

  • 如何將基本數據類型轉換爲字符串?

答:

  • 調用基本數據類型對應的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應基本類型;

  • 一種方法是將基本數據類型與空字符串(”")連接(+)即可獲得其所對應的字符串;另一種方法是調用String 類中的valueOf()方法返回相應字符串

28、如何實現字符串的反轉及替換?

答:方法很多,可以自己寫實現也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常見的面試題是用遞歸實現字符串反轉,代碼如下所示:

public static String reverse(String originStr) {

if(originStr == null || originStr.length() <= 1)

return originStr;

return reverse(originStr.substring(1)) + originStr.charAt(0);

}

29、怎樣將GB2312編碼的字符串轉換爲ISO-8859-1編碼的字符串?

答:代碼如下所示:

String s1 = "你好";

String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

30、利用java.text.DataFormat 的子類(如SimpleDateFormat類)中的format(Date)方法可將日期格式化

31、比較一下Java和JavaSciprt。

32、try{}裏有一個return語句,那麼緊跟在這個try後的finally{}裏的代碼會不會被執行,什麼時候被執行,在return前還是後?

33、列出一些你常見的運行時異常?

34、類ExampleA繼承Exception,類ExampleB繼承ExampleA。

請問執行此段代碼的輸出是什麼?

35、List、Set、Map是否繼承自Collection接口?

36、Collection和Collections的區別?

37、List、Map、Set三個接口存取元素時,各有什麼特點?

38、Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什麼區別?

39、線程的sleep()方法和yield()方法有什麼區別?

40、當一個線程進入一個對象的synchronized方法A之後,其它線程是否可進入此對象的synchronized方法B?

41、請說出與線程同步以及線程調度相關的方法。

42、編寫多線程程序有幾種實現方式?

43、synchronized關鍵字的用法?

44、舉例說明同步和異步。

45、簡述synchronized 和java.util.concurrent.locks.Lock的異同?

46、事務的ACID是指什麼?

47、獲得一個類的類對象有哪些方式?

48、簡述一下面向對象的”六原則一法則”。

49、簡述一下你瞭解的設計模式。

50、用Java寫一個冒泡排序。

51、用Java寫一個二分查找。

52、Servlet的運行過程?

53、轉發(forward)和重定向(redirect)的區別?

54、JSP有哪些內置對象?作用分別是什麼?

55、講解JSP中的四種作用域。

總結:

我的經驗就是,提前準備,堅持學習,善於思考總結。最重要的是堅持!

想要學習提升的可以加羣:810589193一起探討技術,學習,提升自己,免費獲取更多相關學習資料,覺得小編這個分享對大家有幫助可以轉發分享,希望這些知識點可以幫助在這個行業發展的朋友和夥伴們,把有限的時間,真正放在學習和前進上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章