1:自我介紹
本碩就讀院校,參加過的競賽、項目
2:C語言和Java語言的核心區別,有什麼特點?
C面向過程,Java面向對象
C需要自己管理內存,Java自動實現(挖了個坑)
C不能跨平臺,Java可以跨平臺
3:Java資源(內存)管理是怎麼管理的?
Java的內存管理就是對象的分配和釋放問題。(兩部分)
分配 :內存的分配是由程序完成的,程序員需要通過關鍵字new 爲每個對象申請內存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。
釋放 :對象的釋放是由垃圾回收機制決定和執行的,這樣做確實簡化了程序員的工作。但同時,它也加重了JVM的工作。因爲,GC爲了能夠正確釋放對象,GC必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都需要進行監控。
4:Java跨平臺的核心是什麼?
Java虛擬機
5:數據結構中的常見排序算法
冒泡、快排、直接插入排序、歸併排序、堆排序、選擇排序(時間複雜度、穩定性)
6:假如機器內存500M,比較大的文件超過500M,文件中放的整數,對整數找出N個最小的,怎麼做?
將文件分割,用歸併排序
用堆排序,大頂堆和小頂堆,能找到前N個
追問:內存有限的話怎麼辦?(沒答上來...)
7:Java裏的接口和抽象類的區別?
抽象類中可以有抽象方法,也可以有非抽象方法共存
接口,jdk1.8之前只能有抽象方法,jdk1.8之後可以存在一個默認default方法
抽象類只能單繼承,接口可以實現多個父接口
抽象類可以存在普通成員變量,接口只能存在static final的變量,必須初始化
8:final關鍵字定義一個變量或對象,不可變是什麼不可變?
問懵了,沒答上,答了個地址不可變
9:C中有指針,指向地址,java定義對象的這個存儲結構是不是這樣?
補充
Java內存劃分爲5個部分:
1、棧:存的都是方法中的局部變量,方法的運行一定要在棧當中。
局部變量:方法的參數,或者是方法內部的變量
作用域:一旦超出作用域,立刻從棧內存消失
2、堆:凡是new出來的東西,都在堆中
堆內存裏面的東西都有一個地址值:16進制
3、方法區:存儲.class相關信息,包含方法的信息
4、本地方法棧:與操作系統相關
5、寄存器:與CPU相關
答了JVM中的方法區、堆、棧
Java中的集合,哪些線程安全,哪些不安全?
說了Map、Collection(List、Set)
HashMap、Hashtable、HashSet等
HashMap不安全、Hashtable安全、ConcurrentHashMap安全、ArrayList不安全、Vector安全(棄用)
線程安全是底層什麼在起作用?
回答了加鎖可以實現,在就沒問了
回答了同步
追問:同步是指用鎖還是別的什麼?
HashMap和ConcurrentHashMap底層有哪些不一樣的?
HashMap:數組+鏈表(jdk1.7)+紅黑樹(jdk1.8)
ConcurrentHashMap:Segement+HashEntry(jdk1.7),數組+鏈表+紅黑樹(jdk1.8)
想追問紅黑樹、B+、B、平衡二叉樹之類的
抽了,說了個沒有太深入瞭解,以爲會問一些東西,結果直接過了
Java多線程裏創建線程池,提供哪些接口?
補充
說了個ThreadPoolExecutor........
newCachedThreadPool 創建一個可緩存的線程池,如果線程池長度超過處理需求,可靈活回收空閒線程,若無可回收,則新建線程
newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待
newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行
newSingleThreadExecutor 創建一個單線程化的線程池,它只會唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先級)執行
使用線程池的時候,最關心的是什麼,線程池會導致內存溢出,怎麼防止?
........
答:排隊策略,超過限制,被拒絕。
設置核心參數,設置線程數
代碼上做清除(答了些啥...)
創建一個無限隊列,會出現內存溢出麼,怎麼解決?
最大線程數100,在重複的加入任務,造成阻塞,一直加會導致內存溢出麼,有什麼方法防止一直加?
超過線程池大小直接屏蔽麼?
項目問題,哪個項目遇到技術挑戰的,怎麼解決的?
最後嘮了15多分鐘