基礎
陸陸續續收集到的一些Java基礎面試題,后續加更
1什么是逃逸分析
指JVM可以分析新創建物件的使用范圍,以此來決定是否在Java堆上分配記憶體的技術
逃逸分析使用的演算法引入了連通圖,來構建物件和物件參考之間的可達性關系,以此為基礎提出一種組合資料流分析法,
這種演算法是背景關系相關和流敏感的,分析精度相對較高,但是時間、記憶體開銷相對較大,
逃逸的幾種狀態
-
全域逃逸
即一個物件的作用范圍逃出了當前方法或當前范圍,有以下幾種:
- 物件是靜態變數
- 物件作為當前方法的回傳值
- 物件是一個已經逃逸的物件
-
引數逃逸
即一個物件被作為方法引數傳遞或被引數參考,但不會發生全域逃逸,這個狀態通過被呼叫方法的位元組碼確定
-
沒有逃逸
逃逸分析優化
-
鎖清除
執行緒同步鎖是很犧牲性能的,鎖清除就是如果編譯器知道當前物件只有當前執行緒使用,那么就會移除該物件的同步鎖,
比如StringBuffer和Vector都是用synchronized修飾執行緒安全的,但是大部分時候只在當前執行緒中使用,故編譯器可以優化它
-
標量替換
標量和聚合量:
基礎型別和物件參考可以說是標量,不能被進一步分解;能進一步分解的量就是聚合量,比如物件,
物件可以被進一步分解為標量,分散的成員變數,這就是標量替換
如果一個物件沒有逃逸,那么不用創建它,只需要創建它的成員標量并存在堆疊中或者暫存器,節省記憶體空間也提升性能,
-
堆疊上分配
當物件沒有逃逸時,該物件可以通過分解為成員標量分配在堆疊記憶體,和方法的生命周期一致,隨著堆疊幀出堆疊銷毀,從而減少GC的壓力,提高性能,
逃逸分析即是為了優化JVM記憶體和提升性能的,故開發當中要盡可能控制變數的作用域,作用域越小越好,
2 ==和equals()的區別
==:如果比較基本資料型別,比較數值是否相等
? 如果比較參考型別,比較物件的地址是否相等
equals():默認比較物件地址是否相等,不能用于比較基本資料型別
為什么用equals()比較String的內容是否相等
對于String、Date、Integer燈型別重寫了equals()方法,使其比較物件存盤的內容是否相等
3 &和&&的區別?
& 可以作位運算子,進行位與運算;還可以進行邏輯與運算,作邏輯與時為長路與,即是說就算左邊的運算式為假,右邊的運算式也會運算
&& 是邏輯與,是短路與,若左邊運算式為假,則右邊運算式不運算
4 怎么理解值傳遞和參考傳遞?
值傳遞:形參傳遞的是基本資料型別的字面量值的拷貝,方法對形參的修改不影響實參的值
參考傳遞:形參傳遞的是該引數參考的物件在堆中地址值的拷貝,對形參的修改直接作用在實參
5 static可以修飾區域變數么?
不能,可以是內部類、全域變數、方法、代碼塊
6 私有方法可以多載或者重寫嗎?
可以多載,不能重寫
7 String可變嗎?
不可變,String是final型別的,其值value是char[],而且是private final的,故不可修改
8 transient關鍵字的作用
被transient修飾的變數不能被序列化
transient只作用于實作了Serializable介面的類
transient只能用來修飾普通成員變數欄位
不管有無transient修飾,靜態變數都不能被序列化
9 Class.forName和ClassLoader的區別
Class.forName除了將類的.class檔案加載到JVM之外,還可以對類進行初始化
ClassLoader只會將.class檔案加載到JVM中,不會進行初始化
10 main方法可以多載或者重寫嗎?
可以多載,但是JVM始終呼叫原始的main方法,不會呼叫多載的main
不能重寫,因為main方法是static的,在Java中不能被覆寫
11 throw 和throws的區別
throw是真實拋出例外
throws是宣告可能拋出例外
12 int和Integer的區別
Integer是int的包裝類,int則是Java的基本資料型別
Integer必須實體化在能使用,int不需要
Integer是物件參考,new一個Integer時,實際上生成一個指標指向此物件,而int直接存盤資料值
Integer默認值是null,int默認是0
13 switch case陳述句
case里必須跟break,否則會一個一個case執行下去,直到最后一個break的case或default出現
case條件里只能是常量或者字面常量
default可有可無,最多有一個
switch支持型別:
基本資料型別:byte short int char
包裝型別:上面四個的
列舉型別: Enum
字串型別 String
14 不能用?拼接字串的時候:
通過多個運算式完成一個字串拼接時不行
一次性拼接一個字串時就可以用?
15 Java金額計算怎么避免精度丟失?
金額運算盡量使用BigDecimal(String val)進行計算
資料庫存盤金額,一般是整形和浮點型兩種,如果有匯率轉換,建議用decimal進行存盤,可以靈活控制精度,decimal直接對應Java 型別BigDecimal,
16 怎么理解Java的型別提升?
所謂型別提升,就是在含有多種資料型別的運算式中,型別會自動向范圍表示大的資料型別提升,比如:
long count=100000000;
int price=1999;
long totalPrice=price*count; //運算結果為long型,沒有溢位
17 String有沒有長度限制?
有,65534個位元組,超過的話編譯報錯
18 Java語法糖是什么意思?
也稱糖衣語法,指在計算機語言中添加的某種語法,對語言本身功能沒有影響,只是為了便于程式員開發,提高效率,就是對現有語法的封裝,
Java語法糖主要有:
泛型與型別擦除
自動裝箱與拆箱
變長引數
增強for回圈
內部類
列舉類
19 transient關鍵字的作用
- transient修飾的變數不能被序列化
- transient只作用于實作Serializable介面
- transient只能用來修飾普通成員變數欄位
- 不管有無transient修飾,靜態變數不能被序列化
20 如何實作物件克隆?
可以通過實作Cloneable介面,然后重寫其clone()方法
21 Java8 添加的新特性
- Lambda運算式
- 函式式介面
- 介面默認方法和靜態方法
- Optional類
- 重復注解
- BASE64編碼解碼已經加入jdk8
- JVM記憶體取消永久代
- …
22 String、StringBuffer、StringBuilder有什么區別?
String、StringBuffer、StringBuilder最大的不同是String不可變,后者可變,StringBuffer是執行緒安全的,StringBuilder執行緒不安全速度較快,
23 String與byte[]兩者相互之間如何轉換?
String > byte[] 通過String類的getBytes方法;byte[] > String通過new String(byte[])構造器,
24 普通類和抽象類有什么區別?
- 普通類不能包含抽象方法,抽象類可以
- 抽象類不能直接實體化,普通類可以直接實體化
25
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263029.html
標籤:其他
