Java知識體系之Java基礎
最近看到CSDN上面的一篇部落格面試必備:《Java最常見的200+面試題全解析》 , 講解了關於Java體系的一些模組以及面試中的一些常見問題; 雖然最近沒有要去找工作的需求, 但是鞏固一下這方面的知識還是很有必要的; 後面從作者提出的問題進行自我的提問與解答, 有問題歡迎大家指出;
Java基礎部分
1、JDK 和 JRE 的區別
我的理解是: 首先JDK包含三部分: 1、程式設計師程式設計所需要的基本類庫等; 2、Java位元組碼的執行時環境(JRE); 3、用於對JVM進行調優檢視等工具, 如 jconsole、jstack等; 而JRE僅僅為Java程式碼的執行提供執行時環境而已;
2、== 和 equals 的區別
== 表示兩個物件的記憶體地址是否相等, 即: ==兩遍比較的物件是不是同一個類的例項, 如果是同一個例項, 那麼返回true, 如果不是則返回false; 預設java.lang.Object中的equals是基於==來實現的; 而Object子類可以重寫equals方法, 來實現自己的邏輯上的等於判斷; 即使兩個物件不是同一個物件例項, 裡面有一些資料相同也可以認為它們是相同的;
** 3、HashCode 與 Equals是什麼關係?
在不使用集合的情況下, hashCode與equals沒有直接關係; equals可以單獨進行邏輯判斷, 即使兩個物件邏輯相等, hashCode也可以不一樣; 反過來也成立, 即使兩個物件的hashCode相同, equals方法返回值也可能不同; 但是在使用如HashMap、HashSet等結構時, 由於底層是基於桶的演算法, 所以必須確保如果作為Key兩個物件的equals返回true, 它的hashCode一定要相等; 如果不相等, 那麼對於邏輯相同的物件作為Key去檢索的時候找不到對應的Value;
4、final 在 java 中的作用
final在Java中可以修飾 類、方法、變數; 修飾類: 表示該類是一個終態類, 不允許有子類; 修飾方法: 表示該方法不能夠被重寫; 修飾變數: 表示該變數指向的物件不能夠改變 一般定義不可變常量 如: LOGGER 或者線上程中需要引用外部變數, 則需要新增final修飾符;
5、String 屬於基礎的資料型別嗎
String不屬於基本資料型別, 它是Java中的內建的類, 底層使用char[]實現;
6、java 中操作字串都有哪些類?它們之間有什麼區別?
Java中操作字串的類有3個: String、StringBuffer、StringBuilder; String類每次對於字串的CURD操作都會產生一個新的字串常量; StringBuffer與StringBuilder不會; 而StringBuffer是執行緒安全的, StringBuilder是執行緒非安全的;
7、String 類的常用方法都有那些
indexOf, substring, lastIndexOf, chatAt, equals, startWith, endWith, concat, replace, split, toLowerCase等等;
8、抽象類必須要有抽象方法嗎?
這種就是更基礎的了, 抽象類不一定要有抽象方法, 可以全部是實現; 不過一般沒有抽象方法的抽象類都會把abstract修飾符給去掉
9、BIO、NIO、AIO 有什麼區別
這個問題就比較大了, 涉及到的知識點比較多; BIO: 一般翻譯為同步阻塞IO, 一旦呼叫了同步方法, 那麼必須等待資料到達之後才會返回; 否則一直等待; NIO: 一般翻譯為New IO, 或者 Non-Blocking IO; 其實也是阻塞IO, 增加了Channel、Selector以及事件機制來確保不是所有的IO操作都處於等待, 能夠更加合理的利用CPU資源; 具體表現為Selector監聽各個IO操作的情況, 如果有IO可讀、可寫之後, 就直接返回; 然後遍歷所有的Channel, 哪個可讀可寫就排程誰; 該NIO實現依託於Linux IO模型中的多路複用機制 AIO: 就是非同步非阻塞IO, 這個暫時還不是很瞭解實現, 明天學習一下;