這48個Java技術點,讓你的面試成功率提升5倍!
JAVA基礎 (文末有彩蛋)
JAVA中的幾種基本型別,各佔用多少位元組?
下圖單位是bit,非位元組 1B=8bit
String能被繼承嗎?為什麼?
不可以,因為String類有final修飾符,而final修飾的類是不能被繼承的,實現細節不允許改變。平常我們定義的String str=”a”;其實和String str=new String(“a”)還是有差異的。
前者預設呼叫的是String.valueOf來返回String例項物件,至於呼叫哪個則取決於你的賦值,比如String num=1,呼叫的是
public static String valueOf(int i) {
return Integer.toString(i);
}
後者則是呼叫如下部分:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
最後我們的變數都儲存在一個char陣列中
private final char value[];
也為大家推薦了技術教程:
Java8零基礎入門 | https://edu.csdn.net/course/detail/3044?utm_source=blog11xk |
Drools7規則引擎入門教程 | https://edu.csdn.net/course/detail/5523?utm_source=blog11xk |
Spring Boot開發小而美的個人部落格 | https://edu.csdn.net/course/detail/6359?utm_source=blog11xk |
探究Linux的匯流排、裝置、驅動模型 | https://edu.csdn.net/course/detail/5329?utm_source=blog11xk |
軟體測試入門到精通 | https://edu.csdn.net/course/detail/8729?utm_source=blog11xk |
Spring Boot 入門 |
https://edu.csdn.net/course/detail/9068?utm_source=blog11xk |
Java多執行緒+網銀取款案例精講 | https://edu.csdn.net/course/detail/8973?utm_source=blog11xk |
String, Stringbuffer, StringBuilder 的區別。
String 字串常量(final修飾,不可被繼承),String是常量,當建立之後即不能更改。(可以通過StringBuffer和StringBuilder建立String物件(常用的兩個字串操作類)。)
StringBuffer 字串變數(執行緒安全),其也是final類別的,不允許被繼承,其中的絕大多數方法都進行了同步處理,包括常用的Append方法也做了同步處理(synchronized修飾)。其自jdk1.0起就已經出現。其toString方法會進行物件快取,以減少元素複製開銷。
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 字串變數(非執行緒安全)其自jdk1.5起開始出現。與StringBuffer一樣都繼承和實現了同樣的介面和類,方法除了沒使用synch修飾以外基本一致,不同之處在於最後toString的時候,會直接返回一個新物件。
public String toString() {
// Create a copy, don’t share the array
return new String(value, 0, count);
}
ArrayList 和 LinkedList 有什麼區別。
ArrayList和LinkedList都實現了List介面,有以下的不同點:
1、ArrayList是基於索引的資料介面,它的底層是陣列。它可以以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式儲存它的資料,每一個元素都和它的前一個和後一個元素連結在一起,在這種情況下,查詢某個元素的時間複雜度是O(n)。
2、相對於ArrayList,LinkedList的插入,新增,刪除操作速度更快,因為當元素被新增到集合任意位置的時候,不需要像陣列那樣重新計算大小或者是更新索引。
3、LinkedList比ArrayList更佔記憶體,因為LinkedList為每一個節點儲存了兩個引用,一個指向前一個元素,一個指向下一個元素。
講講類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,當 new 的時候, 他們的執行順序。
此題考察的是類載入器例項化時進行的操作步驟(載入–>連線->初始化)。
父類靜態代變數、
父類靜態程式碼塊、
子類靜態變數、
子類靜態程式碼塊、
父類非靜態變數(父類例項成員變數)、
父類建構函式、
子類非靜態變數(子類例項成員變數)、
子類建構函式。
測試demo:http://blog.csdn.net/u014042066/article/details/77574956
參閱我的部落格《深入理解類載入》:http://blog.csdn.net/u014042066/article/details/77394480
用過哪些 Map 類,都有什麼區別,HashMap 是執行緒安全的嗎,併發下使用的 Map 是什麼,他們內部原理分別是什麼,比如儲存方式, hashcode,擴容, 預設容量等。
hashMap是執行緒不安全的,HashMap是陣列+連結串列+紅黑樹(JDK1.8增加了紅黑樹部分)實現的,採用雜湊表來儲存的,
參照該連結:https://zhuanlan.zhihu.com/p/21673805
JAVA8 的 ConcurrentHashMap 為什麼放棄了分段鎖,有什麼問題嗎,如果你來設計,你如何設計。
參照:https://yq.aliyun.com/articles/36781
有沒有有順序的 Map 實現類, 如果有, 他們是怎麼保證有序的。
TreeMap和LinkedHashMap是有序的(TreeMap預設升序,LinkedHashMap則記錄了插入順序)。
參照:http://uule.iteye.com/blog/1522291
抽象類和介面的區別,類可以繼承多個類麼,介面可以繼承多個介面麼,類可以實現多個介面麼。
1、抽象類和介面都不能直接例項化,如果要例項化,抽象類變數必須指向實現所有抽象方法的子類物件,介面變數必須指向實現所有介面方法的類物件。
2、抽象類要被子類繼承,介面要被類實現。
3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
4、介面裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。
6、抽象方法只能申明,不能實現。abstract void abc();不能寫成abstract void abc(){}。
7、抽象類裡可以沒有抽象方法
8、如果一個類裡有抽象方法,那麼這個類只能是抽象類
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。
繼承和聚合的區別在哪。
繼承指的是一個類(稱為子類、子介面)繼承另外的一個類(稱為父類、父介面)的功能,並可以增加它自己的新功能的能力,繼承是類與類或者介面與介面之間最常見的關係;在Java中此類關係通過關鍵字extends明確標識,在設計時一般沒有爭議性;
聚合是關聯關係的一種特例,他體現的是整體與部分、擁有的關係,即has-a的關係,此時整體與部分之間是可分離的,他們可以具有各自的生命週期,部分可以屬於多個整體物件,也可以為多個整體物件共享;比如計算機與CPU、公司與員工的關係等;表現在程式碼層面,和關聯關係是一致的,只能從語義級別來區分;
參考:http://www.cnblogs.com/jiqing9006/p/5915023.html
講講你理解的 nio和 bio 的區別是啥,談談 reactor 模型。
IO是面向流的,NIO是面向緩衝區的
參考:https://zhuanlan.zhihu.com/p/23488863
http://developer.51cto.com/art/201103/252367.htm
http://www.jianshu.com/p/3f703d3d804c
反射的原理,反射建立類例項的三種方式是什麼
參照:http://www.jianshu.com/p/3ea4a6b57f87?amp
http://blog.csdn.net/yongjian1092/article/details/7364451
反射中,Class.forName 和 ClassLoader 區別。
https://my.oschina.net/gpzhang/blog/486743
描述動態代理的幾種實現方式,分別說出相應的優缺點。
Jdk cglib jdk底層是利用反射機制,需要基於介面方式,這是由於
Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
Cglib則是基於asm框架,實現了無反射機制進行代理,利用空間來換取了時間,代理效率高於jdk
http://lrd.ele.me/2017/01/09/dynamic_proxy/
動態代理與 cglib 實現的區別
同上(基於invocationHandler和methodInterceptor)
為什麼 CGlib 方式可以對介面實現代理。
同上
final 的用途
類、變數、方法
http://www.importnew.com/7553.html
寫出三種單例模式實現。
懶漢式單例,餓漢式單例,雙重檢查等
參考:https://my.oschina.net/dyyweb/blog/609021
如何在父類中為子類自動完成所有的 hashcode 和 equals 實現?這麼做有何優劣。
同時複寫hashcode和equals方法,優勢可以新增自定義邏輯,且不必呼叫超類的實現。
參照:http://java-min.iteye.com/blog/1416727
請結合 OO 設計理念,談談訪問修飾符 public、private、protected、default 在應用設計中的作用。
訪問修飾符,主要標示修飾塊的作用域,方便隔離防護
同一個類 同一個包 不同包的子類 不同包的非子類
- 1
- 2
Private √
Default √ √
Protected √ √ √
Public √ √ √ √
public: Java語言中訪問限制最寬的修飾符,一般稱之為“公共的”。被其修飾的類、屬性以及方法不
僅可以跨類訪問,而且允許跨包(package)訪問。
private: Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的類、屬性以
及方法只能被該類的物件訪問,其子類不能訪問,更不能允許跨包訪問。
protect: 介於public 和 private 之間的一種訪問修飾符,一般稱之為“保護形”。被其修飾的類、
屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
default:即不加任何訪問修飾符,通常稱為“預設訪問模式“。該模式下,只允許在同一個包中進行訪
問。
深拷貝和淺拷貝區別。
http://www.oschina.net/translate/java-copy-shallow-vs-deep-in-which-you-will-swim
陣列和連結串列資料結構描述,各自的時間複雜度
http://blog.csdn.net/snow_wu/article/details/53172721
error 和 exception 的區別,CheckedException,RuntimeException 的區別
http://blog.csdn.net/woshixuye/article/details/8230407
請列出 5 個執行時異常。
同上
在自己的程式碼中,如果建立一個 java.lang.String 物件,這個物件是否可以被類載入器載入?為什麼
類載入無須等到“首次使用該類”時載入,jvm允許預載入某些類。。。。
http://www.cnblogs.com/jasonstorm/p/5663864.html
說一說你對 java.lang.Object 物件中 hashCode 和 equals 方法的理解。在什麼場景下需要重新實現這兩個方法。
參考上邊試題
在 jdk1.5 中,引入了泛型,泛型的存在是用來解決什麼問題。
泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數,泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,以提高程式碼的重用率
http://baike.baidu.com/item/java%E6%B3%9B%E5%9E%8B
這樣的 a.hashcode() 有什麼用,與 a.equals(b)有什麼關係。
hashcode
hashcode()方法提供了物件的hashCode值,是一個native方法,返回的預設值與System.identityHashCode(obj)一致。
通常這個值是物件頭部的一部分二進位制位組成的數字,具有一定的標識物件的意義存在,但絕不定於地址。
作用是:用一個數字來標識物件。比如在HashMap、HashSet等類似的集合類中,如果用某個物件本身作為Key,即要基於這個物件實現Hash的寫入和查詢,那麼物件本身如何實現這個呢?就是基於hashcode這樣一個數字來完成的,只有數字才能完成計算和對比操作。
hashcode是否唯一
hashcode只能說是標識物件,在hash演算法中可以將物件相對離散開,這樣就可以在查詢資料的時候根據這個key快速縮小資料的範圍,但hashcode不一定是唯一的,所以hash演算法中定位到具體的連結串列後,需要迴圈連結串列,然後通過equals方法來對比Key是否是一樣的。
equals與hashcode的關係
equals相等兩個物件,則hashcode一定要相等。但是hashcode相等的兩個物件不一定equals相等。
https://segmentfault.com/a/1190000004520827
有沒有可能 2 個不相等的物件有相同的 hashcode。
有
Java 中的 HashSet 內部是如何工作的。
底層是基於hashmap實現的
http://wiki.jikexueyuan.com/project/java-collection/hashset.html
什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決。
http://www.importnew.com/17964.html
JVM 知識
什麼情況下會發生棧記憶體溢位。
如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常。 如果虛擬機器在動態擴充套件棧時無法申請到足夠的記憶體空間,則丟擲OutOfMemoryError異常。
參照:http://wiki.jikexueyuan.com/project/java-vm/storage.html
JVM 的記憶體結構,Eden 和 Survivor 比例。
eden 和 survior 是按8比1分配的
http://blog.csdn.net/lojze_ly/article/details/49456255
jvm 中一次完整的 GC 流程是怎樣的,物件如何晉升到老年代,說說你知道的幾種主要的jvm 引數。
物件誕生即新生代->eden,在進行minor gc過程中,如果依舊存活,移動到from,變成Survivor,進行標記代數,如此檢查一定次數後,晉升為老年代,
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html
http://ifeve.com/useful-jvm-flags/
https://wangkang007.gitbooks.io/jvm/content/jvmcan_shu_xiang_jie.html
你知道哪幾種垃圾收集器,各自的優缺點,重點講下 cms,包括原理,流程,優缺點
Serial、parNew、ParallelScavenge、SerialOld、ParallelOld、CMS、G1
https://wangkang007.gitbooks.io/jvm/content/chapter1.html
垃圾回收演算法的實現原理。
http://www.importnew.com/13493.html
當出現了記憶體溢位,你怎麼排錯。
首先分析是什麼型別的記憶體溢位,對應的調整引數或者優化程式碼。
https://wangkang007.gitbooks.io/jvm/content/4jvmdiao_you.html
JVM 記憶體模型的相關知識瞭解多少,比如重排序,記憶體屏障,happen-before,主記憶體,工作記憶體等。
記憶體屏障:為了保障執行順序和可見性的一條cpu指令
重排序:為了提高效能,編譯器和處理器會對執行進行重拍
happen-before:操作間執行的順序關係。有些操作先發生。
主記憶體:共享變數儲存的區域即是主記憶體
工作記憶體:每個執行緒copy的本地記憶體,儲存了該執行緒以讀/寫共享變數的副本
http://ifeve.com/java-memory-model-1/
http://www.jianshu.com/p/d3fda02d4cae
http://blog.csdn.net/kenzyq/article/details/50918457
簡單說說你瞭解的類載入器。
類載入器的分類(bootstrap,ext,app,curstom),類載入的流程(load-link-init)
http://blog.csdn.net/gjanyanlig/article/details/6818655/
講講 JAVA 的反射機制。
Java程式在執行狀態可以動態的獲取類的所有屬性和方法,並例項化該類,呼叫方法的功能
http://baike.baidu.com/link?url=C7p1PeLa3ploAgkfAOK-4XHE8HzQuOAB7K5GPcK_zpbAa_Aw-nO3997K1oir8N–1_wxXZfOThFrEcA0LjVP6wNOwidVTkLBzKlQVK6JvXYvVNhDWV9yF-NIOebtg1hwsnagsjUhOE2wxmiup20RRa#7
你們線上應用的 JVM 引數有哪些。
-server
Xms6000M
-Xmx6000M
-Xmn500M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-XX:SurvivorRatio=65536
-XX:MaxTenuringThreshold=0
-Xnoclassgc
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:-CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=90
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log
g1 和 cms 區別,吞吐量優先和響應優先的垃圾收集器選擇。
Cms是以獲取最短回收停頓時間為目標的收集器。基於標記-清除演算法實現。比較佔用cpu資源,切易造成碎片。
G1是面向服務端的垃圾收集器,是jdk9預設的收集器,基於標記-整理演算法實現。可利用多核、多cpu,保留分代,實現可預測停頓,可控。
http://blog.csdn.net/linhu007/article/details/48897597
請解釋如下 jvm 引數的含義:
-server -Xms512m -Xmx512m -Xss1024K
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20
XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
Server模式啟動
最小堆記憶體512m
最大512m
每個執行緒棧空間1m
永久代256
最大永久代256
最大轉為老年代檢查次數20
Cms回收開啟時機:記憶體佔用80%
命令JVM不基於執行時收集的資料來啟動CMS垃圾收集週期
開源框架知識
簡單講講 tomcat 結構,以及其類載入器流程。
Server- –多個service
Container級別的:–>engine–》host–>context
Listenter
Connector
Logging、Naming、Session、JMX等等
通過WebappClassLoader 載入class
http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
http://blog.csdn.net/dc_726/article/details/11873343
http://www.cnblogs.com/xing901022/p/4574961.html
http://www.jianshu.com/p/62ec977996df
tomcat 如何調優,涉及哪些引數。
硬體上選擇,作業系統選擇,版本選擇,jdk選擇,配置jvm引數,配置connector的執行緒數量,開啟gzip壓縮,trimSpaces,叢集等
http://blog.csdn.net/lifetragedy/article/details/7708724
講講 Spring 載入流程。
通過listener入口,核心是在AbstractApplicationContext的refresh方法,在此處進行裝載bean工廠,bean,建立bean例項,攔截器,後置處理器等。
https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/
講講 Spring 事務的傳播屬性。
七種傳播屬性。
事務傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括瞭如下幾個表示傳播行為的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立一個新的事務。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則建立一個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。
https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/
Spring 如何管理事務的。
程式設計式和宣告式
同上
Spring 怎麼配置事務(具體說出一些關鍵的 xml 元素)。
說說你對 Spring 的理解,非單例注入的原理?它的生命週期?迴圈注入的原理, aop 的實現原理,說說 aop 中的幾個術語,它們是怎麼相互工作的。
核心元件:bean,context,core,單例注入是通過單例beanFactory進行建立,生命週期是在建立的時候通過介面實現開啟,迴圈注入是通過後置處理器,aop其實就是通過反射進行動態代理,pointcut,advice等。
Aop相關:http://blog.csdn.net/csh624366188/article/details/7651702/
Springmvc 中 DispatcherServlet 初始化過程。
入口是web.xml中配置的ds,ds繼承了HttpServletBean,FrameworkServlet,通過其中的init方法進行初始化裝載bean和例項,initServletBean是實際完成上下文工作和bean初始化的方法。
http://www.mamicode.com/info-detail-512105.html
文末彩蛋:
1.CSDN學院助學會員:僅需百元- 1300門課+600次下載特權,一次購買,全年無憂!點選檢視。
2.CSDN學院知識週刊:每週更新學院優惠課程活動及精品上新內容,點選檢視!
3.技術教程推薦:
Java8零基礎入門 | https://edu.csdn.net/course/detail/3044?utm_source=blog11xk |
Drools7規則引擎入門教程 | https://edu.csdn.net/course/detail/5523?utm_source=blog11xk |
Spring Boot開發小而美的個人部落格 | https://edu.csdn.net/course/detail/6359?utm_source=blog11xk |
探究Linux的匯流排、裝置、驅動模型 | https://edu.csdn.net/course/detail/5329?utm_source=blog11xk |
軟體測試入門到精通 | https://edu.csdn.net/course/detail/8729?utm_source=blog11xk |
Spring Boot 入門 |
https://edu.csdn.net/course/detail/9068?utm_source=blog11xk |
Java多執行緒+網銀取款案例精講 | https://edu.csdn.net/course/detail/8973?utm_source=blog11xk |
相關文章
- 當你收到面試通知後,如下的準備可以大大提升面試成功率面試
- 這樣做,你的面試成功率將達到 90%面試
- 學會這些技術面試時這些“談薪技巧”,讓你的薪資穩步提高面試
- 程式設計師面試中這樣介紹專案經驗,會讓你的成功率翻倍!程式設計師面試
- 你離BAT之間,只差這一套Java面試題 | 掘金技術徵文BATJava面試題
- Java面試之技術框架Java面試框架
- 【Java】幾道讓你拿offer的面試題Java面試題
- 如果面試官問你 JVM,額外回答逃逸分析技術會讓你加分!面試JVM
- 這個男人讓你的爬蟲開發效率提升8倍爬蟲
- 200道iOS面試題面試題整理,底層、技術亮點公司需要的這裡都有iOS面試題
- 如何準備Java的高階技術面試,java基礎面試筆試題Java面試筆試
- 如何快速提升你的技術能力
- 95%的技術面試必考的JVM知識點都在這,另附加分思路!面試JVM
- 最新阿里Java面試題,這些面試題你會嗎?阿里Java面試題
- 4個Excel核心技術,讓你效率翻倍!Excel
- 面試官問:如果讓你寫一個配置中心,說說你的設計思路? 不要慌,看這個!面試
- 這些喜聞樂見的Java面試知識點,你都掌握了嗎?Java面試
- 最新阿里Java技術面試題,看這一文就夠了!阿里Java面試題
- 分享這兩週的面試經歷 | 掘金技術徵文面試
- 面試中的這些坑,你踩過幾個?面試
- 這48條人際關係準則,會真正提升你的社交情商
- 面試驅動技術 - Category 相關考點面試Go
- 聊聊技術面試 | 掘金技術徵文面試
- 面試時這些“談薪技巧”,讓你的薪資提高3成面試
- 技術面試中,當面試官「套路」你時,怎麼「反套路」回去?面試
- java技術點整理Java
- 你可能也罵過這兩個面試題!面試題
- 提升專案管理能力,你需要掌握這5個重點專案管理
- 面試還問這些?甩手就給個讓他僵住的答案!面試
- Java面試愈發艱難?github上這份面試手冊,輕鬆解決你95%的面試Java面試Github
- 25個關鍵技術點,帶你熟悉PythonPython
- 長沙java培訓哪家好?Java開發這些技術你的懂Java
- Java動態代理機制——那些讓你面試脫穎而出的技能Java面試
- 唯品會java技術崗面試經驗分享Java面試
- 深度分析:Java併發程式設計之執行緒池技術,看完面試這個再也不慌了!Java程式設計執行緒面試
- Android中的裝飾模式:一文讓你瞭解這個用於替代繼承的技術!Android模式繼承
- 面試官帶你學Android——面試中Handler 這些必備知識點你都知道嗎?面試Android
- 學會這幾點,你也能成為面試殺手!面試