java日常小知識記錄--待更

**、private修飾得方法可以通過反射得方式獲取訪問權限,那其意義是什麼?
首先private作爲類,方法,變量得訪問權限,同public,protect一樣,針對面向對象得一種訪問權限修飾。也就是我們常說的封裝概念。它並不是針對安全性的,絕對的不能訪問得。下面上自己寫的代碼例子:
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

**、反射中得getFields與getDeclareFields方法得區別:
getFields只能訪問public字段,如果繼承了某個父類,則包括父類得public方法,而getDeclareFields返回當前類得所有修飾(private,protect,public)得字段。但是不包括父類得任何字段。
同理
訪問方法
getMethods
getDeclaredMethods
訪問內部類
getClasses
getDeclaredClasses
訪問構造方法
getConstructors
getDeclaredConstructors

**、java類得初始化順序
初始化順序:實現類:靜態變量–>靜態方法 -->普通變量–>普通方法–>構造方法
接口-父類-子類 :接口靜態變量-父類靜態變量-父類靜態方法-子類靜態變量-子類靜態方法-父類普通-父類構造-子類普通-子類構造。

**、jvm中得方法區與永久代得理解
方法區是共享區域,儲存已經被虛擬機加載得類信息,常量,靜態常量,即時編譯後得代碼信息等。
1 持久代也就是你說的永久代,翻譯不同 這個區域會存儲包括類定義、結構、字段、方法(數據及代碼)以及常量在內的類相關數據。它可以通過-XX:PermSize及-XX:MaxPermSize來進行調節。如果它的空間用完了,會導致java.lang.OutOfMemoryError: PermGenspace的異常。而JDK8開始,持久代已經被徹底刪除了,取代它的是另一個內存區域也被稱爲元空間。
2 存放數據
方法區存儲的是每個class的信息:
1.類加載器引用(classLoader)
2.運行時常量池
所有常量、字段引用、方法引用、屬性
3.字段數據
每個方法的名字、類型(如類的全路徑名、類型或接口) 、修飾符(如public、abstract、final)、屬性
4.方法數據
每個方法的名字、返回類型、參數類型(按順序)、修飾符、屬性
5.方法代碼
每個方法的字節碼、操作數棧大小、局部變量大小、局部變量表、異常表和每個異常處理的開始位置、結 束位置、代碼處理在程序計數器中的偏移地址、被捕獲的異常類的常量池索引

**、通過棧(jvm虛擬機棧中棧幀本地變量表所儲存得引用地址)上得reference來訪問內存中對象得兩種方式
1、通過句柄池間接訪問實例數據(棧中得引用地址爲句柄池地址)
jvm會在java堆中開闢一部分內存用來當作句柄池,裏面包括對象實例得地址與對象在方法區中得地址兩部分內容
2、通過指針直接訪問(實例數據得直接地址)
直接通過地址訪問到實例數據對象。
區別:
當對象是易回收,容易發生GC時選擇句柄池訪問會好點。當是常用得對象,經常被訪問時,用指針直接訪問得方式比較好。
備註:hotspot使用的是指針直接訪問得方式。

**、class.forname()與classloader之間得區別
classs.forName()其內部也是調用classLoader對類進行加載得,不同點在於forName中會調用一個forName方法,方法中有一個boolean參數,如果爲ture則會對類加載並進行初始化(初始化靜態方法, 靜態變量等)。而classLoader只對類進行加載。
舉例:spring中的ioc容易,就是採用的classLoader進行類加載得(雙親委派模式-bootstrapclassLoader(啓動類加載器,加載指定路徑下得jar,類庫),Extendion ClassLoader(擴展類加載器,加載環境變量下指定路徑得類庫),applicationClassLoader,應用類加載器,加載用戶指定路徑下得類庫,平時編寫的代碼採用的就是這個)。jdbc採用得是class.forName()方法對類加載(jdbc中driver需要向driverManage註冊自己,而driverManage在類中是靜態得,需要進行初始化,完成註冊。)
補充:自定義加載器,需要重寫classLoader中的findclass方法,並使用define最後生成class對象。
在這裏插入圖片描述 **、java中的socket
socket是針對tcp協議進行得一次封裝,是操作系統抽象出來的一個概念,直接可在上層應用中進行編程。
socket可以理解爲:協議 客戶端IP 客戶端port 服務端ip 服務端port
port是爲了區別不同得進程之間建立socket連接得。
socket編程:
客戶端: 系統可以自動分配port和自動獲取ip
clientfd = socket{…} connect(clientfd,服務器Ip,服務器port,。。。。。) ; send(clientfd,數據); receiver(clientfd,…); close();
服務器端: 1、需要監聽客戶端發送得請求。2、根據客戶端發送得多個請求,進行socket區分。
listenfd = socket{…}; bind(listenfd,本機得IP和端口,。。。) ; listen(listenfd,…) ;
while(true){
connfd = accept(listendfd,…);
receive(connfd,…);
send(connfd,…)
}
close();
connfd 相當於與客戶端完成了三次握手的鏈接。用戶通過此鏈接發送可靠消息。
每一個socket是通過客戶端ip客戶端port服務器端ip服務器端port加協議。當訪問服務器得同一個進程時,服務器端不需要創建新的端口。爲了區別socket可通過客戶端得ip與客戶端得port.

**、數據庫得四種隔離級別與四種特性
設定 :寫爲w鎖,讀爲r鎖 ,兩個事務,A事務,B事務
1、read uncommit 未提交讀。會出現髒讀。此時A寫獲取鎖,A事務未提交,釋放寫鎖,B獲取讀鎖,A事務回滾,B讀出來數據有問題。(讀取到未提交的數據)
2、read commit 提交讀。會出現不可重複讀。A獲取讀鎖,A事務未提交,A釋放讀鎖,B獲取寫鎖,B釋放寫鎖,B事務提交,A獲取讀鎖,A讀取數據,發現數據已經改變,提交事務。(讀取到更新或者刪除的數據)
3、repeatable read 可重複讀,會出現幻讀,A,B事務順序執行,A事務修改數據,B事務插入數據(插入的數據爲A剛修改後的數據),A發現事務並沒有修改(其實是B剛插入的數據)。(讀取到新插入的數據)
4、serializable 順序讀。A事務修改時,B事務進行了插入操作。

1、原子性:同一個事務中,對數據庫的操作要麼成功,要麼失敗。
2、一致性:一個事務前後,無論操作是否成功,數據庫都處於一個完整的狀態
3、隔離性:多個事務之間對數據庫的操作互不影響
4、持久性:一個事務的提交,那麼該操作的影響是永久的
備註:一個事務中,若滿足原子性,就滿足一致性。多個事務中,滿足原子性與隔離性,則滿足一致性。

mysql隔離級別
隔離級別爲可重複讀。會出現幻讀,通過innodb的mvcc多版本併發控制解決了該問題
事務版本號,新建一個事務時,版本號遞增
系統版本號,當前操作的版本號等於事務版本號

新增數據,該行新增版本號爲事務版本號
刪除數據,改行刪除版本號爲事務版本號

查詢時滿足條件 當前事務版本號 < 新增數據版本號 當前事務版本號 > 刪除數據版本號。

**、java中的靜態與非靜態
1、靜態(常量,方法)是在類加載時就會初始化,通過類可直接訪問。非靜態是使用時進行初始化。
2、靜態得效率比非靜態高。非靜態使用前會進行一些安全檢查, 比如判斷所屬得對象是否爲NULL。
3、靜態得生命週期高於非靜態。靜態從加載就一直保存,不論是否被使用。
4、靜態一般使用場景爲一些工具類,提供一些功能, 無需訪問非靜態方法。由此導致了無法做擴展(繼承,多態)的缺點

**、機器學習概念
1、通過一些現象,進行一些分析,得到預期的結果
2、隨着數據量越大,得到的預期結果將會越高
3、機器學習分爲三大類,有監督學習,無監督學習,半監督學習。
4、監督學習:通過一些輸入,經過一個函數計算,得到一個合適的輸出
5、無監督學習:通過一些輸入,對數據中一些東西進行關聯。
6、半監督學習:兩者結合。

**、服務器返回碼
200,訪問正常
400,語法格式問題,服務器無法理解
401 主人, 這個東西沒有授權你訪問個啥啊
403 主人, 服務器不想搭理你
404 主人,找不到啊, 看看你敲的網址對不對
500 主人, 服務器崩潰了
503 主人, 服務器可能太忙了, 你等會再試吧
301,重定向。

**、spring中得依賴注入(DI)與控制反轉(IOC)
經常聽到得詞,也是面試中經常問到得要點。以前百度看了很多,很官方,也很專業,下面用白話文得方式,以自己的理解寫一下。

衆所周知,java是面向對象編程得。在我們編程得過程中,難免會遇到一個類需要用到另外一個類得情況。類似於:
加粗樣式
上面Person這個類,需要去讀書,就需要藉助讀書類ReadBook 去創建對象,然後調用讀書得方法。我們可以說Person這個類需要(依賴)ReadBook 這個類。同理依賴Play這個類去打遊戲。
當spring還沒出世得時候,人們得寫法都是這樣得。剛開始的是時候人們寫起來很方便,也覺得不錯,但是隨着業務得複雜,發現一個類需要依賴得類太多了,每個類之間得關係也變得很亂很複雜。不得不進行代碼優化。會用到常說得工廠模式(後續具體介紹java得設計模式)
類似這樣:
在這裏插入圖片描述
簡而言之就是通過子類ReadBook 與PlayGame 繼承一個Interest父類,需要什麼就傳對應得type就可以了。這樣Person這個類只需要依賴一個Inerest這個類就行了。看起來確實依賴關係簡化了一些。但到後來,代碼還是看着太多,每個類使用都要去初始化,去構造一下,還是太麻煩。人們想着能不能通過別的方式去管理這些類得之間關係,後來出現spring通過xml文件去維護。在配置文件中去配置這些類以及類得引用,也就是我們常說的bean,類似這樣:
在這裏插入圖片描述
這樣就夠了嗎,顯然不夠,spring還需要通過xml文件解析器解析配置文件中的bean,根據bean,通過java反射,得到類的實例,再通過上面得類似工廠模式下的,調用創建實例得方法,創建需要依賴得類的實例。依賴關係通過註解即可。spring大體的思路是這樣的實現,具體的很多細節得去源碼中查看,當然,比上面說的複雜得很多。
那麼什麼叫控制反轉呢?spring還未出現之前,依賴類得時候,需要通過自己手動去實例化這個類。但是現在不一樣了,spring提供了一個ioc。就像是一個容器,所有的類都在裏面,當你需要什麼,你就和容器說一下(配置bean),我要這個,容器就會給你提供。以前由自己去創建實例,現在改爲由ioc容器管理了,控制得權限由自己變成容器了,也就叫做控制反轉。

**、spring中得aop面向切面編程
面向切面編程,簡而言之,找到切入點去編程。那在實際項目中得應用是什麼。隨着軟件產業發展,隨着業務需求得複雜化。項目中所需要的安全保障,性能,質量就得有所提高。
一個簡單的支付項目會包括以下基本模塊:用戶信息,訂單中心,支付中心,後臺管理等。這個業務模塊都必須依賴一些其他功能,比如:日誌管理,事務管理,安全管理等公共模塊。
新手程序員可能這樣寫:
在這裏插入圖片描述
功能實現了,但是整個代碼中,業務相關的代碼基本被覆蓋了,很沒有必要,有經驗的程序員就會進行改善,用到了設計模式中的模板方法,模板方法模式簡而言之就是設定一個父類,這些公用的功能在父類中去實現,業務類的代碼通過子類去繼承父類,只需重寫父類中的業務相關方法即可。類似這樣:
在這裏插入圖片描述
在這裏插入圖片描述
包括別的子類也一樣,同樣繼承這個父類,只需關心自己的業務代碼就可以了,不需要關心那些公共的功能。似乎解決了問題,但是問題又來了。如果按上述這樣寫。當有的子類不需要父類所有的方法,不是所有子類需要記錄日誌,或者性能測試等功能,這樣寫,讓每個子類業務需求去繼承,去實現一下,是不是有點浪費。父類中的那些功能順序,子類也無法去改變,只能無條件接受父類的實現。過於死板,所以需要用到另外一種設計模式。裝飾者模式。就是在模板方法上繼續向上抽象一個父類,所有的業務類與功能類都繼承他,類似如下:
在這裏插入圖片描述
當需要對應的功能,只需要對應實例化即可,類似於:
Common common = new OrderMng (new TransactionMng ());
common.excute();
如果需要加上日誌管理,接着加上就行:
Common common = new OrderMng (new TransactionMng (new LogM()));
common.excute();
順序也可以交換。
運用裝飾者模式,是不是可以看的出,業務代碼和功能代碼基本分開了。
那麼spring是通過什麼方式來完成這些的呢。和裝飾者差不多,但是優勢在於,通過維護xml文件完全將這兩者分離了。在編譯的時候,讀取aop的配置信息,將兩者維護到一起。但這是靜態態維護的,所以spring加上了通過動態代理(後續博客會詳細介紹動態代理)產生一個代理類,動態的將需要切面的代碼(公用的功能)放到代理類中。完成功能。

** java中隊列與棧中得操作
隊列Queue queue = new LinkList<>();
隊列中得操作有:
1、添加:add(),offer().當隊列滿時,add會拋出unchecked異常.offer會直接返回false.
2、查詢頭部元素:element(),peek().element會拋出異常。peek返回null;
3、刪除:remove(),poll(),移除棧頂元素,並返回。若爲空remove會拋出異常,poll()直接返回空。
棧:Stack stack = new Stack();
1、添加:push(),add().push直接添加在棧頂,返回值是參數類型。add添加在vector的尾部,返回結果是boolean類型。意思就是棧頂與vector的尾對應。
2、返回棧頂元素:peek(),pop()。都是返回棧頂元素,peek返回不彈出。pop返回,且彈出該元素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章