顽石系列:Java技术面试
頑石系列:Java技術面試
JDBC相關
1.Statement與PreparedStatement的區 別,什什么是SQL注?入,如何防?止SQL注??
PreparedStatement支持動態設置參數、支持預編譯、防止SQL注入,而statement不支持。
SQL注入:通過拼接SQL語句達到無參數查詢數據庫數據的目的的方法。
?
字符串相關
1.String、StringBuffer、StringBuilder?
String是不可變的,StringBuffer和StringBuilder都是可變的。后兩者的字符內容可變,前者創建后內容不可變。
StringBuffer是線程安全的,但是會帶來額外的系統開銷。StringBuilder效率比較高。
2.==與.equals()的區別
使用==,當比較的是原生數據類型時,比較的是值。比較引用數據類型是,比較的是地址(也就是說是否同一個對象)。
equals()?法: 該?法定義在Object類中,因此java中的每個 類都具有該方法,對于Object類的equal()?方法來說,它是判斷 調?用equals()?方法的引?用與傳進來的引?用是否?一致,即這兩個 引?用是否指向同?一個對象。?
說明一點:
String重寫了equals方法,對于String類的equal()?方法來說,它是判斷當前字符串與傳進 來的字符串的內容是否?致。?
3.字符串常量池
字符串常量池的設計思想
-
字符串的分配,和其他的對象分配一樣,耗費高昂的時間與空間代價,作為最基礎的數據類型,大量頻繁的創建字符串,極大程度地影響程序的性能
-
JVM為了提高性能和減少內存開銷,在實例化字符串常量的時候進行了一些優化
-
為字符串開辟一個字符串常量池,類似于緩存區
-
創建字符串常量時,首先堅持字符串常量池是否存在該字符串
-
存在該字符串,返回引用實例,不存在,實例化該字符串并放入池中
- 實現基礎
- 字符串不可變,不用擔心數據沖突
- 常量池的字符串不會被垃圾回收器回收。
-
運行時數據區
堆:
存放的是對象,每個對象都包含一個與之對應的class
JVM只有一個堆區被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身。
對象由垃圾回收器復雜回收,因此大小和生命周期不需要確定。
棧:
每個線程包含一個棧區,棧中只保存基礎數據類型和對象引用,不是對象。
每個棧中的數據(原始類型和對象引用)都是私有的
棧中分三個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)
數據大小和生命周期時可以確定的,當沒有引用執行數據時,這個數據就會消失
方法區:
靜態區和堆一樣,被所有線程共享。
方法區存在的都是在整個程序中永遠唯一的,如class、static等。
字符串常量池存儲于方法區(說明:方法區是堆的一個邏輯組成部分):
?
面試題:棧內存與堆內存
當一個方法執行時,每個方法都會建立自己的內存棧,在這個方法內定義的變量將會逐個放入逐個棧內存中,隨著方法的執行結束,這個方法的內存棧也會隨之銷毀。因此,所有方法的局部變量都是放在棧內存中的;在程序中,創建一個對象時,這個對象被保存到運行時數據區中,以便反復利用(因為對象的創想成本較大),這個運行時數據區就是堆內存。堆內存的變量不會隨著方法的執行而銷毀。只有當一個對象沒有被任何引用變量引用時,系統的垃圾回收期才會在合適的時候自動銷毀它。
面試題:String str4 = new String(“abc”) 創建多少個對象?
1.首先在字符串常量池中查找是否有"abc"對象,有則返回對應的引用實例、沒有則創建對應的引用實例
2.在堆中new一個String(abc)對象
3.將對象地址賦值給str4,創建一個引用
常量池中沒有“abc”字面量則創建兩個對象,否則創建一個對象,以及創建一個引用。
說明:
通過new操作符創建的字符串對象不指向字符串池中的任何對象,但是可以通過使用字符串的intern()方法來指向其中的某一個。java.lang.String.intern()返回一個保留池字符串,就是一個在全局字符串池中有了一個入口。如果以前沒有在全局字符串池中,那么它就會被添加到里面。
字面量和常量池初探
String m = "hello,world";String n = "hello,world";String u = new String(m);String v = new String("hello,world");會分配一個11長度的char數組,并在常量池分配一個由這個char數組組成的字符串,然后由m去引用這個字符串
用n去引用常量池里邊的字符串,所以和n引用的是同一個對象
生成一個新的字符串,但內部的字符數組引用著m內部的字符數組
同樣會生成一個新的字符串,但內部的字符數組引用常量池里邊的字符串內部的字符數組,意思是和u是同樣的字符數組
?
IO/NIO相關
NIO有三大核心部分
傳統IO有什么缺點,為什么NIO是非阻塞的?
傳統IO為每一個客戶端使用一個線程,如果客戶端出現延遲等異常,線程可能會被占用很長時間,因為數據的準備和讀取都在這個線程中,此時,如果客戶端數量眾多,將會消耗?量的系統資源。
??個線程對應?一個selector,但是?個 selector可以對應多個客戶端。 極少的線程可以監控?量的客戶端,即使發生阻 塞,數量也是很少的。?
?Scanner類
next() 與 nextLine() 區別
next:
一定要讀到有效字符后才可以結束輸入。
對輸入有效字符之前的空白,next可以自動去掉。
只有輸入有效字符后才將其后面輸入的空白作為分隔符或者結束符。
next不能得到帶有空格的字符串。
nextline:
以Enter為結束符,也就是說返回的是輸入回車之前的所有字符。
可以獲得空白。
Java基礎?
Java語言關鍵字
以下是Java編程語言中的關鍵字列表。您不能在程序中使用以下任何標識符作為標識符。
說明
const和goto是保留關鍵字,即使現在仍未被使用。
true,false和null可能看起來像關鍵字,但它們實際上是文字;您不能在程序中將它們用作標識符。
?
| abstract | continue | for | new | switch |
| assert*** | default | goto* | package | synchronized |
| boolean | do | if | private | this |
| break | double | implements | protected | throw |
| byte | else | import | public | throws |
| case | enum**** | instanceof | return | transient |
| catch | extends | int | short | try |
| char | final | interface | static | void |
| class | finally | long | strictfp** | volatile |
| const* | float | native | super | while |
訪問修飾符及范圍
?
內部類及注意事項
?
轉載于:https://www.cnblogs.com/MrSaver/p/9329422.html
總結
以上是生活随笔為你收集整理的顽石系列:Java技术面试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS 常用函数二(改变HTML样式)
- 下一篇: JS call()和apply()方法和