基礎篇
一、基本功
面向對象特徵
封裝,繼承,多態和抽象
- 封裝
封裝給對象提供了隱藏內部特性和行為的能力。對象提供一些能被其他對象訪問的方法來改
變它內部的數據。在 Java 當中,有 3 種修飾符: public, private 和 protected。每一種修飾符
給其他的位於同一個包或者不同包下面對象賦予了不同的訪問權限。
下面列出了使用封裝的一些好處:
通過隱藏對象的屬性來保護對象內部的狀態。
提高了代碼的可用性和可維護性,因為對象的行為可以被單獨的改變或者是擴展。
禁止對象之間的不良交互提高模塊化
2. 繼承
繼承給對象提供了從基類獲取字段和方法的能力。繼承提供了代碼的重用行,也可以在不修改類的情況下給現存的類添加新特性。
- 多態
多態是編程語言給不同的底層數據類型做相同的接口展示的一種能力。一個多態類型上的操作可以應用到其他類型的值上面。
- 抽象
抽象是把想法從具體的實例中分離出來的步驟,因此,要根據他們的功能而不是實現細節來創建類。 Java 支持創建只暴漏接口而不包含方法實現的抽象的類。這種抽象技術的主要目的是把類的行為和實現細節分離開。
final, finally, finalize 的區別
- final
修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
- finally
在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。
- finalize
方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。
int 和 Integer 有什麼區別
int 是基本數據類型
Integer是其包裝類,注意是一個類。
為什麼要提供包裝類呢???
一是為了在各種類型間轉化,通過各種方法的調用。否則 你無法直接通過變量轉化。
比如,現在int要轉為String
1
2
int a=0;
String result=Integer.toString(a);
在java中包裝類,比較多的用途是用在於各種數據類型的轉化中。
我寫幾個demo
//通過包裝類來實現轉化的
1
2
3
4
5
6
7
8
9
int num=Integer.valueOf(“12”);
int num2=Integer.parseInt(“12”);
double num3=Double.valueOf(“12.2”);
double num4=Double.parseDouble(“12.2”);
//其他的類似。通過基本數據類型的包裝來的valueOf和parseXX來實現String轉為XX
String a=String.valueOf(“1234”);//這裡括號中幾乎可以是任何類型
String b=String.valueOf(true);
String c=new Integer(12).toString();//通過包裝類的toString()也可以
String d=new Double(2.3).toString();
再舉例下。比如我現在要用泛型
1
List nums;
這裡<>需要類。如果你用int。它會報錯的。
在這裡給大家提供一個學習交流的平臺,java架構師群: 867748702
具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。
在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。
如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的可以加群。
________________________________________________________________________________________________
加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。
性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限
都是大牛帶飛 讓你少走很多的彎路的 群號是: 867748702對了 小白勿進 最好是有開發經驗
注:加群要求
1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
重載和重寫的區別
override(重寫)
- 方法名、參數、返回值相同。
- 子類方法不能縮小父類方法的訪問權限。
- 子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。
- 存在於父類和子類之間。
- 方法被定義為final不能被重寫。
overload(重載)
- 參數類型、個數、順序至少有一個不相同。
- 不能重載只有返回值不同的方法名。
- 存在於父類和子類、同類中。
抽象類和接口有什麼區別
接口是公開的,裡面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的,
另外,實現接口的一定要實現接口裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是接口,然後是抽象類實現接口,最後才到具體類實現。
還有,接口可以實現多重繼承,而一個類只能繼承一個超類,但可以通過繼承多個接口實現多重繼承,接口還有標識(裡面沒有任何方法,如Remote接口)和數據共享(裡面的變量全是常量)的作用。
說說反射的用途及實現
Java反射機制主要提供了以下功能:在運行時構造一個類的對象;判斷一個類所具有的成員變量和方法;調用一個對象的方法;生成動態代理。反射最大的應用就是框架
Java反射的主要功能:
確定一個對象的類
取出類的modifiers,數據成員,方法,構造器,和超類.
找出某個接口裡定義的常量和方法說明.
創建一個類實例,這個實例在運行時刻才有名字(運行時間才生成的對象).
取得和設定對象數據成員的值,如果數據成員名是運行時刻確定的也能做到.
在運行時刻調用動態對象的方法.
創建數組,數組大小和類型在運行時刻才確定,也能更改數組成員的值.
反射的應用很多,很多框架都有用到
spring 的 ioc/di 也是反射….
javaBean和jsp之間調用也是反射….
struts的 FormBean 和頁面之間…也是通過反射調用….
JDBC 的 classForName()也是反射…..
hibernate的 find(Class clazz) 也是反射….
反射還有一個不得不說的問題,就是性能問題,大量使用反射系統性能大打折扣。怎麼使用使你的系統達到最優就看你係統架構和綜合使用問題啦,這裡就不多說了。
來源:http://uule.iteye.com/blog/1423512
說說自定義註解的場景及實現
(此題自由發揮,就看你對註解的理解了!==)登陸、權限攔截、日誌處理,以及各種Java框架,如Spring,Hibernate,JUnit 提到註解就不能不說反射,Java自定義註解是通過運行時靠反射獲取註解。實際開發中,例如我們要獲取某個方法的調用日誌,可以通過AOP(動態代理機制)給方法添加切面,通過反射來獲取方法包含的註解,如果包含日誌註解,就進行日誌記錄。
HTTP 請求的 GET 與 POST 方式的區別
GET方法會把名值對追加在請求的URL後面。因為URL對字符數目有限制,進而限制了用在客戶端請求的參數值的數目。並且請求中的參數值是可見的,因此,敏感信息不能用這種方式傳遞。
POST方法通過把請求參數值放在請求體中來克服GET方法的限制,因此,可以發送的參數的數目是沒有限制的。最後,通過POST請求傳遞的敏感信息對外部客戶端是不可見的。
參考:https://www.cnblogs.com/wangli-66/p/5453507.html
session 與 cookie 區別
cookie 是 Web 服務器發送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個 Web 服務
器存儲 cookie。以後瀏覽器在給特定的 Web 服務器發請求的時候,同時會發送所有為該服
務器存儲的 cookie。下面列出了 session 和 cookie 的區別:
無論客戶端瀏覽器做怎麼樣的設置,session都應該能正常工作。客戶端可以選擇禁用 cookie,
但是, session 仍然是能夠工作的,因為客戶端無法禁用服務端的 session。
JDBC 流程
1、 加載JDBC驅動程序:
在連接數據庫之前,首先要加載想要連接的數據庫的驅動到JVM(Java虛擬機),
這通過java.lang.Class類的靜態方法forName(String className)實現。
例如:
1
2
3
4
5
6
7
try{
//加載MySql的驅動類
Class.forName(“com.mysql.jdbc.Driver”) ;
}catch(ClassNotFoundException e){
System.out.println(“找不到驅動程序類 ,加載驅動失敗!”);
e.printStackTrace() ;
}
成功加載後,會將Driver類的實例註冊到DriverManager類中。
2、 提供JDBC連接的URL
連接URL定義了連接數據庫時的協議、子協議、數據源標識。
書寫形式:協議:子協議:數據源標識
協議:在JDBC中總是以jdbc開始 子協議:是橋連接的驅動程序或是數據庫管理系統名稱。
數據源標識:標記找到數據庫來源的地址與連接端口。
例如:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk;useUnicode=true;(MySql的連接URL)
表示使用Unicode字符集。如果characterEncoding設置為 gb2312或GBK,本參數必須設置為true 。characterEncoding=gbk:字符編碼方式。
3、創建數據庫的連接
要連接數據庫,需要向java.sql.DriverManager請求並獲得Connection對象, 該對象就代表一個數據庫的連接。
使用DriverManager的getConnectin(String url , String username , String password )方法傳入指定的欲連接的數據庫的路徑、數據庫的用戶名和 密碼來獲得。
例如: //連接MySql數據庫,用戶名和密碼都是root
1
2
3
4
5
6
7
8
9
String url = “jdbc:mysql://localhost:3306/test” ;
String username = “root” ;
String password = “root” ;
try{
Connection con = DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println(“數據庫連接失敗!”);
se.printStackTrace() ;
}
4、 創建一個Statement
•要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3 種類型:
1、執行靜態SQL語句。通常通過Statement實例實現。
2、執行動態SQL語句。通常通過PreparedStatement實例實現。
3、執行數據庫存儲過程。通常通過CallableStatement實例實現。
具體的實現方式:
Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall(“{CALL demoSp(? , ?)}”) ;
5、執行SQL語句
Statement接口提供了三種執行SQL語句的方法:executeQuery 、executeUpdate 和execute
1、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句 ,返回一個結果集(ResultSet)對象。
2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的 語句。 具體實現的代碼:
ResultSet rs = stmt.executeQuery(“SELECT * FROM …”) ; int rows = stmt.executeUpdate(“INSERT INTO …”) ; boolean flag = stmt.execute(String sql) ;
6、處理結果
兩種情況:
1、執行更新返回的是本次操作影響到的記錄數。
2、執行查詢返回的結果是一個ResultSet對象。
• ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些 行中數據的訪問。
• 使用結果集(ResultSet)對象的訪問方法獲取數據:
while(rs.next()){
String name = rs.getString(“name”) ;
String pass = rs.getString(1) ; // 此方法比較高效
}
(列是從左到右編號的,並且從列1開始)
7、關閉JDBC對象
操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲 明順序相反:
1、關閉記錄集
3、關閉連接對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if(rs != null){ // 關閉記錄集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 關閉聲明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 關閉連接對象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
MVC 設計思想
MVC就是
M:Model 模型
V:View 視圖
C:Controller 控制器
模型就是封裝業務邏輯和數據的一個一個的模塊,控制器就是調用這些模塊的(java中通常是用Servlet來實現,框架的話很多是用Struts2來實現這一層),視圖就主要是你看到的,比如JSP等.
當用戶發出請求的時候,控制器根據請求來選擇要處理的業務邏輯和要選擇的數據,再返回去把結果輸出到視圖層,這裡可能是進行重定向或轉發等.
equals 與 == 的區別
值類型(int,char,long,boolean等)都是用==判斷相等性。對象引用的話,==判斷引用所指的對象是否是同一個。equals是Object的成員函數,有些類會覆蓋(override)這個方法,用於判斷對象的等價性。例如String類,兩個引用所指向的String都是”abc”,但可能出現他們實際對應的對象並不是同一個(和jvm實現方式有關),因此用==判斷他們可能不相等,但用equals判斷一定是相等的。
二、集合
List 和 Set 區別
List,Set都是繼承自Collection接口
List特點:元素有放入順序,元素可重複
Set特點:元素無放入順序,元素不可重複,重複元素會覆蓋掉
(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set 的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標來取得想要的值。)
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
List 和 Map 區別
List是對象集合,允許對象重複。
Map是鍵值對的集合,不允許key重複。
Arraylist 與 LinkedList 區別
Arraylist:
優點:ArrayList是實現了基於動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存裡是連著放的)。
缺點:因為地址連續, ArrayList要移動數據,所以插入和刪除操作效率比較低。
LinkedList:
優點:LinkedList基於鏈表的數據結構,地址是任意的,所以在開闢內存空間的時候不需要等一個連續的地址,對於新增和刪除操作add和remove,LinedList比較佔優勢。LinkedList 適用於要頭尾操作或插入指定位置的場景
缺點:因為LinkedList要移動指針,所以查詢操作性能比較低。
適用場景分析:
當需要對數據進行對此訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時採用LinkedList。
ArrayList 與 Vector 區別
1
2
3
public ArrayList(int initialCapacity)//構造一個具有指定初始容量的空列表。
public ArrayList()//構造一個初始容量為10的空列表。
public ArrayList(Collection
在這裡給大家提供一個學習交流的平臺,java架構師群: 867748702
具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。
在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。
如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的可以加群。
________________________________________________________________________________________________
加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。
性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限
都是大牛帶飛 讓你少走很多的彎路的 群號是: 867748702對了 小白勿進 最好是有開發經驗
注:加群要求
1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
閱讀更多 炸了呀 的文章