Java面試題——中級(全)

来源:https://www.cnblogs.com/javazhiyin/archive/2018/04/08/java_zhiyin.html
-Advertisement-
Play Games

近幾年Java面試時常問的一些問題以及一些比較好的回答,這裡列出僅供參考,回答無固定答案,歡迎各位探討 ...


List和Set比較,各自的子類比較

 

對比一:Arraylist與LinkedList的比較

1、ArrayList是實現了基於動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高(在記憶體里是連著放的)。

2、因為地址連續, ArrayList要移動數據,所以插入和刪除操作效率比較低。   

3、LinkedList基於鏈表的數據結構,地址是任意的,所以在開闢記憶體空間的時候不需要等一個連續的地址,對於新增和刪除操作add和remove,LinedList比較占優勢。

4、因為LinkedList要移動指針,所以查詢操作性能比較低。

 

適用場景分析:

當需要對數據進行對此訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時採用LinkedList。

 

對比二:ArrayList與Vector的比較

1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由於線程的同步必然要影響性能。因此,ArrayList的性能比Vector好。 
2、當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣。ArrayList就有利於節約記憶體空間。

3、大多數情況不使用Vector,因為性能不好,但是它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性。

4、Vector可以設置增長因數,而ArrayList不可以。

 

適用場景分析:

1、Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程非同步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。

2、如果集合中的元素的數目大於目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有一定的優勢。

 

對比三:HashSet與TreeSet的比較

 

1.TreeSet 是二叉樹實現的,Treeset中的數據是自動排好序的,不允許放入null值 。

2.HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重覆,就如資料庫中唯一約束 。

3.HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重覆。但是同一個類的對象可以放入不同的實例。

 

適用場景分析:

HashSet是基於Hash演算法實現的,其性能通常都優於TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。

 


 

HashMap和ConcurrentHashMap的區別

1、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。

2、ConcurrentHashMap採用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的數組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那麼在插入元素的時候就需要先找到應該插入到哪一個片段segment,然後再在這個片段上面進行插入,而且這裡還需要獲取segment鎖。

3、ConcurrentHashMap讓鎖的粒度更精細一些,併發性能更好。

 

至於兩者的底層實現,你如果想通過一篇文章就理解了,那就too young了,好好找些博文+看源碼去吧。

 


 

HashTable和ConcurrentHashMap的區別

它們都可以用於多線程的環境,但是當Hashtable的大小增加到一定的時候,性能會急劇下降,因為迭代時需要被鎖定很長的時間。因為ConcurrentHashMap引入了分割(segmentation),不論它變得多麼大,僅僅需要鎖定map的某個部分,而其它的線程不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。

 


 

String,StringBuffer和StringBuilder的區別

1、運行速度,或者說是執行速度,在這方面運行速度快慢為:StringBuilder > StringBuffer > String。

2、線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。

 

適用場景分析:

String:適用於少量的字元串操作的情況

StringBuilder:適用於單線程下在字元緩衝區進行大量操作的情況

StringBuffer:適用多線程下在字元緩衝區進行大量操作的情況

 


 

wait和sleep的區別

1、sleep()方法是屬於Thread類中的,而wait()方法,則是屬於Object類中的。

2、sleep()方法導致了程式暫停執行指定的時間,讓出cpu給其他線程,但是他的監控狀態依然保持著,當指定的時間到了又會自動恢復運行狀態。所以在調用sleep()方法的過程中,線程不會釋放對象鎖。

3、調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法後本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態。

 


 

 

JVM的記憶體結構

根據 JVM 規範,JVM 記憶體共分為虛擬機棧、堆、方法區、程式計數器、本地方法棧五個部分。

 

1、Java虛擬機棧:

線程私有;每個方法在執行的時候會創建一個棧幀,存儲了局部變數表,操作數棧,動態連接,方法返回地址等;每個方法從調用到執行完畢,對應一個棧幀在虛擬機棧中的入棧和出棧。

 

2、堆:

線程共用;被所有線程共用的一塊記憶體區域,在虛擬機啟動時創建,用於存放對象實例。

 

3、方法區:

線程共用;被所有線程共用的一塊記憶體區域;用於存儲已被虛擬機載入的類信息,常量,靜態變數等。

 

4、程式計數器:

線程私有;是當前線程所執行的位元組碼的行號指示器,每條線程都要有一個獨立的程式計數器,這類記憶體也稱為“線程私有”的記憶體。

 

5、本地方法棧:

線程私有;主要為虛擬機使用到的Native方法服務。

 


 

強引用,軟引用和弱引用的區別

強引用:

只有這個引用被釋放之後,對象才會被釋放掉,只要引用存在,垃圾回收器永遠不會回收,這是最常見的New出來的對象。

 

軟引用:

記憶體溢出之前通過代碼回收的引用。軟引用主要用戶實現類似緩存的功能,在記憶體足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當記憶體不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。

 

弱引用:

第二次垃圾回收時回收的引用,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。弱引用主要用於監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。

 


 

數組在記憶體中如何分配

1、簡單的值類型的數組,每個數組成員是一個引用(指針),引用到棧上的空間(因為值類型變數的記憶體分配在棧上)

2、引用類型,類類型的數組,每個數組成員仍是一個引用(指針),引用到堆上的空間(因為類的實例的記憶體分配在堆上)

 


 

springmvc的核心是什麼,請求的流程是怎麼處理的,控制反轉怎麼實現的

核心:

控制反轉和麵向切麵

 

請求處理流程:

1、首先用戶發送請求到前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委托給它,即以前的控制器的控制邏輯部分;

2、頁面控制器接收到請求後,進行功能處理,首先需要收集和綁定請求參數到一個對象,併進行驗證,然後將命令對象委托給業務對象進行處理;處理完畢後返回一個ModelAndView(模型數據和邏輯視圖名);

3、前端控制器收回控制權,然後根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;

4、前端控制器再次收回控制權,將響應返回給用戶。

 

控制反轉如何實現:

我們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。

spring中預設的bean為單實例模式,通過bean的class引用反射機制可以創建這個實例。

因此,spring框架通過反射替我們創建好了實例並且替我們維護他們。

A需要引用B類,spring框架就會通過xml把B實例的引用傳給了A的成員變數。

 


 

mybatis如何處理結果集

MyBatis的結果集是通過反射來實現的。並不是通過get/set方法。在實體類中無論是否定義get/set()方法,都是可以接收到的。

 

如果面試只是考你這個點的話就恭喜了。如果繼續深問流程,那就需要自己找一些源碼來閱讀了。

 


 

java的多態表現在哪裡

主要有兩種表現形式:重載和重寫

 

重載:

是發生在同一類中,具有相同的方法名,主要是看參數的個數,類型,順序不同實現方法的重載的,返回值的類型可以不同。

 

重寫:

是發生在兩個類中(父類和子類),具有相同的方法名,主要看方法中參數,個數,類型必須相同,返回值的類型必須相同。

 


 

介面有什麼用

1、通過介面可以實現不相關類的相同行為,而不需要瞭解對象所對應的類。

2、通過介面可以指明多個類需要實現的方法。

3、通過介面可以瞭解對象的交互界面,而不需瞭解對象所對應的類。

另:Java是單繼承,介面可以使其實現多繼承的功能。

 


 

說說http,https協議

 

HTTP:

是互聯網上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。

 

HTTPS:

是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

 

區別:

1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。

2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

3、http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。

4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

 


 

說說tcp/ip協議族

TCP/IP協議族是一個四層協議系統,自底而上分別是數據鏈路層、網路層、傳輸層和應用層。每一層完成不同的功能,且通過若幹協議來實現,上層協議使用下層協議提供的服務。

1、數據鏈路層負責幀數據的傳遞。

2、網路層責數據怎樣傳遞過去。

3、傳輸層負責傳輸數據的控制(準確性、安全性)

4、應用層負責數據的展示和獲取。

 


 

tcp五層網路協議

物理層:

為數據端設備提供傳送數據的通路,數據通路可以是一個物理媒體,也可以是多個物理媒體連接而成。

 

數據鏈路層:

為網路層提供數據傳送服務。

 

網路層:

路由選擇和中繼、激活,終止網路連接、在一條數據鏈路上復用多條網路連接,多採取分時復用技術 、差錯檢測與恢復、排序,流量控制、服務選擇、網路管理 。

 

傳輸層:

傳輸層是兩台電腦經過網路進行數據通信時,第一個端到端的層次,具有緩衝作用。

 

應用層:

應用層嚮應用程式提供服務

 


 

TCP與UDP的區別

1、基於連接與無連接

2、TCP要求系統資源較多,UDP較少; 

3、UDP程式結構較簡單 

4、流模式(TCP)與數據報模式(UDP); 

5、TCP保證數據正確性,UDP可能丟包 

6、TCP保證數據順序,UDP不保證 

 


 

cookie和session的區別,分散式環境怎麼保存用戶狀態

1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE併進行COOKIE欺騙,考慮到安全應當使用session。

3、session會在一定時間內保存在伺服器上。當訪問增多,會比較占用你伺服器的性能,考慮到減輕伺服器性能方面,應當使用COOKIE。

4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

 

分散式環境下的session(舉例兩種):

 

伺服器session複製

原理:任何一個伺服器上的session發生改變(增刪改),該節點會把這個 session的所有內容序列化,然後廣播給所有其它節點,不管其他伺服器需不需要session,以此來保證Session同步。

優點:可容錯,各個伺服器間session能夠實時響應。

缺點:會對網路負荷造成一定壓力,如果session量大的話可能會造成網路堵塞,拖慢伺服器性能。

 

session共用機制

使用分散式緩存方案比如memcached、redis,但是要求Memcached或Redis必須是集群。

 


 

 

GIT和SVN的區別

1、GIT是分散式的,SVN不是。

2、GIT把內容按元數據方式存儲,而SVN是按文件。

3、GIT分支和SVN的分支不同。

4、GIT沒有一個全局的版本號,而SVN有。

5、GIT的內容完整性要優於SVN。

(一般問會不會用,知道這些區別貌似也沒卵用)

 

 


 

請寫一段棧溢出、堆溢出的代碼

遞歸調用可以導致棧溢出
不斷創建對象可以導致堆溢出

 

代碼如下:

 

public class Test {  
 
   public void testHeap(){  
       for(;;){  
             ArrayList list = new ArrayList (2000);  
         }  
   }  
   int num=1;  
   public void testStack(){  
       num++;  
       this.testStack();  
    }  
     
   public static void main(String[] args){  
       Test  t  = new Test ();  
       t.testHeap();  
       t.testStack();     
   }  
}

 


 

 

BIO、NIO和AIO的區別

 

Java BIO : 同步並阻塞,伺服器實現模式為一個連接一個線程,即客戶端有連接請求時伺服器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

 

Java NIO : 同步非阻塞,伺服器實現模式為一個請求一個線程,即客戶端發送的連接請求都會註冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

 

Java AIO: 非同步非阻塞,伺服器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知伺服器應用去啟動線程進行處理。

 

NIO比BIO的改善之處是把一些無效的連接擋在了啟動線程之前,減少了這部分資源的浪費(因為我們都知道每創建一個線程,就要為這個線程分配一定的記憶體空間)

 

AIO比NIO的進一步改善之處是將一些暫時可能無效的請求擋在了啟動線程之前,比如在NIO的處理方式中,當一個請求來的話,開啟線程進行處理,但這個請求所需要的資源還沒有就緒,此時必須等待後端的應用資源,這時線程就被阻塞了。

 

適用場景分析:

 BIO方式適用於連接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發局限於應用中,JDK1.4以前的唯一選擇,但程式直觀簡單易理解,如之前在Apache中使用。

 

 NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天伺服器,併發局限於應用中,編程比較複雜,JDK1.4開始支持,如在 Nginx,Netty中使用。

 

 AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊伺服器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持,在成長中,Netty曾經使用過,後來放棄。

 


 

java中常說的堆和棧,分別是什麼數據結構;另外,為什麼要分為堆和棧來存儲數據

 

棧是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。

 

堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意的。

 

為什麼要劃分堆和棧

1、從軟體設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰。

 

2、堆與棧的分離,使得堆中的內容可以被多個棧共用。一方面這種共用提供了一種有效的數據交互方式(如:共用記憶體),另一方面,堆中的共用常量和緩存可以被所有棧訪問,節省了空間。

 

3、棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的劃分。由於棧只能向上增長,因此就會限制住棧存儲內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。

 

4、體現了Java面向對象這一核心特點(也可以繼續說一些自己的理解)

 


 

為什麼要用線程池

 

那先要明白什麼是線程池

線程池是指在初始化一個多線程應用程式過程中創建一個線程集合,然後在需要執行新的任務時重用這些線程而不是新建一個線程。

 

使用線程池的好處

1、線程池改進了一個應用程式的響應時間。由於線程池中的線程已經準備好且等待被分配任務,應用程式可以直接拿來使用而不用新建一個線程。

 

2、線程池節省了CLR 為每個短生存周期任務創建一個完整的線程的開銷並可以在任務完成後回收資源。

 

3、線程池根據當前在系統中運行的進程來優化線程時間片。

 

4、線程池允許我們開啟多個任務而不用為每個線程設置屬性。

 

5、線程池允許我們為正在執行的任務的程式參數傳遞一個包含狀態信息的對象引用。

 

6、線程池可以用來解決處理一個特定請求最大線程數量限制問題。

 


 

msyql優化經驗

 

1、對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

 

2、應儘量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進行全表掃描。

 

3、儘量使用數字型欄位,若只含數值信息的欄位儘量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。

 

4、任何地方都不要使用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位。

 

5、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。諸如此類,等等等等......

 


 

悲觀鎖和樂觀鎖的區別,怎麼實現

 

悲觀鎖:一段執行邏輯加上悲觀鎖,不同線程同時執行時,只能有一個線程執行,其他的線程在入口處等待,直到鎖被釋放。

 

樂觀鎖:一段執行邏輯加上樂觀鎖,不同線程同時執行時,可以同時進入執行,在最後更新數據的時候要檢查這些數據是否被其他線程修改了(版本和執行初是否相同),沒有修改則進行更新,否則放棄本次操作。

 

悲觀鎖的實現:

//0.開始事務
begin;/begin work;/start transaction; (三者選一就可以)
//1.查詢出商品信息
select status from t_goods where id=1 for update;
//2.根據商品信息生成訂單
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status為2
update t_goods set status=2;
//4.提交事務
commit;/commit work;

  

樂觀鎖的實現:

1.查詢出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根據商品信息生成訂單
3.修改商品status為2
update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. getComputedStyle(屬性多) 獲取當前元素所有最終使用的CSS屬性值,返回一個只讀的對象 style (屬性少)可寫 2.currentStyle 與getComputedStyle 作用一樣,只不過瀏覽器適用不一樣 獲取css屬性值 : 1.鍵值對 2.getProperVal ...
  • 首先提供一個知識點外資源: 線上編程:無需編程環境: https://codepen.io/pen 添加jQuery庫: Settings-->JavaScript-->quick-add-->jQuery jQuery: 基於js研發的封裝庫:可以屏蔽之前書寫js代碼考慮瀏覽器相容性的問題。問題交 ...
  • 最近看《node即學即用》,做點筆記~~ 核心API 1.【Events】 **瀏覽器中的事件模型是從DOM中來的 **DOM是基於用戶交互的用戶驅動型事件模型,有著一組與樹狀結構對應的介面元素 **當用戶與介面的某個特定部分交互時,對應有一個事件和一個相關的對象 **操作對象是在一棵樹上,故模型包 ...
  • jQuery寫法比Js簡單,但不能不學Js,不知道博客園有沒有喜歡寫jQuery筆記的園友? 如果有jQuery的各種技巧,解答,分享評論無妨? 代碼窩總結的筆記如下,希望對你有所幫助 JQuery滑動置頂onclick=" $('body,html').animate({scrollTop:0}, ...
  • 所有的悲傷,總會留下一絲歡樂的線索,所有的遺憾,總會留下一處完美的角落,我在冰峰的深海,尋找希望的缺口,卻在驚醒時,瞥見絕美的陽光! ——幾米 本文為讀 lodash 源碼的第十八篇,後續文章會更新到這個倉庫中,歡迎 star: "pocket lodash" gitbook也會同步倉庫的更新,gi ...
  • 一般的應用正式環境中都不止一臺伺服器(也就是說是集群的),那麼如果只是簡單的將數據預載入到記憶體,那麼就會有數據不同步的現象。 (更新了其中一臺JVM,另一臺JVM並不會收到通知從而保持數據同步)。 這時候就需要用到cache server了。 目前流行的cache server有很多種,像redis ...
  • 軟體過程模型 可行性分析與項目開發計劃:可行性分析報告、項目開發計劃 需求分析:軟體需求說明書 概要設計:概要設計說明書 詳細設計:詳細設計文檔 編碼:源程式清單 測試:軟體測試計劃、測試用例、報告 維護:更正性維護、適應性維護、預防性維護、完善性維護(就(糾)是(適)魚(預)丸(完)) 能力成熟度... ...
  • 目的 之前在github上找了一個開源的項目,改了改緩存的擴展,讓其支持在緩存註解上控制緩存失效時間以及多長時間主動在後臺刷新緩存以防止緩存失效( Spring Cache擴展:註解失效時間+主動刷新緩存 )。示意圖如下: 那篇文章存在兩個問題: 所有的配置是建立在修改緩存容器的名稱基礎上,與傳統緩 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...