答案是自己寫的,不是標準答案,不對勿噴
Java面試題
java中==和equals和hashCode的區別
原始數據類型,如int,float等用 = = 進行比較時,是比較兩者的值,在其他情況下是比較對象地址,而equals是比較兩個對象的值,hashcode是取對象的哈希值,主要用在容器中。具體可參考
java中equals,hashcode和= =的區別
int、char、long各佔多少字節數
byte:1個字節 8位 -128~127
short :2個字節 16位
int :4個字節 32位
long:8個字節 64位
浮點型:
float:4個字節 32 位
double :8個字節 64位
注:默認的是double類型,如3.14是double類型的,加後綴F(3.14F)則爲float類型的。
char類型:
char:2個字節。
Boolean 類型
boolean: (true or false)(並未指明是多少字節 1字節 1位 4字節)
int與integer的區別
- Integer是int的包裝類,int則是java的一種基本數據類型
- Integer變量必須實例化後才能使用,而int變量不需要
- Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值
- Integer的默認值是null,int的默認值是0
- 當兩個非new Integer對象進行比較時,比如Integer a = 1 Integer b = 1;a==b返回true,但是當值超出-128 與 127這個返回時,比較結果就是false,原因就是java在進行裝箱時,如果integer對象的值是在-128 與 127之間,就會用對象池中的值,而不是去new一個新對象,這樣只要在-128 與 127之間的integer值進行比較,都是一樣的,當然前提是Integer對象不是通過new來創建
詳細請參考Java Integer 與 int 深刻理解
String、StringBuffer、StringBuilder區別
String:不可變字符串
Stringbuilder:可變字符串,沒有創建新的對象
StringBuffer:作用同StringBuilder,但是線程安全
還有一些對象池的東西,詳細請參考面試官:String、StringBuffer,StringBuilder有什麼區別?
泛型中extends和super的區別
- <? extends E> 上限通配符,用來限制類型的上限
即兼容所有E的子類
- <? super E> 下限通配符,用來限制類型的下限
即兼容所有E的父類
父類的靜態方法能否被子類重寫
不能,可以繼承,但不能重寫
Serializable 和Parcelable 的區別
Serializable:屬於Java序列化技術,只需要將類實現Serializable接口就可以,不需要寫額外的代碼,實現原理是通過反射,可以將對象序列化到文件
Parcelable :android特有的序列化技術,使用的時候需要手動實現一些方法,比較麻煩,但是沒有開銷比Serializable小,不能保存到文件,只能內存時間傳輸
詳細請參考:
Parcelable 和 Serializable的區別和使用
Serializable和Parcelable區別
Java垃圾回收機制
直接參考Java 垃圾回收機制學習
UTF-8編碼方式中文佔幾個字節
一般佔三個
utf-8的中文是一個漢字佔三個字節長度嗎?
靜態代理和動態代理的區別
靜態:由程序員創建代理類或特定工具自動生成源代碼再對其編譯。在程序運行前代理類的.class文件就已經存在了。
動態:在程序運行時運用反射機制動態創建而成。可以給所有類添加代理,但是所有被代理的類所做的額外操作都是一樣的,因爲都是調用同一個invoke方法
可以參考靜態代理和動態代理的區別和聯繫
Java的異常體系
泛型原理
主要是編譯時類型擦除
java泛型 泛型的內部原理:類型擦除以及類型擦除帶來的問題
Java中String深入理解
String水很深,具體可以參考這個
Java 乾貨之深入理解String
String爲什麼要設計成不可變的?
總體來說, String不可變的原因包括 設計考慮,效率優化問題,以及安全性這三大方面. 事實上,這也是Java面試中的許多 “爲什麼” 的答案
爲什麼String要設計成不可變的?