Java知識點Tip1
xuet
面向對象
面向對象的優點複用、維護、擴展起來比較方便, Java有這樣的特點源於它的三個特性繼承、封裝、多態。
- 繼承:當我們想繼承就是一個類通過子類使用extends關鍵字,繼承全部父類的屬性、方法,不能選擇性繼承。子類可以擁有自己的屬性、方法,同時子類可以對父類的方法進行重寫。繼承就是一種is a 的關係。java中所有的類都直接間接繼承了object類(equals、toString、getClass等)
- 封裝:把一個對象的屬性私有化,然後給外界提供可以訪問的接口。通過訪問權限修飾符(private 、default、protected、public)來控制訪問權限,然後通過getter、setter、toString、構造函數等來實現與外界數據傳輸。可以更好的減少耦合、隱藏信息,實現細節,更加的安全。
- 多態:父類的引用指向子類的對象。重寫、接口、抽象類抽象方法就是常用的多態。
平臺無關性
我們平時寫的.java文件,通過JDK中的javac的編譯,編譯成**.class**(JVM可以理解的字節碼文件),然後通過JVM,變成機器可以執行的機器碼。所以字節碼和不同系統的JVM實現了Java的平臺無關性。
JDK JRE的區別
- JDK包含JRE 同時還有編譯器javac 等。
- JRE是java的運行環境。
Java和C++的區別
- java有內存管理(GC)機制,不需要手動釋放無用內存。
- C++有指針,java中沒有,java中有引用。
- java都是單繼承 ,C++可以多重繼承。
- C++比java執行快,但是java可以跨平臺。
重寫和重載
- 重寫就是子類對父類的方法重新編寫,所有的東西相同,返回值、異常小於等於父類。訪問權限修飾符大於等於父類。
- 重載就是方法名相同,參數類型、個數、順序、方法返回值、訪問權限修飾符可以不同,它是類的多態性的一種表現,一個類中有多個相同名字的方法,調用方法的時候根據傳的參數決定調用到哪個方法。
String、StringBuffer、StringBuilder區別
-
String 有final修飾所以是不可變的。
private final char value[];
-
StringBuffer是線程安全的。StringBuilder是線程不安全的。
-
String有大小限制,單線程大量數據用StringBuilder。
裝箱和拆箱
-
裝箱:基本數據類型(byte、boolean、char、float、int、short、doule、long)用對應引用數據類型包裝起來(Java中的引用數據類型包括類、接口、數組)
Integer a = 127; Integer a = Integer.valueOf(127);//裝箱操作等同於 調用了.valueOf方法
這裏我們要注意裝箱後的範圍 Integer.valueOf 我們打開方法可以看到 [-128,127]
注意,Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現是類似的。
Double、Float的valueOf方法的實現是類似的。
-
拆箱:將包裝的數據類型轉化成基本數據類型
-
我們可以通過裝箱來獲取到入參的數據類型 比如傳入 A、C兩個類型的參數
private void DisposeFunc( object O ) { switch( o.getType().ToString() ) { case "A": //處理A; case "C": //處理C; } }
在一個靜態方法中調用一個非靜態成員非法
靜態方法可以不通過對象調用,因此在靜態方法裏,也不能調用其他非靜態變量,也不可以訪問其他非靜態成員。
接口(Interface)和抽象類(Abstract Class)的區別
- 抽象類可以有構造方法,接口中不能有構造方法且只有final、static修飾的變量。
- 抽象類和接口不能被實例化。
- 一個類只能實現一個抽象類,但是能實現多個接口。
成員變量和局部變量的區別
- 成員變量在類中方法外面而局部變量在代碼塊或者方法內。
- 成員變量在堆中,局部變量在棧中。
- 成員變量隨對象創建存在,消失消失。局部變量在代碼塊或方法執行存在,執行完消失。
- 成員變量會有初始默認值,局部變量需要賦值。
==和equals
-
==比較的是兩個對象的地址是否相等(基本數據類型比較的是值,引用數據類型比較的是地址)
-
equals 它的作用也是判斷兩個對象是否相等。
情況1:類沒有覆蓋equals方法。這時候和== 方法是一樣的。
情況2:類覆蓋了equals方法。我們常用的String的.equals方法,用來比較它們的內容是否相等。
hashCode和equals
創建對象往往這兩個方法和toString() 這三個方法已經成了必寫的東西。hashCode的作用之一,我們進行HashSet的插入的時候檢查重複的方法是先計算插入對象的hashCode的值來決定加入位置,同時與該位置的值的hashCode進行比較,如果相同,會調用equals,這個時候如果相同就存不進去,如果不同,就重新散列到其他位置。
- hashCode的目的是獲取散列碼。它在散列表中才有用(HashMap、HashSet)
- 日常比較兩個類直接用equal就可以。
線程、進程、程序之間關係
- 一個進程在執行過程中會產生多個線程(初始、運行、阻塞、等待、超時等待、終止六個狀態)
- 進程是程序的一次執行過程,是系統運行的基本單位。
- 程序是含有指令和數據的文件,即靜態的代碼。
final關鍵字
-
final變量:基礎數據類型,初始化之後變量不能被更改。引用數據類型,不能指向其他對象
-
final方法:把方法鎖定,以防繼承之後被修改。類中的private隱式的制定爲final,提高效率。
-
final類:這個類不能被繼承,並且它的方法都會被隱式的制定爲final方法。
異常的學習
Mybatis中#和$的區別
#在sql傳參的部分顯示的是字符串,而$顯示的是傳入的值
使用#有效的防止sql注入的風險。
Java知識點Tip2
IOC AOP 容器 DI
容器:Spring 框架是一個容器可以管理項目中的所有對象
IOC:控制反轉,指得是將對象的創建權反轉給Spring。作用是實現了程序的解耦合
DI:依賴注入,需要有IOC環境,在Spring創建Bean對象時,動態的將依賴對象注入到Bean對象中去。依賴注入最大的好處就是解耦合。
AOP:面向切面編程。簡單來講就是將縱向重複的代碼,橫向抽取出來。Servlet中亂碼問題,都需要請求之前request.setCharacterEncoding(“UTF-8”),現在只需要加一層Filter中就可以解決全部亂碼。攔截器也是
SpringMVC的執行流程
- 用戶發送請求至前端控制器DispatcherServlet
- DispatcherServlet收到請求調用處理器映射器HandlerMapping。
- 處理器映射器根據請求url找到具體的處理器,生成處理器執行鏈HandlerExecutionChain(包括處理器對象和處理器攔截器)一併返回給DispatcherServlet。
- DispatcherServlet根據處理器Handler獲取處理器適配器HandlerAdapter執行HandlerAdapter處理一系列的操作,如:參數封裝,數據格式轉換,數據驗證等操作
- 執行處理器Handler(Controller,也叫頁面控制器)。
- Handler執行完成返回ModelAndView
- HandlerAdapter將Handler執行結果ModelAndView返回到DispatcherServlet
- DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- ViewReslover解析後返回具體View
- DispatcherServlet對View進行渲染視圖(即將模型數據model填充至視圖中)
- DispatcherServlet響應用戶。
SpringMVC組件說明
- DispatcherServlet:前端控制器。用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性,系統擴展性提高。由框架實現
- HandlerMapping:處理器映射器。HandlerMapping負責根據用戶請求的url找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,根據一定的規則去查找,例如:xml配置方式,實現接口方式,註解方式等。由框架實現
- Handler:處理器。Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。由於Handler涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發Handler。
- HandlAdapter:處理器適配器。通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。由框架實現。
- ModelAndView是springmvc的封裝對象,將model和view封裝在一起。
- ViewResolver:視圖解析器。ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。
- View:是springmvc的封裝對象,是一個接口, springmvc框架提供了很多的View視圖類型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情況下需要通過頁面標籤或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
MyBatis工作原理
關於MyBatis的工作原理,網上的文章是汗牛充棟,但是站長覺得,要結合JDBC來理解MyBatis的工作原理往往才能更透徹。我們知道,JDBC有四個核心對象:
- DriverManager,用於註冊數據庫連接
- Connection,與數據庫連接對象
- Statement/PrepareStatement,操作數據庫SQL語句的對象
- ResultSet,結果集或一張虛擬表
而MyBatis也有四大核心對象:
- SqlSession對象,該對象中包含了執行SQL語句的所有方法。類似於JDBC裏面的Connection 。(在JDBC中,Connection不直接執行SQL方法,而是利用Statement或者PrepareStatement來執行方法。而在MyBatis中,SqlSession對象包含了執行SQL語句的所有方法。但是它是委託Executor執行的)從某種意義上來看,MyBatis裏面的SqlSession類似於JDBC中的Connection,他們都是委託給其他類去執行
- Executor接口,它將根據SqlSession傳遞的參數動態地生成需要執行的SQL語句,同時負責查詢緩存的維護。類似於JDBC裏面的Statement/PrepareStatement。
- MappedStatement對象,該對象是對映射SQL的封裝,用於存儲要映射的SQL語句的id、參數等信息。
- ResultHandler對象,用於對返回的結果進行處理,最終得到自己想要的數據格式或類型。可以自定義返回類型。
數據庫優化
-
根據主鍵進行查詢
-
儘量單表查詢/不關聯查詢
-
能用in 不用not in 儘量不用in not in 連續的用between 不用in 了
SELECT * FROM t_order1 WHERE customer IN (SELECT customer FROM t_order2)
子查詢可以用exist代替:
SELECT * FROM t_order1 WHERE EXISTS (SELECT * FROM t_order2 WHERE t1.customer = t2.customer)
-
不用* 、or
-
儘量不在where子句中進行表達式操作,儘量不要進行null判斷 where 1=1
-
創建索引create index 索引名稱 on 表名稱,避免索引進行計算
-
like 百分號儘量別前面後面都加 數據庫會放棄索引全表掃描
-
redis 提前緩存
-
一句寫出來儘量不多次連接數據庫
-
使用表的別名,減少語法錯誤解析時間
-
union all 替換union with as 臨時表
-
分庫分表