java面試筆試知識點
一、基礎知識
!!!!!!!!!!!!!!!!!!!①基本概念!!!!!!!!!!!!!!!!!!!!
(1)java不存在全域性變數或全域性函式
(2)java程式碼塊初始化順序:父類靜態變數、父類靜態程式碼塊、子類靜態變數、子類靜態程式碼塊、、父類非靜態變數、父類非靜態程式碼塊、父類建構函式、、子類非靜態變數、子類非靜態程式碼塊、子類建構函式、、
(3)作用域:private:當前類;default:當前類、同包;protected:當前類、同包、子類;public:所有;
(4)建構函式不能被繼承、但可以過載
(5)介面常量值預設使用:public static final ;沒有宣告任何方法的介面叫做標識介面,比如Cloneable和Serializable;接口裡面的方法為抽象方法,其實際是public abstract
(6)處理基本資料型別時,都是採用按值傳遞,其他型別都是按引用傳遞
(7)反射機制:得到一個物件所屬的類,獲取一個類的所有成員變數和方法,最重要作用是在執行時動態地建立類的物件。
(8)在反射機制中,如何獲取class:(1)class.forName(“類路徑”);(2)類名.class;(3)例項.getClass();
(9)建立物件的方式有幾種:(1)new例項化一個物件;(2)通過反射機制獲取物件來建立;(3)通過clone()建立物件;通過反序列化的方式建立物件;(4)通過反序列化的方式建立物件getClass.getSuperclass().getName()
!!!!!!!!!!!!!!!!!!!!②面向物件技術!!!!!!!!!!!!!!!!!!!!
(1)面向物件和麵向過程的區別:把資料和資料操作方法放在一起,作為一個相互依存的整體;面向過程是一種以事件為中心的開發方法,就是自頂向下順序執行,逐步求精,其程式結構是按功能劃分為若干個基本模組
(2)面向物件有哪些特徵:抽象、繼承、封裝、多型
-封裝:將物件擁有的屬性和動作隱藏起來,只保留特定的方法與外界聯絡。
-抽象:就是為了繼承而存在的,強調所屬關係,其設計理念為is-a關係。它強調主要特徵。對於一類事物,它的個體有共同的地方,也有不同的地方。我們把它們共同的一部分可以詳細描述,但是特別的地方就不能一 一描述了,此時,可以把這部分特別的地方抽象為一個方法。
-繼承:從已有的類中派生出新的類稱為子類,子類繼承父類的資料屬性和行為,並能根據自己的需求擴展出新的行為,提高了程式碼的複用性。
-多型:同一訊息根據不同的物件而採用各種不同的行為方法。封裝和繼承幾乎都是為多型而準備的.在執行期間判斷引用物件的實際型別,根據其實際的型別呼叫其相應的方法。
(3)面向物件開發優點:較高的開發效率,保證魯棒性,保證高可維護性
(4)多型的實現機制:過載、覆蓋
(5)java提供了哪兩種用於多型的機制:編譯時多型(通過方法過載)和執行時多型(通過方法覆蓋)。
(6)抽象類與介面類:
<1>抽象類:在實現時,必須包含相同的或者更低的訪問級別,abstract不能用來修飾屬性,只能extends。如果基本功能在不斷改變,那麼就需要使用抽象類。
<2>介面:成員變數都是static final,只能implements。如果你想實現多重繼承,那麼你必須使用介面。
(7)內部類有哪些:
<1>靜態內部類:static修飾的類,只能訪問外部類中的靜態成員和靜態方法(包括私有的)。只有靜態內部類可以有靜態成員
<2>成員內部類:類裡面的普通類
<3>區域性內部類:方法裡面的類
<4>匿名內部類:沒類名,必須繼承其他類或實現其他介面,一般用於GUI,不能有建構函式,不能定義靜態的成員和方法。
(8)this和super的區別:this用來指當前類的物件,super可以訪問父類的方法或成員變數,super()必須為建構函式的第一條語句
(9)為什麼static方法不能呼叫非static方法?
由於靜態成員在類載入的時候就會被分配記憶體,而非靜態成員則不會。因此,在一個類的靜態成員中去訪問其非靜態成員會出錯,是因為在類的非靜態成員不存在的時候,類的靜態成員就已經存在了,訪問一個記憶體中不存在的東西當然會出錯。
!!!!!!!!!!!!!!!!!!!!③關鍵字!!!!!!!!!!!!!!!!!!!!!
(1)final、finally、finalize區別:
<1>final :用於宣告屬性、方法和類,分別表示屬性不可變、方法不可覆蓋,類不能派生
<2>finally:異常處理的一部分,這段語句,一定會被執行。return前執行
<3>finalize:是Object類的一個方法,在垃圾回收執行時,會呼叫被回收物件的finalize()
(2)assert主要用來保證程式的正確性
(3)static的作用:為某個物件分配單一的儲存空間;通過類來直接呼叫或使用類的屬性
(4)volatile:一個型別修飾符,被定義的變數,系統每次用它都是直接從對應記憶體中提取,而不會利用快取。
(5)instanceof:一個二元運算子,判斷一個物件是否一個類(或介面、抽象類、父類)的例項。
(6)strictfp:精確浮點,用來修飾類。
!!!!!!!!!!!!!!!!!!!!④基本型別與運算!!!!!!!!!!!!!!!!!!!!!
(1) 預設宣告的小數是double
(2)資料型別:低精度到高精度:byte<short<char<int<long<float<double
(3)Math中的round為四捨五入,ceil為向上取整,floor為向下取整
!!!!!!!!!!!!!!!!!!!!⑤字串與陣列!!!!!!!!!!!!!!!!!!!!!
(1)“= =”、equals、hashCode有什麼區別?
<1>“= =”:對於基本型別資料,判斷值是否相等;對於引用型別資料,判斷在記憶體中的存放地址,對棧中的值進行比較的。對於Integer的-128到127之間的數,會進行快取。
<2>equals:判斷物件的記憶體地址引用是不是同一個地址,Object類提供的一個方法,可以被覆蓋。equals與==是等效的。
<3>hashCode:只有在集合中用到,根據物件的地址或者字串或者數字算出來的唯一的雜湊碼值,Object類提供的一個方法,可以被覆蓋。
(2)String、StringBuffer、StrigBuilder、StringTokenizer
<1>String:不可變類,資料量少的時候用,
<2>StringBuffer:可變類,執行緒安全,
<3>StrigBuilder:可變類,單執行緒才可以用,
<4>StringTokenizer:分割單詞
!!!!!!!!!!!!!!!!!!!!⑥異常處理!!!!!!!!!!!!!!!!!!!!!
(1)異常處理:所有異常的父類:java.lang.Throwable,異常分為error和exception
<1>error表示在執行期間出現了非常嚴重的錯誤,並且該錯誤是不可恢復的
<2>Exception表示可恢復的異常
(2)執行時異常和普通異常有什麼區別:
<1>執行時異常:比較嚴重,編譯器沒有強制對其進行捕獲並處理,出現異常,若沒有處理就交給JVM處理。
<2>檢查異常:不會導致程式出錯,java編譯器強制程式去捕獲異常。
!!!!!!!!!!!!!!!!!!!!⑦輸入輸出流!!!!!!!!!!!!!!!!!!!!!
(1)流可以分為兩大類:位元組流和字元流。
<1>位元組流(1個位元組):包含兩個抽象類:InputStream和OutputStream,沒用到快取
<2>字元流(2個位元組):包含兩個抽象類:Reader和Writer,用到快取
(2)JavaSocket是什麼?
<1>網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個雙向鏈路的一端稱為一個socket
<2>Socket分為兩類:面向連線的通訊協議TCP,面向無連線的通訊協議UDP
<3>採用的是阻塞方式
(3)JavaNIO是什麼?
<1>採用的是非阻塞方式
<2>在處理大量併發請求的時候,採用JavaNIO更有效率
(4)什麼是序列化?
<1>將物件以一連串字元描述的過程,在序列化時不會序列化static變數和transient臨時變數
<2>什麼情況下用:需要通過網路來發送物件,或物件的狀態需要被持久化到資料庫或檔案中。序列化能實現深複製。
!!!!!!!!!!!!!!!!!!!!⑧java平臺與記憶體管理!!!!!!!!!!!!!!!!!!!!!
(4)java平臺主要包含兩個模組:JVM和javaAPI
(5).java檔案被javac編譯為.class位元組碼檔案,再由JVM執行
(6)什麼是GC
<1>主要任務:分配記憶體、確保被引用物件的記憶體不被錯誤回收、回收不再被引用的物件的記憶體空間
<2>注意點:稱為垃圾的物件,只有在下次垃圾回收器執行時才會被回收
<3>可以呼叫System.gc()來通知垃圾回收器執行
(7)記憶體洩漏
<1>主要兩種情況:一是堆中申請的空間沒有被釋放,二是物件已不再使用,但還仍然在記憶體中保留著
<2>導致的具體原因舉例:
-靜態集合類
-各種連線
-監聽器
-變數不合理的作用域
(8)java中的堆和棧
<1>基本型別變數地址和引用型別變數地址存在棧中;
<2>引用型別變數記憶體分配在堆上、常量池(例如字串常量和基本資料型別常量);
!!!!!!!!!!!!!!!!!!!!⑨容器!!!!!!!!!!!!!!!!!!!!!
(1)Collections框架
Collection 和 Collections的區別:
Collection是集合介面,子介面主要有Set 和List、Map,提供對集合物件進行基本操作的通用介面方法。
Collections是針對集合類的一個包裝類,提供了操作集合的工具方法:一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
(2)java 中的 length 屬性是針對陣列說的,比如說你聲明瞭一個數組,想知道這個陣列的長度則用到了 length 這個屬性.
java 中的 length() 方法是針對字串說的,如果想看這個字串的長度則用到 length() 這個方法.
java 中的 size() 方法是針對泛型集合說的,如果想看這個泛型有多少個元素,就呼叫此方法來檢視!
!!!!!!!!!!!!!!!!!!!!⑩多執行緒!!!!!!!!!!!!!!!!!!!!!
(1)執行緒與程序的區別?
<1>執行緒:執行程式程式碼的一個執行單元。執行緒的四種狀態:就緒、執行、掛起、結束
<2>程序:一段正在執行的程式。
(2)使用多執行緒的好處?
<1>減少程式的響應時間
<2>與程序相比,執行緒的建立和切換開銷更小
<3>提高CPU的利用率,因為多CPU和多核計算機本身就具有執行多執行緒的能力
<4> 複雜程序可以分成多個執行緒來執行,使程式便於理解和維護
(3)要想實現同步操作,必須要獲得執行緒物件的鎖。
(4)如何實現Java多執行緒?
<1>繼承Thread類,重寫run()方法,通過Thread的start()方法啟動。
<2>實現Runnable介面,實現run()方法,通過Thread的start()方法啟動。推薦使用這種方式。
<3>實現Callable介面,重寫call()方法,通過ExecutorService的submit(執行緒)方法啟動,返回一個Future<>類,通過future的get ()方法可以監視目標執行緒呼叫call()方法的情況,呼叫了get方法,當前執行緒會阻塞
<4>實現Callable介面,重寫call()方法,通過 new Thread(FutureTask)獲得的一個Thread的start()方法啟動。
(5)多執行緒實現同步的方法有哪些?
<1>sysnchronized:但是它是以很大的系統開銷作為代價的。兩種同步方法:利用同步程式碼塊,利用同步方法
<2>wait()和notify():執行緒可以呼叫wait()方法釋放物件鎖,進入等待狀態。可以呼叫notify()和notifyAll()通知其他正在等待的執行緒去獲得鎖。
<3>Lock介面、它的實現類ReentrantLock(重入鎖)、它的方法如下:
-lock():阻塞方式。拿到鎖,就返回;沒拿到鎖,就等待直到拿到鎖。會忽略interrupt()方法
-tryLock():非阻塞方式。拿到鎖,就返回true;沒拿到,就返回false。
-tryLock(long timeout,TimeUnit unit):拿到鎖,就返回true;否則等待unit時間,在等待過程中,如果拿到鎖,就返回true,如果等待超時,返回false
-lockInterruptibly():拿了鎖,立即返回;沒拿到鎖,進入休眠狀態,直到獲得鎖,或者當前執行緒被別的執行緒中斷。
(6)sleep()與wait()有什麼區別
<1>sleep():進入阻塞狀態,時間一到,執行緒會自動甦醒,恢復到可執行狀態,等cpu排程。sleep並不會釋放鎖。必須捕獲異常。容易死鎖。
<2>wait():用於執行緒間的通訊,直到其他執行緒呼叫notify()才會醒來。wait會釋放鎖。必須放在同步控制方法或者同步語句塊中。
(7)sleep()和yield()兩個的區別?
<1>sleep():給其他執行緒機會的時候,不考慮執行緒的優先順序。sleep()後會轉入阻塞狀態。
<2>yield():給其他執行緒機會的時候,考慮執行緒的優先順序,yield()後會轉入可執行狀態。
(8)終止執行緒的方法有哪些?
<1>stop():釋放所有資源。
<2>suspend():容不會釋放鎖,易發生死鎖。
<3>讓執行緒結束進入Dead狀態:設定一個flag來控制迴圈是否執行。適用於執行緒執行狀態。
<4>用interrupt()來打破阻塞,結束程序
(9)synchronized與lock有什麼異同?
<1>用法不一樣。synchronized是交給jvm託管的,lock是通過程式碼實現的。
<2>效能不一樣。在競爭不激烈的時候,synchronized效能好於ReentrantLock。競爭激烈的時候,synchronized效能急速下降,ReentrantLock效能不變。
<3>鎖機制不一樣。synchronized獲得多個鎖,必須以相反順序釋放,是自動解鎖的,不會因為出了異常而導致鎖沒有被釋放。Lock需要手動釋放,必須在finally塊中釋放。
(10)什麼是守護執行緒?
守護執行緒一般具有較低的優先順序。可以JVM提供,也可以使用者在呼叫start()方法前呼叫setDaemon(true)。所有非守護執行緒終止,即使存在守護執行緒,程序執行終止
(11)join()方法的作用是什麼?
讓呼叫該方法的執行緒a在執行完run()方法後,再執行a.join(t);後面的程式碼語句。只等待t時間,若執行緒a還沒run完也繼續走後面的程式碼語句。
!!!!!!!!!!!!!!!!!!!!⑪資料庫操作!!!!!!!!!!!!!!!!!!!!!
(1)如何通過JDBC訪問資料庫
<1>載入JDBC驅動器 String driver=“com.mysql.jdbc.Driver”
<2>載入JDBC驅動 Class.forName(driver)
<3>建立資料庫連線,取得Connection物件 Connection con=DriverManager.getConnection(url,user,password)
<4>建立Statement物件或是PreparedStatement物件
Statement stmt=con.createStatement();
<5>執行SQL語句 ResultSet st=stmt.excute(“sql語句”)
<6>訪問結果集
<7>關閉各物件
(2)JDBC有哪些事務隔離級別?
<1>TRANSACTION_NONE JDB不支援事務
<2>TRANSACTION_READ_UNCOMMITTED未提交讀:允許讀“髒”資料,不可重複讀、虛讀
<3>TRANSACTION_READ_COMMITTED已提交讀:允許不可重複讀、虛讀
<4>TRANSACTION_REPEATABLE_READ可重複讀:允許虛讀
<5>TRANSACTION_SERIALIZABLE可序列化:都不允許
-讀“髒”資料:事務a改了數但還沒提交,事務b讀了數,事務a回滾了
-不可重複讀:事務a查詢資料,事務b去更新了,事務a又查了一次發現數據值變了
-虛讀:事務a查詢資料,事務b增刪了幾條資料,事務a又查了一次發現數據量變了
(3)設定隔離級別的方法
通過Connection物件的conn.setTransactionLevel()方法來設定隔離級別。
(4)Class.forName的作用是什麼?
任何類只有被裝在到jvm上才能執行。Class.forName()就是把類載入到jvm中
(5)Statement、PreparedStatement、CallableStatement有什麼區別?
<1>Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement。
<2>Statement介面提供了執行語句和獲取結果的基本方法;
PreparedStatement介面添加了處理 IN 引數的方法;
CallableStatement介面添加了處理 OUT 引數的方法。
<3>a.Statement:
普通的不帶參的查詢SQL;支援批量更新,批量刪除;
b.PreparedStatement:
可變引數的SQL,編譯一次,執行多次,效率高;
安全性好,有效防止Sql注入等問題;
支援批量更新,批量刪除;
c.CallableStatement:
繼承自PreparedStatement,支援帶引數的SQL操作;
為所有的RDBMS提供了一種標準形式呼叫儲存過程的方法。
支援呼叫儲存過程,提供了對輸出(IN)、輸出(OUT)、輸入和輸出引數(IN-OUT)的支援;
(4)結果集的getString ()和getObject()有什麼區別
<1>getString ():適合查詢的結果集中獲取的數量比較小的情況。程式會一次性地把資料都存放到記憶體中。當資料量大到記憶體中放不下時就會丟擲異常
<2>getObject():每次呼叫時會直接從資料庫中去獲取資料。
(5)JDBC和Hibernate有什麼區別
Hibernate是JDBC的封裝,用xml配置資料庫連線引數,Hibernate是一個持久層框架,它將表的資訊對映到xml檔案中,再從xml檔案對映到持久化類中。Hibernate具有訪問層DAO。如果表名改了,只需要修改DAO層
二、資料庫原理
(1)最基本的
查:select * from tablename where 條件語句
增:insert into tablename values (v1,v2,v3…)
刪:delete from tablename where 條件語句
改:update tablename set 欄位名=欄位值 where 條件語句
創表:create table tablename
刪表:drop table tablename
改表:alter table …add|alter|drop
授權:grant … to …
回收權:revoke … from …
建立索引:create index indexname on tablename (columnname)
刪除索引:ALTER TABLE table_name DROP INDEX index_name
(2)delete與truncate區別?
<1>delete:是DML(資料操縱語言),被刪除的資料佔用的儲存空間還在,還可以恢復,刪除的操作以日誌的形式儲存,可以回滾
<2>truncate:是DDL(資料定義語言),被刪除的資料立即釋放佔用的儲存空間,被刪除的資料不能恢復,執行後不能回滾。
(3)內連線與外連線有什麼區別?
<1>內連線:只有兩個表相匹配的行才能在結果集中出現。
<2>外連線:不僅包含符合連線條件的行,而且還包括左表(左外連線時)、右表(右外連線時)、兩個邊接表(全外連線)中的所有行。
LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。
RIGHT JOIN 關鍵字會右表 (table_name2) 那裡返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。
(4)什麼是事務?
事務是資料庫中一個單獨的執行單元,當在資料庫中更改資料成功時,在事務中更改的資料就會提交,不再改變。否則,事務就取消或者回滾,更改無效。
(5)事務的四個特性?
A:原子性:不可分割的整體
C:一致性:事務執行前後,資料庫資料必須保持一致
I:隔離線:事務a的事不會被其他事務b看到。兩個事務不可能交叉執行。
D:永續性:事務的修改是永久的。
(5)什麼是儲存過程?
sql語句在執行的時候要先編譯後才能執行。大型系統為提高效率,將sql語句進行編譯優化後,儲存在資料庫伺服器中。也就是儲存過程。
執行方法:exec 儲存過程名[引數]
刪除方法:drop procedure 儲存過程名
(6)儲存過程與函式的區別
<1>儲存過程功能較複雜,函式功能針對性較強
<2>儲存過程是作為一個獨立部分來執行的,函式需嵌在sql語句中才能執行
<3>儲存過程在建立時就已經在伺服器上進行編譯了,執行速度比函式快
<4>函式不能直接操作實體表,只能操作內建表
(7)正規化:
1NF:列不可以再分
2NF:非主屬性對主鍵完全依賴
3NF:非主屬性不傳遞依賴於主鍵
BCNF
4NF
(8)什麼是觸發器
一種特殊型別的儲存過程,由事件觸發,當發生資料操作語言事件時執行的儲存過程,由after(記錄改變後執行)和instead of(記錄改變前執行)兩種觸發器。
(9)什麼是遊標
遊標是由結果集和遊標位置組成的
在使用遊標的表中,對行提供刪除和更新的功能
遊標將面向集合的資料庫管理系統和麵向行的程式設計連線了起來
(10)union和union all區別
union合併兩個表後會去重,union all簡單合併兩個表
(11)什麼是檢視
檢視是基於 SQL 語句的結果集的視覺化的表,是個虛圖
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
作用:簡化資料查詢語句,提高資料安全性,但是不能提高查詢的效率
(12)怎麼用sql實現分頁?
String sql = "SELECT TOP " + pageSize + " * FROM tb_SQLServerFenye" +
" WHERE id NOT IN(SELECT TOP " + (page - 1) * pageSize + " id FROM" +
" tb_SQLServerFenye ORDER BY ID DESC) ORDER BY ID DESC";
三、
四、git和svn的區別
svn | git |
---|---|
集中式版本控制系統 (文件管理很方便) | 分散式系統(程式碼管理很方便) |
安全性較差,定期備份,並且是整個svn都得備份 | 安全性較高,每個開發者的本地就是一套完整版本庫,記錄著版本庫的所有資訊 |
每次更改檔案之前都得update操作,有的時候修改過程中這個檔案有更新,commit不會成功 | 開始工作前進行fetch操作,完成開發工作後push操作,有衝突解決衝突 |
svn的許可權管理相當嚴格,可以按組、個人針對某個子目錄的許可權控制 | git沒有嚴格的許可權管理控制,只有賬號角色劃分 |
用SVN的話,沒有網路或者斷開VPN你就無法做任何事情。 | Git在本地磁碟上就儲存著所有有關當前專案的歷史更新,並且Git中的絕大多數操作都只需要訪問本地檔案和資源,不用連網,所以處理起來速度飛快。日誌都是在本地檢視,效率較高 |
而SVN有全域性版本號 | 檔案沒有改變時,分支指向這個檔案的指標不會改變,檔案發生改變,指標指向新版本 |