[TOC]
# ==和equals區別
`==`用來判斷內存地址是否相同;`equals()`用來判斷字符串的內容是否相同
# do...while循環
1、do…while 循環和 while 循環相似,不同的是,do…while 循環至少會執行一次。如果布爾表達式的值為 true,則語句塊一直執行,直到布爾表達式的值為 false。
2、break 主要用在循環語句或者 switch 語句中,用來跳出整個語句塊;break 跳出最里層的循環,并且繼續執行該循環下面的語句。
3、continue 適用于任何循環控制結構中,作用是讓程序立刻跳轉到下一次循環的迭代。
# i++和++i區別
1、i++會先使用i的值,也就是將i的值加載到數據棧,在給i加1,最后使用數據棧中的值。
2、++i會先將i的值加1,再將增加后的值加載到數據棧,再使用數據棧中的值。
3、使用值的時候都是從數據棧頂去取值。
4、`int i = 0;i = i++;`該代碼執行后i的值為0。
# int和Integer的區別
* int 是基本數據類型,Integer 是包裝類
* Java中,會對 -128 到 127 的 Integer 對象進行緩存,當創建新的 Integer 對象時,如果符合這個這個范圍,并且已有存在的相同值的對象,則返回這個對象,否則創建新的 Integer 對象
# 自動裝箱和自動拆箱
1、自動裝箱指 Java 自動將原始數據類型轉換為對應的對象類型,如 int 變量轉為 Integer 對象;將 Integer 對象自動轉換為 int 類型值,叫做自動拆箱
2、自動裝箱時編譯器調用 valueOf 將原始類型值轉換成對象
3、自動拆箱時,編譯器通過調用類似 intValue(), doubleValue() 這類的方法將對象轉換成原始類型值
4、自動裝箱、拆箱主要發生在賦值時、方法調用時
# String、StringBuffer 和StringBuilder 的區別
1、String 是不可變對象,每次對 String 對象進行更改時,都會生成一個新的對象,然后將指針指向新的對象
2、StringBuffer 線程安全,使用時,每次都是直接對 StringBuffer 對象本身進行操作,并不生成新的對象
3、StringBuilder 非線程安全,和 StringBuffer 類似,單線程中性能比 StringBuffer 高
4、StringBuilder 如何避免不可變字符串分配的問題
# Java類型轉換
1、Java中的類型轉換分為基本數據類型轉換和引用數據類型轉換
2、基本數據類型轉換分為自動轉換和強制轉換,自動轉換指從位數低的類型向位數高的類型轉換,強制類型轉換指從位數高的類型向位數低的類型轉換,會導致精度缺失
3、引用數據類型轉換時,子類可以轉換成父類,父類不一定可以轉換為子類,父類引用引用的是子類對象時可以強制轉換為子類,但是父類引用引用的是父類對象時,強制轉換會拋出異常
# 介紹序列化
1、序列化指把應用層的對象或數據結構轉換成一段連續的二進制串,反序列化指把二進制串轉換成應用層的對象或數據結構
2、序列化按可讀性可分為兩類:二進制序列化、文本序列化(如 XML、JSON)以及半文本序列化。
3、文本序列化可讀性、可編輯性好;二進制序列化不具有可讀性,但解析速度更有優勢
4、Java 中,有兩種方式可以實現二進制序列化,既可以實現 Serializable 接口,也可以實現 Parcelable 接口。
5、在 Android 中,我們不應該使用 Serializable 接口。因為 Serializable 接口使用了反射機制,這個過程相對緩慢,而且往往會產生出很多臨時對象,這樣可能會觸發垃圾回收器頻繁地進行垃圾回收。相比而言,Parcelable 接口比 Serializable 接口效率更高,性能方面要高出 10x 多倍。
# Java垃圾回收機制分析
1、JVM棧記錄了當前線程的方法調用,棧幀存儲有方法參數、局部變量、返回地址。但引用的對象存儲在堆中,所以方法調用結束后,對象會依舊存在于堆中,易造成內存泄漏。
2、Java的垃圾回收機制可以自動回收不再使用的對象占用的內存空間。
3、垃圾回收算法
有:引用計數算法、可達性分析算法、標記清除算法、復制算法、標記整理算法、分代回收算法。
a、引用計數算法中,每個對象包含一個計數器,有新的引用指向該對象時計數器加1,引用移除時計數器減1,計數器為0時回收對象,引用計數法有個缺陷是無法檢測出循環引用。
b、可達性分析算法中,每個對象都有一個用于標示該對象是否可到達的標記信息。從根出發跟隨所有的引用,就可以找到所有的可到達對象,不可到達對象就是需要垃圾回收的對象。
c、標記清除算法流程為,垃圾回收啟動時,Java程序暫停運行,JVM從根出發找到所有的可達對象并標記,然后掃描整個堆找到不可達對象并清空。缺點是標記、清除的效率不高;會產生內存碎片。
d、復制算法為,將內存分為大小相等的兩塊,每次使用一塊,使用完時將存活的對象復制到另一塊,清空原來那塊。在對象存活率較低時回收效率高,缺點是內存空間使用率只有一半。
e、標記整理算法下,找到所有的可達對象并標記后,將所有存活對象都向內存區域的一端移動,然后清理掉邊界以外的內存區域。
d-1、分代回收算法下,堆分為三代:永久代、老年代、新生代,新生代又分為三個區域:eden區、from區和to區。
d-3、永久世代主要存放靜態文件如Java靜態類、方法等,對于垃圾回收沒有顯著影響。
d-4、分代回收流程為,上次垃圾回收后創建的對象叫新生對象,存放于eden區,eden區沒有空間存放新生對象時,觸發一次MinorGC,采用復制算法將eden區和from區的可達對象復制到to區,清空eden區和from區空間,此時from區和to區已交換;當to區也放不下eden和from區的可達對象時,將部分對象放到成熟世代;當成熟世代也已滿時觸發MajorGC,采用標記整理算法進行垃圾回收。
d-5、其中,即使to區沒有滿,JVM也會移動生命周期足夠久遠的對象到成熟世代;MinorGC發送頻率較高,MajorGC發生頻率較低。
# Java內存結構
1、堆是用來存儲對象本身和數組的,在JVM中只有一個堆,因此堆是被所有線程共享的。
2、棧中存放著棧幀,每個棧幀分別對應一個被調用的方法,棧是線程私有的。
3、方法區存放著已經加載的類信息、常量池、靜態變量以及方法代碼的內存區域
4、方法的調用過程對應棧幀在虛擬機中入棧到出棧的過程。
5、棧幀中存放著局部變量表、指向運行時常量池的引用、方法返回地址等。
- 導讀
- Java知識
- Java基本程序設計結構
- 【基礎知識】Java基礎
- 【源碼分析】Okio
- 【源碼分析】深入理解i++和++i
- 【專題分析】JVM與GC
- 【面試清單】Java基本程序設計結構
- 對象與類
- 【基礎知識】對象與類
- 【專題分析】Java類加載過程
- 【面試清單】對象與類
- 泛型
- 【基礎知識】泛型
- 【面試清單】泛型
- 集合
- 【基礎知識】集合
- 【源碼分析】SparseArray
- 【面試清單】集合
- 多線程
- 【基礎知識】多線程
- 【源碼分析】ThreadPoolExecutor源碼分析
- 【專題分析】volatile關鍵字
- 【面試清單】多線程
- Java新特性
- 【專題分析】Lambda表達式
- 【專題分析】注解
- 【面試清單】Java新特性
- Effective Java筆記
- Android知識
- Activity
- 【基礎知識】Activity
- 【專題分析】運行時權限
- 【專題分析】使用Intent打開三方應用
- 【源碼分析】Activity的工作過程
- 【面試清單】Activity
- 架構組件
- 【專題分析】MVC、MVP與MVVM
- 【專題分析】數據綁定
- 【面試清單】架構組件
- 界面
- 【專題分析】自定義View
- 【專題分析】ImageView的ScaleType屬性
- 【專題分析】ConstraintLayout 使用
- 【專題分析】搞懂點九圖
- 【專題分析】Adapter
- 【源碼分析】LayoutInflater
- 【源碼分析】ViewStub
- 【源碼分析】View三大流程
- 【源碼分析】觸摸事件分發機制
- 【源碼分析】按鍵事件分發機制
- 【源碼分析】Android窗口機制
- 【面試清單】界面
- 動畫和過渡
- 【基礎知識】動畫和過渡
- 【面試清單】動畫和過渡
- 圖片和圖形
- 【專題分析】圖片加載
- 【面試清單】圖片和圖形
- 后臺任務
- 應用數據和文件
- 基于網絡的內容
- 多線程與多進程
- 【基礎知識】多線程與多進程
- 【源碼分析】Handler
- 【源碼分析】AsyncTask
- 【專題分析】Service
- 【源碼分析】Parcelable
- 【專題分析】Binder
- 【源碼分析】Messenger
- 【面試清單】多線程與多進程
- 應用優化
- 【專題分析】布局優化
- 【專題分析】繪制優化
- 【專題分析】內存優化
- 【專題分析】啟動優化
- 【專題分析】電池優化
- 【專題分析】包大小優化
- 【面試清單】應用優化
- Android新特性
- 【專題分析】狀態欄、ActionBar和導航欄
- 【專題分析】應用圖標、通知欄適配
- 【專題分析】Android新版本重要變更
- 【專題分析】唯一標識符的最佳做法
- 開源庫源碼分析
- 【源碼分析】BaseRecyclerViewAdapterHelper
- 【源碼分析】ButterKnife
- 【源碼分析】Dagger2
- 【源碼分析】EventBus3(一)
- 【源碼分析】EventBus3(二)
- 【源碼分析】Glide
- 【源碼分析】OkHttp
- 【源碼分析】Retrofit
- 其他知識
- Flutter
- 原生開發與跨平臺開發
- 整體歸納
- 狀態及狀態管理
- 零碎知識點
- 添加Flutter到現有應用
- Git知識
- Git命令
- .gitignore文件
- 設計模式
- 創建型模式
- 結構型模式
- 行為型模式
- RxJava
- 基礎
- Linux知識
- 環境變量
- Linux命令
- ADB命令
- 算法
- 常見數據結構及實現
- 數組
- 排序算法
- 鏈表
- 二叉樹
- 棧和隊列
- 算法時間復雜度
- 常見算法思想
- 其他技術
- 正則表達式
- 編碼格式
- HTTP與HTTPS
- 【面試清單】其他知識
- 開發歸納
- Android零碎問題
- 其他零碎問題
- 開發思路