讀書筆記之《Java程序員面試寶典》
介紹
最近想了解關於Java面試方面的書籍,我首先選的是《編程之美》這本書,看了前面一部分之後,真的覺得智商受虐了。
然後翻閱了這本書,本書主要介紹的是Java面試的考點,看完之後整體覺得內容比較基礎,本書作者寫錯的地方也有好幾處。
雖然本書存在一些錯誤和知識點內容介紹的也比較簡單,但是對於梳理Java面試考點倒是有一定幫助。
推薦指數:☆☆
正文
Java程序基礎
1、JDK與JRE的區別?
JDK:java開發工具,提供一系列編譯、運行等工具如javac、java等
JRE:其核心就是JVM
2、Java與C/C++程序在編譯和運行上的區別?
不管任何語言其最終都會編譯成機器碼指令,比如彙編指令。
C/C++源碼在編譯之後是生成特別機器文件,在該機上可以直接運行,但是在其它系統機器上未必能夠正常運行。
Java源碼編譯之後的字節碼並不能直接運行於機器上,
而是運行於其自帶安裝的JVM虛擬機之上的。
備註:明白Java代碼運行的原理
3、什麼是JVM以及其工作原理
備註:虛擬機其實你就應該把它當作真實的機器來看待,這樣理解很多問題就很容易了
4、Java的GC與C++的析構函數
Java中雖然也提供了類似C++析構函數功能的方法finalize(),但是原則上不推薦使用
備註:Java內存回收交給GC處理,我們負責寫好代碼就行。
Java語法基礎
1、變量及其作用範圍
靜態變量、成員變量、局部變量
2、Java中變量分爲幾種數據類型
基本數據類型和引用數據類型(也稱對象)
基本數據類型:
字符類型:字節、字符
數值類型:short、int、long、float、double
布爾類型:false/true
備註:引用數據類型的變量在作用域上與基本數據類型是一樣的,它們也有一定的生存週期。只不過它們存在的值比較特別,是一個內存地址.(嚴格講是不正確的只有指針纔是真正存放的是內存地址也就是數值表示的內存地址)
3、理解Java中自動裝箱和自動拆箱
備註:jdk1.5後的新特性
4、Java引用與C++指針的區別
Java引用看起來很像C++的指針,但是並不完全相同,可以將引用看作是在指針的基礎上封裝了一下,將其看作字符串,指針就直接是內存地址了可以將其看作int數值。
5、Java中equal和==的區別
簡單理解是說==比較的是基本數據類型,equal比較的是引用數據類型。(這是錯誤不嚴謹的)
當都是基本數據類型時==比較的是基本數據類型的值,當都是引用數據類型時比較的引用的地址是否相同。
6、java多態的解釋
備註:一種對象表現出的多種行爲
7、java中靜態成員的特點
1)加載時機
2)靜態變量也稱類變量
8、Java中this與super關鍵字
9、簡述接口與抽象類的區別
數據類型及類型轉換
1、基本數據類型與其對應的包裝類型
基本數據類型與其對應的包裝類型
1、自動裝箱和自動拆箱(JDK1.5之後支持)
備註:爲什麼會有對應的包裝類型,我自己覺得有兩點原因
1、爲了體現面向對象(並不是用)
2、爲了在集合框架中使用基本數據類型作爲元素
注意包裝類型通常比對應的基本數據類型多了null取值,開發中藥特別注意。
2、如何使用BigDecimal類進行精確運算
float和double計算都不是精確計算,會出現精度差
使用BigDecimal類進行計算時,主要分爲以下幾步
1)將float或double變量構建BigDecimal對象
2)通過BigDecimal的加減乘除方法進行運算
3)將BigDecimal對象轉換爲float、double、int類型(xxxValue方法)
3、String字符串特性
不變性是其非常重要的一個特性、字符串常量池
String str1 = "hello world";
String str2 = str1;
str2 = "世界你好";
System.out.println(str1);// hello world
System.out.println(str2);// 世界你好
備註:java5.0之後,Java虛擬機啓動時會實例化9個對象池,8個是基本數據類型對應的還有一個是String字符串常量池
4、StringBuffer和StringBuilder作用
它們出現主要是爲了解決字符串拼接場景下的效率問題
備註:StringBuffer是線程安全的,StringBuilder是線程不安全的
5、如何反轉一個字符串
1)倒序遍歷
2)使用StringBuffer的reverse()方法
個人總結:
1、推薦使用基本數據類型而不使用包裝數據類型(效率和便捷性)
2、理解清楚基本數據類型和包裝數據類型存儲的位置
3、字符串的不變性
4、基本數據類型對象池和字符串常量池
數組與集合
1、關於數組分配空間說明
int[] data=new int[1024];//真的就是直接分配內存空間的(1024個整數大小空間)
Object[] data=new Object[1024];//並沒有分配內存空間,因爲其根本就不知道分配大小
備註:以上就是典型的兩種分別表示基本數據類型和引用數據類型
2、解釋迭代器功能和原理
Iterator(迭代器)接口很重要
備註:所有Collection的子類都實現了迭代功能
jdk1.5之後集合對象的遍歷可以使用增強for循環更加簡捷,但是foreach底層還是使用Iterator實現的
3、比較器的功能與原理
Comparable接口
Comparator接口
通常可排序的集合裏面存放的元素都是實現了比較器接口的
4、集合遍歷注意點
最好不要在遍歷集合時修改集合,否則會出現快速失敗異常
5、集合使用泛型帶來的好處
主要就是安全和方便
Java泛型是停留在編譯層的,也就是說JVM在對待泛型數據時候,依然把其看作Object類型,只不過在使用這個元素時候,JVM會自動將其轉爲對應的數據類型。
個人總結:數組和集合石比較重要的,應該好好研究研究。數組往往出現在考算法時的載體
輸入輸出流
Java相比其它語言對IO的設計非常的靈活和巧妙,讓開發者有很多的選擇。
同時也增加了學習成本,不如C/Python就靠一個openFile就能直接操作文件了。
個人總結:這一部分沒什麼好說的,理解流和麪向對象才能使用好Java中IO操作。
除了基本的IO,NIO也應該重點掌握,尤其在開發高性能網絡應用時,肯定是會使用的。
多線程編程
1、生產者和消費者模型實現
參考我博客關於這方面知識介紹
2、Java線程池應用
Java線程池技術
線程池就是將一個或多個線程放到一個容器中進行有效管理
線程池和數據庫連接池有相同的理念:對資源的高效重複利用
線程任務代碼和業務代碼分離
參考我博客關於線程池知識點的解讀
個人總結:多線程的知識點遠比這本書上講的多的多,並且難很多,這本書上說的這些沒有很大參考意義,因此不寫。
Java反射機制
1、什麼事反射以及反射的原理
反射是爲了能夠動態加載一個類,動態調用一個方法,動態訪問一個屬性等動態要求而設計的。
2、反射訪問屬性、方法、構造方法等
個人總結:本書關於反射講解太淺,請自己深入學習和研究
Java網絡編程
1、TCP/IP協議以及四層五層模型
2、TCP編程模型
3、UDP編程模型
4、基於URL和URLConnection的網絡請求
個人總結:網絡編程是一個很大的方向,夠你學的。
Java對數據庫操作(JDBC規範)
1、理解JDBC訪問數據庫原理
2、使用JDBC開發步驟
3、JDBC事務
4、數據庫連接池
個人總結:JDBC是java操作數據庫的基石,很重要應該好好掌握,推薦學習下DbUtils組件的源碼
Java EE相關
java web開發:認真研究Servlet技術非常有幫助
過濾器、監聽器、攔截器等工作原理和應用
個人總結:多花時間在Spring上絕對沒錯。
編程試題
1、打印100以內的質數
2、打印10000以內的迴文數
3、實現快速排序算法
4、實現單例設計模式
總結
讀這本書總的來是說是比較輕鬆的,可以回顧一下基礎知識。