本系列為Java常見面試題集錦,持續(xù)更新中,包括筆試題和面試題,建議收藏慢慢看
1. while(true){}有什么用
while(true){} 是一個(gè)無限循環(huán)的語句,它的作用是讓程序在執(zhí)行到該語句時(shí)不停地循環(huán)下去,直到程序被終止或者遇到 break、return 等跳出循環(huán)的語句。
無限循環(huán)的使用場(chǎng)景比較多,例如:
實(shí)現(xiàn)多線程中的循環(huán)操作,保持線程一直在運(yùn)行;
實(shí)現(xiàn)服務(wù)器中的持續(xù)監(jiān)聽客戶端請(qǐng)求,等待客戶端連接;
實(shí)現(xiàn)游戲程序中的主循環(huán),控制游戲的運(yùn)行。
需要注意的是,在使用無限循環(huán)時(shí),需要注意控制循環(huán)體內(nèi)部的邏輯,避免出現(xiàn)死循環(huán),導(dǎo)致程序無法正常結(jié)束。通??梢酝ㄟ^添加跳出循環(huán)的條件或者使用 break、return 等語句來控制循環(huán)的結(jié)束。
2. switch語句括號(hào)中的值可不可以是null,case值可不可以是null
在Java中,switch語句括號(hào)中的值可以是null,但是case值不能是null,否則會(huì)導(dǎo)致編譯錯(cuò)誤。
如果括號(hào)中的值為null,則只有在case語句中使用null常量時(shí)才會(huì)匹配。例如:
String str = null;
switch(str) {
case null:
System.out.println("str is null");
break;
default:
System.out.println("str is not null");
}
這段代碼中,括號(hào)中的值為null,但是只有當(dāng)case語句中使用null常量時(shí)才會(huì)匹配。
3. switch語句的case和default有順序嗎
在switch
語句中,case
和 default
子句的順序是有影響的。case
和 default
子句的順序必須是先寫 case
,再寫 default
,而且在一個(gè) switch
語句塊中,case
子句的順序也是很重要的,因?yàn)?switch
語句會(huì)按照 case
子句的順序來匹配表達(dá)式的值,找到與表達(dá)式值匹配的case
子句之后就會(huì)執(zhí)行該子句后的語句,并且不會(huì)再繼續(xù)匹配其他的 case
子句。如果在所有的 case
子句中都沒有找到匹配的值,那么就會(huì)執(zhí)行 default
子句,如果沒有 default
子句,那么 switch
語句塊就不會(huì)執(zhí)行任何操作。
4. java線程同步和異步的區(qū)別
在Java中,同步和異步是指多線程并發(fā)執(zhí)行中的兩種不同的機(jī)制。
同步指的是線程之間的協(xié)作方式,即當(dāng)一個(gè)線程在執(zhí)行一個(gè)任務(wù)時(shí),其他線程必須等待該線程執(zhí)行完該任務(wù)后才能執(zhí)行同一段代碼。同步機(jī)制通常使用synchronized關(guān)鍵字或Lock對(duì)象進(jìn)行實(shí)現(xiàn),以保證多線程共享的資源同步訪問。
異步指的是線程之間的獨(dú)立執(zhí)行,即當(dāng)一個(gè)線程在執(zhí)行一個(gè)任務(wù)時(shí),其他線程不需要等待該線程完成,可以繼續(xù)執(zhí)行其他任務(wù)。異步機(jī)制通常使用多線程或回調(diào)函數(shù)進(jìn)行實(shí)現(xiàn),以提高程序的并發(fā)性和響應(yīng)能力。
在Java中,線程同步和異步的區(qū)別在于線程之間的協(xié)作方式不同,同步需要保證多個(gè)線程之間的互斥和同步,以防止共享資源出現(xiàn)沖突或數(shù)據(jù)不一致,而異步則可以充分利用多核處理器,提高程序的并發(fā)性和響應(yīng)能力。
5. java程序的基本格式
Java程序的基本格式包括三個(gè)部分:包聲明、導(dǎo)入其他類、類定義。
(1). 包聲明: 使用package
關(guān)鍵字聲明該Java文件所在的包,語法如下:
package 包名;
(2). 導(dǎo)入其他類: 使用import關(guān)鍵字導(dǎo)入需要使用的其他類,語法如下:
import 包名.類名;
如果需要導(dǎo)入整個(gè)包,則可以使用通配符*,語法如下:
import 包名.*;
(3).類定義: Java程序必須包含一個(gè)公共的類,并且該類中必須包含一個(gè)main()方法,該方法是程序執(zhí)行的入口點(diǎn)。類定義的基本語法如下:
[修飾符] class 類名 {
// 類的成員變量和方法
}
main()方法的定義如下:
public static void main(String[] args) {
// 程序代碼
}
在Java程序中,每個(gè)語句必須以分號(hào);結(jié)尾,程序的代碼必須寫在{}中。
6. byte型數(shù)據(jù)的取值范圍怎么計(jì)算
Java中的byte是有符號(hào)的8位整數(shù)類型,其取值范圍是從-128到127,可以通過以下方式計(jì)算:
由于byte是有符號(hào)的,所以它的最高位為符號(hào)位,值為1表示負(fù)數(shù),值為0表示非負(fù)數(shù)。
剩下的7位為數(shù)據(jù)位,最大值為27-1=127,最小值為-27=-128。
因此,byte型數(shù)據(jù)的取值范圍為-128到127。
7. java開發(fā)是前端還是后端
Java開發(fā)可以涉及前端和后端兩個(gè)方向,具體取決于開發(fā)人員的興趣和專業(yè)方向。在后端方向,Java常用于開發(fā)服務(wù)器端應(yīng)用程序,如Web應(yīng)用、企業(yè)應(yīng)用、移動(dòng)應(yīng)用等。在前端方向,Java可以用于開發(fā)Android應(yīng)用程序,并且也可以使用Java開發(fā)基于Web的前端應(yīng)用程序,如JavaServer Pages(JSP)等。除此之外,Java還可以用于開發(fā)各種類型的桌面應(yīng)用程序、游戲和工具等。因此,Java的應(yīng)用領(lǐng)域非常廣泛,是一門非常強(qiáng)大的編程語言。
8. while循環(huán)可以被return結(jié)束嗎
是的,while循環(huán)可以被return語句結(jié)束。當(dāng)return語句執(zhí)行時(shí),程序會(huì)立即跳出方法并返回值,同時(shí)結(jié)束while循環(huán)的執(zhí)行。
9. java中節(jié)點(diǎn)流與過濾流(處理流)的區(qū)別
Java中的I/O流可以分為節(jié)點(diǎn)流和處理流(過濾流)。節(jié)點(diǎn)流直接和數(shù)據(jù)源相連,而過濾流則是對(duì)節(jié)點(diǎn)流進(jìn)行包裝,對(duì)數(shù)據(jù)進(jìn)行處理,提高了數(shù)據(jù)的處理效率。
具體來說,節(jié)點(diǎn)流是指直接與數(shù)據(jù)源進(jìn)行交互的流,例如FileInputStream、FileOutputStream、ByteArrayInputStream等,節(jié)點(diǎn)流通常用于讀寫原始的字節(jié)流或者字符流。
而過濾流則是通過對(duì)節(jié)點(diǎn)流的包裝,在處理數(shù)據(jù)的同時(shí)進(jìn)行一些額外的功能,例如緩存、壓縮、加密等。過濾流包括BufferedInputStream、BufferedOutputStream、DataInputStream、DataOutputStream等。過濾流通過讀取節(jié)點(diǎn)流的數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行處理,并將處理后的數(shù)據(jù)輸出到下一個(gè)過濾流或者節(jié)點(diǎn)流中,從而提高了數(shù)據(jù)的處理效率。
因此,節(jié)點(diǎn)流主要是用來處理數(shù)據(jù)源,而過濾流則是對(duì)數(shù)據(jù)進(jìn)行加工處理,提高了數(shù)據(jù)的處理效率和功能。
10. 微服務(wù)開發(fā)框架優(yōu)勢(shì)與特點(diǎn)
微服務(wù)開發(fā)框架的優(yōu)勢(shì)和特點(diǎn)如下:
高度可伸縮性: 微服務(wù)框架允許單獨(dú)擴(kuò)展和部署單個(gè)服務(wù),這使得系統(tǒng)具有更高的可伸縮性和彈性。這意味著,如果某個(gè)服務(wù)需要更多的資源,可以通過增加它的實(shí)例來快速地進(jìn)行擴(kuò)展,而不會(huì)影響到整個(gè)系統(tǒng)。
獨(dú)立性: 每個(gè)微服務(wù)都是獨(dú)立的,它們之間沒有緊密的耦合關(guān)系,因此可以獨(dú)立部署、測(cè)試和維護(hù)。這樣可以使得開發(fā)和部署更加靈活,同時(shí)也可以減少整個(gè)系統(tǒng)因?yàn)槟硞€(gè)服務(wù)發(fā)生故障而導(dǎo)致整個(gè)系統(tǒng)宕機(jī)的風(fēng)險(xiǎn)。
技術(shù)多樣性: 微服務(wù)框架可以使用不同的編程語言和技術(shù)棧來構(gòu)建不同的服務(wù),因此可以選擇最適合服務(wù)的技術(shù)。這樣可以讓開發(fā)人員更加專注于服務(wù)的邏輯和功能,而不用擔(dān)心技術(shù)棧的限制。
可維護(hù)性: 微服務(wù)框架允許系統(tǒng)的不同部分獨(dú)立地進(jìn)行開發(fā)、測(cè)試、部署和維護(hù),因此可以更快地對(duì)系統(tǒng)進(jìn)行修改和更新,而不會(huì)影響到整個(gè)系統(tǒng)。這樣可以提高系統(tǒng)的可維護(hù)性和可靠性。
高度可組合性: 微服務(wù)框架允許將不同的服務(wù)組合起來,從而構(gòu)建出一個(gè)復(fù)雜的系統(tǒng)。這些服務(wù)可以被任意組合,從而形成一個(gè)新的系統(tǒng),這樣可以大大提高系統(tǒng)的靈活性和可擴(kuò)展性。
總之,微服務(wù)框架的優(yōu)勢(shì)在于其高度可伸縮性、獨(dú)立性、技術(shù)多樣性、可維護(hù)性和高度可組合性,這些特點(diǎn)可以讓開發(fā)人員更加專注于服務(wù)的邏輯和功能,從而提高開發(fā)效率和系統(tǒng)的可靠性。
11. 為什么用idea
使用IDEA的好處有很多:
提高開發(fā)效率:IDEA提供了很多智能化的代碼編寫、自動(dòng)補(bǔ)全、代碼重構(gòu)、調(diào)試等功能,可以大大提高開發(fā)效率。
更好的代碼質(zhì)量:IDEA支持代碼檢查、重構(gòu)、優(yōu)化等功能,有助于提高代碼質(zhì)量和可維護(hù)性。
豐富的插件支持:IDEA支持眾多插件,可以擴(kuò)展IDE的功能,滿足不同開發(fā)需求。
兼容性好:IDEA對(duì)各種開發(fā)技術(shù)棧提供了支持,包括Java、Android、Web、數(shù)據(jù)庫(kù)、Spring等,可以滿足不同的開發(fā)需求。
跨平臺(tái):IDEA可以運(yùn)行在Windows、Linux、Mac等多個(gè)操作系統(tǒng)上,可以滿足不同開發(fā)者的需求。
綜上所述,使用IDEA可以提高開發(fā)效率、提高代碼質(zhì)量、擴(kuò)展IDE功能、支持各種開發(fā)技術(shù)棧、跨平臺(tái)等。
12. java中字符串的截取和分隔
Java中字符串的截取和分隔可以通過以下方法實(shí)現(xiàn):
(1)、字符串截取 Java中字符串截取可以使用substring()方法,該方法有兩個(gè)重載方法:
substring(int beginIndex): 從指定位置開始截取到字符串結(jié)尾。
substring(int beginIndex, int endIndex): 從指定位置開始截取到指定位置結(jié)束。
例如,可以使用以下代碼從字符串中截取一部分:
String str = "Hello World";
String substr1 = str.substring(6); // 截取從第7個(gè)字符開始到結(jié)尾
String substr2 = str.substring(0, 5); // 截取從第1個(gè)字符開始到第6個(gè)字符
(2)、字符串分隔 Java中字符串分隔可以使用split()方法,該方法將字符串按照指定的分隔符進(jìn)行分割,并返回一個(gè)字符串?dāng)?shù)組。
例如,可以使用以下代碼從字符串中分隔出多個(gè)子字符串:
String str = "Hello,World,Java";
String[] substrs = str.split(","); // 使用逗號(hào)分隔字符串
以上就是Java中字符串的截取和分隔的實(shí)現(xiàn)方法。
13. 微服務(wù)架構(gòu)與單體架構(gòu)的優(yōu)缺點(diǎn)
微服務(wù)架構(gòu)和單體架構(gòu)都是常見的軟件架構(gòu)模式,它們各自有自己的優(yōu)缺點(diǎn)。
單體架構(gòu)的優(yōu)點(diǎn)包括:
易于開發(fā)和維護(hù):?jiǎn)误w應(yīng)用程序通常比較簡(jiǎn)單,因此易于開發(fā)和維護(hù)。
易于部署:?jiǎn)误w應(yīng)用程序可以打包為一個(gè)獨(dú)立的應(yīng)用程序,易于部署和運(yùn)維。
性能好:?jiǎn)误w應(yīng)用程序通常比較簡(jiǎn)單,因此具有較好的性能。
單體架構(gòu)的缺點(diǎn)包括:
可擴(kuò)展性差: 單體應(yīng)用程序通常難以水平擴(kuò)展,因此很難處理高流量或大規(guī)模用戶的應(yīng)用程序。
技術(shù)棧受限: 單體應(yīng)用程序通常使用同一種技術(shù)棧,難以使用其他技術(shù)棧的優(yōu)點(diǎn)。
難以調(diào)試: 當(dāng)應(yīng)用程序出現(xiàn)故障時(shí),由于單體應(yīng)用程序較大,因此很難確定故障出現(xiàn)的位置。
微服務(wù)架構(gòu)的優(yōu)點(diǎn)包括:
可擴(kuò)展性好: 微服務(wù)可以水平擴(kuò)展,因此能夠處理高流量或大規(guī)模用戶的應(yīng)用程序。
技術(shù)棧靈活: 不同的微服務(wù)可以使用不同的技術(shù)棧,因此能夠使用更加適合的技術(shù)棧來實(shí)現(xiàn)不同的功能。
容錯(cuò)性好: 由于微服務(wù)是分布式的,因此可以設(shè)計(jì)容錯(cuò)機(jī)制來保證系統(tǒng)的可用性。
微服務(wù)架構(gòu)的缺點(diǎn)包括:
開發(fā)和維護(hù)成本高: 微服務(wù)的數(shù)量較多,因此開發(fā)和維護(hù)的成本較高。
部署和運(yùn)維復(fù)雜: 由于微服務(wù)是分布式的,因此部署和運(yùn)維的成本較高。
性能問題: 由于微服務(wù)需要通過網(wǎng)絡(luò)進(jìn)行通信,因此會(huì)帶來一定的性能問題。
14. 微服務(wù)架構(gòu)與單體架構(gòu)的區(qū)別
微服務(wù)架構(gòu)和單體架構(gòu)是兩種不同的軟件架構(gòu)方式。
單體架構(gòu)是一種傳統(tǒng)的軟件架構(gòu),它將所有的功能模塊打包到一個(gè)獨(dú)立的應(yīng)用程序中。在單體架構(gòu)中,所有的代碼、業(yè)務(wù)邏輯、數(shù)據(jù)庫(kù)模型等都在同一個(gè)應(yīng)用中。單體架構(gòu)的優(yōu)點(diǎn)是開發(fā)速度快、易于部署和維護(hù),但當(dāng)應(yīng)用程序變得越來越復(fù)雜時(shí),會(huì)變得難以維護(hù)和擴(kuò)展。
相比之下,微服務(wù)架構(gòu)是一種更加靈活和可擴(kuò)展的架構(gòu)方式。它將應(yīng)用程序拆分為多個(gè)服務(wù),每個(gè)服務(wù)都可以獨(dú)立部署、擴(kuò)展和維護(hù)。每個(gè)服務(wù)都是一個(gè)小型的、獨(dú)立的應(yīng)用程序,可以使用不同的編程語言、技術(shù)棧和數(shù)據(jù)庫(kù)。微服務(wù)架構(gòu)的優(yōu)點(diǎn)是易于擴(kuò)展、靈活、可靠性高,缺點(diǎn)是開發(fā)和部署的復(fù)雜性較高。
在微服務(wù)架構(gòu)中,服務(wù)之間通常采用RESTful API進(jìn)行通信。每個(gè)服務(wù)都可以獨(dú)立地?cái)U(kuò)展和部署,因此可以更好地適應(yīng)快速變化的業(yè)務(wù)需求。但是,與單體架構(gòu)相比,微服務(wù)架構(gòu)的復(fù)雜性也更高,需要更多的人力和資源進(jìn)行開發(fā)和維護(hù)。
15. jquery基本選擇和層次選擇器
jQuery是一個(gè)流行的JavaScript庫(kù),它提供了一些方便的方法來選擇和操作HTML元素。以下是jQuery中常用的選擇器類型:
基本選擇器
ID選擇器: 使用#符號(hào)選取指定ID的元素,例如 $(“#my-id”)。
類選擇器: 使用.符號(hào)選取指定類名的元素,例如 $(“.my-class”)。
元素選擇器: 選取指定標(biāo)簽名稱的元素,例如 $(“p”)選取所有< p >元素。
層次選擇器
后代選擇器: 選取指定父元素下的所有子孫元素,例如 $(“#my-parent p”)選取所有< p >元素,它們是#my-parent元素的后代元素。
子元素選擇器: 選取指定父元素下的直接子元素,例如 $(“#my-parent > p”)選取#my-parent元素下的所有< p >直接子元素。
相鄰兄弟選擇器: 選取緊接在指定元素后面的同級(jí)元素,例如 $(“#my-element + p”)選取緊接在#my-element元素后面的< p >元素。
通用兄弟選擇器: 選取指定元素后面的所有同級(jí)元素,例如 $(“#my-element ~ p”)選取#my-element元素后面的所有< p >元素。
除了以上常用的選擇器類型,jQuery還提供了一些其他選擇器類型,如屬性選擇器、內(nèi)容過濾選擇器等,可以根據(jù)實(shí)際需求靈活使用。
16. ribbon和feign區(qū)別
Ribbon和Feign都是Netflix公司開發(fā)的Java庫(kù),用于實(shí)現(xiàn)分布式系統(tǒng)中的客戶端負(fù)載均衡和服務(wù)調(diào)用。兩者的區(qū)別如下:
功能不同: Ribbon主要提供了客戶端負(fù)載均衡的功能,可以在多個(gè)服務(wù)提供者之間分發(fā)請(qǐng)求。Feign則是在Ribbon的基礎(chǔ)上提供了一個(gè)更高級(jí)的抽象層,簡(jiǎn)化了服務(wù)間的調(diào)用方式,使得調(diào)用方式更加像本地方法調(diào)用。
使用方式不同: Ribbon需要手動(dòng)編寫代碼來實(shí)現(xiàn)負(fù)載均衡的功能,需要實(shí)現(xiàn)負(fù)載均衡器和服務(wù)列表的管理。而Feign則是基于注解和接口定義的方式,可以自動(dòng)根據(jù)接口定義生成客戶端代碼,并且已經(jīng)集成了Ribbon的負(fù)載均衡功能,使用起來更加方便。
可擴(kuò)展性不同: Ribbon提供了豐富的可定制化選項(xiàng),可以根據(jù)實(shí)際情況自定義負(fù)載均衡策略、重試機(jī)制等。而Feign則相對(duì)簡(jiǎn)單,提供了較少的可擴(kuò)展性選項(xiàng),如果需要更高級(jí)的功能,則需要自己編寫代碼實(shí)現(xiàn)。
綜上所述,Ribbon適合對(duì)負(fù)載均衡和服務(wù)調(diào)用有更深入理解的開發(fā)者,可以自己編寫代碼實(shí)現(xiàn)需要的功能。而Feign則更加適合快速開發(fā)和初學(xué)者,可以使用注解和接口定義的方式來簡(jiǎn)化服務(wù)間的調(diào)用方式。
17. ribbon和feign區(qū)別
Ribbon和Feign都是Netflix公司開發(fā)的Java庫(kù),用于實(shí)現(xiàn)分布式系統(tǒng)中的客戶端負(fù)載均衡和服務(wù)調(diào)用。兩者的區(qū)別如下:
功能不同: Ribbon主要提供了客戶端負(fù)載均衡的功能,可以在多個(gè)服務(wù)提供者之間分發(fā)請(qǐng)求。Feign則是在Ribbon的基礎(chǔ)上提供了一個(gè)更高級(jí)的抽象層,簡(jiǎn)化了服務(wù)間的調(diào)用方式,使得調(diào)用方式更加像本地方法調(diào)用。
使用方式不同: Ribbon需要手動(dòng)編寫代碼來實(shí)現(xiàn)負(fù)載均衡的功能,需要實(shí)現(xiàn)負(fù)載均衡器和服務(wù)列表的管理。而Feign則是基于注解和接口定義的方式,可以自動(dòng)根據(jù)接口定義生成客戶端代碼,并且已經(jīng)集成了Ribbon的負(fù)載均衡功能,使用起來更加方便。
可擴(kuò)展性不同: Ribbon提供了豐富的可定制化選項(xiàng),可以根據(jù)實(shí)際情況自定義負(fù)載均衡策略、重試機(jī)制等。而Feign則相對(duì)簡(jiǎn)單,提供了較少的可擴(kuò)展性選項(xiàng),如果需要更高級(jí)的功能,則需要自己編寫代碼實(shí)現(xiàn)。
綜上所述,Ribbon適合對(duì)負(fù)載均衡和服務(wù)調(diào)用有更深入理解的開發(fā)者,可以自己編寫代碼實(shí)現(xiàn)需要的功能。而Feign則更加適合快速開發(fā)和初學(xué)者,可以使用注解和接口定義的方式來簡(jiǎn)化服務(wù)間的調(diào)用方式。
18. socket錯(cuò)誤是什么意思
Socket 錯(cuò)誤指的是在使用 Socket 進(jìn)行網(wǎng)絡(luò)通信時(shí),由于各種原因而導(dǎo)致的錯(cuò)誤。Socket 是一種網(wǎng)絡(luò)編程接口,它允許應(yīng)用程序通過 TCP/IP 協(xié)議或 UDP 協(xié)議進(jìn)行網(wǎng)絡(luò)通信。在進(jìn)行網(wǎng)絡(luò)通信時(shí),可能會(huì)出現(xiàn)各種各樣的錯(cuò)誤,例如連接超時(shí)、連接被重置、無法連接等等,這些錯(cuò)誤都被稱為 Socket 錯(cuò)誤。
錯(cuò)誤原因
Socket 錯(cuò)誤通常會(huì)由操作系統(tǒng)或網(wǎng)絡(luò)設(shè)備等方面引起,可能包括以下一些原因:
連接超時(shí): 在建立連接時(shí),等待對(duì)方響應(yīng)的時(shí)間超過了指定的時(shí)間,導(dǎo)致連接失敗。
*連接被重置: 連接成功建立后,由于網(wǎng)絡(luò)設(shè)備或?qū)Ψ街鳈C(jī)等原因,連接被異常關(guān)閉,導(dǎo)致連接失敗。
網(wǎng)絡(luò)不可達(dá): 在進(jìn)行網(wǎng)絡(luò)通信時(shí),發(fā)現(xiàn)網(wǎng)絡(luò)不可達(dá),無法進(jìn)行通信。
連接被拒絕: 對(duì)方主機(jī)拒絕連接請(qǐng)求,導(dǎo)致連接失敗。
地址已在使用中: 在進(jìn)行網(wǎng)絡(luò)通信時(shí),要求使用的地址已經(jīng)被其他應(yīng)用程序占用,導(dǎo)致連接失敗。
當(dāng)出現(xiàn) Socket 錯(cuò)誤時(shí),通常需要根據(jù)具體的錯(cuò)誤信息進(jìn)行調(diào)試和處理,例如修改網(wǎng)絡(luò)配置、增加連接超時(shí)時(shí)間、檢查網(wǎng)絡(luò)連接等等。正確地處理 Socket 錯(cuò)誤可以有效提高網(wǎng)絡(luò)通信的穩(wěn)定性和可靠性。
19. 什么是函數(shù)式編程
函數(shù)式編程(Functional Programming)是一種編程范式,是基于數(shù)學(xué)中的λ演算理論發(fā)展而來的,它的主要思想是把計(jì)算機(jī)程序看作是一系列數(shù)學(xué)函數(shù)的組合。函數(shù)式編程主張用函數(shù)(映射關(guān)系)來描述運(yùn)算過程,強(qiáng)調(diào)結(jié)果而非過程,不依賴、也盡量不改變外界狀態(tài),從而避免了多線程共享變量的問題。與命令式編程(Imperative Programming)相比,函數(shù)式編程更加關(guān)注數(shù)據(jù)的映射和轉(zhuǎn)換,而不是通過修改狀態(tài)來實(shí)現(xiàn)控制流程。
函數(shù)式編程具有以下特點(diǎn):
高階函數(shù): 函數(shù)可以作為參數(shù)傳遞給其他函數(shù),也可以作為其他函數(shù)的返回值。
純函數(shù): 相同的輸入總是得到相同的輸出,函數(shù)不改變外部狀態(tài),也不依賴外部狀態(tài),不產(chǎn)生副作用。
不可變性: 函數(shù)不能改變傳入的參數(shù)和全局變量,只能通過返回新的值來達(dá)到更新狀態(tài)的目的。
延遲計(jì)算: 只有在需要的時(shí)候才進(jìn)行計(jì)算,這樣可以避免不必要的計(jì)算。
引用透明性:對(duì)于相同的輸入,函數(shù)總是返回相同的輸出,所以可以用其返回值替換函數(shù)調(diào)用。
函數(shù)式編程在大數(shù)據(jù)、云計(jì)算、并發(fā)編程等方面都具有重要應(yīng)用。例如,Hadoop的MapReduce框架就是使用函數(shù)式編程的思想來實(shí)現(xiàn)數(shù)據(jù)處理。在Java語言中,Java 8加入了Lambda表達(dá)式和Stream API,使得Java也能夠進(jìn)行函數(shù)式編程。
20.什么是單體應(yīng)用?如何理解
單體應(yīng)用(Monolithic application)是指一個(gè)應(yīng)用程序以一體化的形式部署和運(yùn)行在一個(gè)獨(dú)立的進(jìn)程中,通常包含一個(gè)完整的應(yīng)用程序棧(application stack),包括用戶界面、應(yīng)用邏輯、數(shù)據(jù)存儲(chǔ)和處理等組件。單體應(yīng)用是傳統(tǒng)的應(yīng)用開發(fā)和部署方式,通常使用一個(gè)大型的代碼庫(kù),所有功能都在同一個(gè)代碼庫(kù)中實(shí)現(xiàn),整個(gè)應(yīng)用程序由一個(gè)運(yùn)行時(shí)進(jìn)程執(zhí)行,數(shù)據(jù)庫(kù)和其他資源都是共享的。
理解單體應(yīng)用可以類比成一個(gè)傳統(tǒng)的大型商場(chǎng),所有商品都在一個(gè)建筑物里面,商場(chǎng)有一個(gè)總控制中心來管理各個(gè)部門的運(yùn)營(yíng),不同的部門通過共享資源來協(xié)同工作。同樣地,單體應(yīng)用也是一個(gè)大型的應(yīng)用程序,所有功能都在同一個(gè)代碼庫(kù)中實(shí)現(xiàn),由一個(gè)運(yùn)行時(shí)進(jìn)程來執(zhí)行,不同的模塊通過共享資源來協(xié)同工作。
盡管單體應(yīng)用具有部署簡(jiǎn)單、開發(fā)效率高等優(yōu)點(diǎn),但也存在一些局限性,如擴(kuò)展性差、可靠性差、靈活性差等。隨著業(yè)務(wù)增長(zhǎng)和應(yīng)用規(guī)模擴(kuò)大,單體應(yīng)用的弊端逐漸顯露出來,因此,現(xiàn)在越來越多的應(yīng)用采用了微服務(wù)等分布式架構(gòu)來解決這些問題。
21. 什么是事件對(duì)象?事件對(duì)象的使用
事件對(duì)象是在事件被觸發(fā)時(shí)自動(dòng)創(chuàng)建的對(duì)象,它包含了與事件相關(guān)的信息,比如事件的類型、觸發(fā)的元素、鼠標(biāo)點(diǎn)擊的坐標(biāo)等等。在JavaScript中,事件對(duì)象是由瀏覽器自動(dòng)創(chuàng)建并傳遞給事件處理函數(shù)的,開發(fā)人員可以通過訪問事件對(duì)象來獲取有關(guān)事件的詳細(xì)信息,以便根據(jù)需要采取適當(dāng)?shù)男袆?dòng)。
事件對(duì)象通常被用來執(zhí)行以下操作:
1、取消事件的默認(rèn)行為
2、阻止事件的冒泡或捕獲
3、獲取與事件相關(guān)的數(shù)據(jù)
在事件處理函數(shù)中,可以通過 event 或 e 參數(shù)來引用事件對(duì)象,比如:
function handleClick(event) {
console.log(event.type); // 打印事件類型
console.log(event.target); // 打印觸發(fā)事件的元素
event.preventDefault(); // 取消事件的默認(rèn)行為
event.stopPropagation(); // 阻止事件的冒泡或捕獲
}
在這個(gè)例子中,handleClick 函數(shù)接收一個(gè) event 參數(shù),用于訪問事件對(duì)象中的屬性和方法。其中 event.type 和 event.target 分別獲取事件的類型和觸發(fā)事件的元素,event.preventDefault() 和 event.stopPropagation() 分別用于取消事件的默認(rèn)行為和阻止事件的冒泡或捕獲。
22. 十大經(jīng)典排序算法
以下是十大經(jīng)典排序算法:
冒泡排序(Bubble Sort): 比較相鄰兩個(gè)元素,如果逆序則交換,重復(fù)多輪,直到無逆序情況。
選擇排序(Selection Sort): 在待排序元素中選擇最?。ù螅┰?,放在已排序序列的起始位置,重復(fù)多輪,直到所有元素有序。
插入排序(Insertion Sort): 從第二個(gè)元素開始,將每個(gè)元素插入到已排序序列中的合適位置,重復(fù)多輪,直到所有元素有序。
希爾排序(Shell Sort): 將待排序序列分割成若干子序列,分別進(jìn)行插入排序,重復(fù)多輪,直到所有元素有序。
歸并排序(Merge Sort): 將待排序序列分成若干子序列,對(duì)每個(gè)子序列進(jìn)行歸并排序,將有序的子序列合并成一個(gè)有序序列,重復(fù)多輪,直到所有元素有序。
快速排序(Quick Sort): 從序列中選擇一個(gè)樞軸元素,將序列分成兩部分,小于等于樞軸元素的放在左邊,大于樞軸元素的放在右邊,對(duì)左右兩部分分別遞歸進(jìn)行快排,重復(fù)多輪,直到所有元素有序。
堆排序(Heap Sort): 將待排序序列構(gòu)造成一個(gè)大根堆,將堆頂元素(最大值)與末尾元素交換,重復(fù)多輪,直到所有元素有序。
計(jì)數(shù)排序(Counting Sort): 根據(jù)待排序序列中每個(gè)元素出現(xiàn)的次數(shù),計(jì)算小于等于每個(gè)元素的元素個(gè)數(shù),從后往前遍歷待排序序列,將每個(gè)元素放在相應(yīng)位置,重復(fù)一輪,直到所有元素有序。
桶排序(Bucket Sort): 將待排序序列分到有限數(shù)量的桶中,每個(gè)桶單獨(dú)排序,最后將所有桶的元素按照順序合并成一個(gè)序列,重復(fù)多輪,直到所有元素有序。
基數(shù)排序(Radix Sort): 將待排序元素按位數(shù)切割成不同的數(shù)字,然后按每個(gè)位數(shù)分別進(jìn)行排序,重復(fù)多輪,直到所有元素有序。
以上排序算法各有優(yōu)缺點(diǎn),不同場(chǎng)景下應(yīng)選擇不同的算法來實(shí)現(xiàn)排序。
23、單點(diǎn)登錄和多點(diǎn)登錄區(qū)別
單點(diǎn)登錄(Single Sign-On,簡(jiǎn)稱 SSO)是指用戶只需要在一次登錄操作后,就可以訪問多個(gè)系統(tǒng)或應(yīng)用程序,無需再次輸入用戶名和密碼。在單點(diǎn)登錄系統(tǒng)中,用戶只需在任意一個(gè)系統(tǒng)中登錄,然后可以無縫地訪問其他系統(tǒng),這樣可以方便用戶,提高用戶體驗(yàn),同時(shí)也可以減少用戶的密碼管理和系統(tǒng)的開發(fā)和維護(hù)成本。
相對(duì)的,多點(diǎn)登錄(Multiple Sign-On)則是指用戶需要在每個(gè)系統(tǒng)或應(yīng)用程序中單獨(dú)登錄,每個(gè)系統(tǒng)都需要驗(yàn)證用戶的身份和權(quán)限,用戶需要輸入相應(yīng)的用戶名和密碼。這種方式需要用戶多次登錄,增加了用戶的負(fù)擔(dān)和系統(tǒng)的維護(hù)成本。
單點(diǎn)登錄系統(tǒng)通過使用統(tǒng)一的身份認(rèn)證和授權(quán)機(jī)制,可以解決多點(diǎn)登錄系統(tǒng)中的問題,提供了更方便、更安全、更高效的訪問方式,用戶只需要一次認(rèn)證就可以在多個(gè)系統(tǒng)中訪問,避免了在每個(gè)系統(tǒng)中重復(fù)認(rèn)證的過程,同時(shí)也提高了系統(tǒng)的可維護(hù)性和安全性。
24、Java隨機(jī)數(shù)怎么用
在Java中,可以通過使用java.util.Random類來生成隨機(jī)數(shù)。該類提供了許多方法來生成不同類型的隨機(jī)數(shù)。
下面是一個(gè)生成整數(shù)類型隨機(jī)數(shù)的例子:
import java.util.Random;
public class RandomNumberGenerator {
public static void main(String[] args) {
Random random = new Random();
int randomNumber = random.nextInt(100); // 生成0到99的隨機(jī)整數(shù)
System.out.println(randomNumber);
}
}
在上面的例子中,我們首先創(chuàng)建了一個(gè)java.util.Random類的實(shí)例。然后,我們調(diào)用nextInt()方法來生成一個(gè)0到99之間的隨機(jī)整數(shù),并將其存儲(chǔ)在randomNumber變量中。最后,我們打印出生成的隨機(jī)數(shù)。
除了nextInt()方法,Random類還提供了許多其他方法來生成不同類型的隨機(jī)數(shù),例如nextDouble()用于生成double類型的隨機(jī)數(shù),nextBoolean()用于生成布爾類型的隨機(jī)數(shù)等等。
25、session和cookie的區(qū)別
Session和Cookie是兩種在Web應(yīng)用中用于跟蹤用戶狀態(tài)的技術(shù),它們之間有以下幾點(diǎn)不同:
存儲(chǔ)位置: Cookie保存在客戶端瀏覽器中,Session保存在服務(wù)器端。
數(shù)據(jù)安全: 由于Cookie保存在客戶端,因此Cookie的數(shù)據(jù)可以被客戶端瀏覽器篡改、偽造或竊取,因此保存在Cookie中的數(shù)據(jù)不是很安全。而Session保存在服務(wù)器端,客戶端無法直接訪問Session中的數(shù)據(jù),因此比Cookie更加安全。
存儲(chǔ)容量: Cookie保存在瀏覽器中,因此Cookie的大小受到瀏覽器的限制,一般為4KB左右。而Session保存在服務(wù)器端,因此可以存儲(chǔ)的數(shù)據(jù)量比Cookie要大。
存儲(chǔ)時(shí)效性: Cookie可以設(shè)置過期時(shí)間,過期后瀏覽器會(huì)自動(dòng)刪除Cookie,因此Cookie可以保存較長(zhǎng)時(shí)間。而Session一般默認(rèn)的超時(shí)時(shí)間為30分鐘,超過該時(shí)間后,服務(wù)器會(huì)自動(dòng)刪除Session。
使用場(chǎng)景: Cookie適合保存一些需要跨頁(yè)面?zhèn)鬟f的數(shù)據(jù),比如用戶的登錄信息、購(gòu)物車信息等。而Session一般用于保存用戶的會(huì)話信息,比如用戶的登錄狀態(tài)、權(quán)限信息等。
需要注意的是,Session和Cookie并不是互斥的,有些情況下它們可以結(jié)合使用。比如可以將Session的Session ID保存在Cookie中,以便于在用戶多次訪問時(shí)能夠恢復(fù)用戶的會(huì)話狀態(tài)。
25、a==b”和”a.equals(b)”有什么區(qū)別?
如果 a 和 b 都是對(duì)象,則 a==b 是比較兩個(gè)對(duì)象的引用,只有當(dāng) a 和 b 指向的是堆中的同一個(gè)對(duì)象才會(huì)返回 true,而 a.equals(b) 是進(jìn)行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,所以可以用于兩個(gè)不同對(duì)象,但是包含的字母相同的比較。
26、List、Set、Map 和 Queue 之間的區(qū)別
List 是一個(gè)有序集合,允許元素重復(fù)。它的某些實(shí)現(xiàn)可以提供基于下標(biāo)值的常量訪問時(shí)間,但是這不是 List 接口保證的。Set 是一個(gè)無序集合。
27、.poll() 方法和 remove() 方法的區(qū)別?
poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素,但是 poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但是 remove() 失敗的時(shí)候會(huì)拋出異常。
28、Java和C++的區(qū)別?
都是面向?qū)ο蟮恼Z言,都支持封裝、繼承和多態(tài)。
Java 不提供指針來直接訪問內(nèi)存,程序內(nèi)存更加安全。
Java 的類是單繼承的,C++ 支持多重繼承;雖然 Java 的類不可以多繼承,但是接口可以多繼承。
Java 有自動(dòng)內(nèi)存管理機(jī)制,不需要程序員手動(dòng)釋放無用內(nèi)存。
29、重載和重寫的區(qū)別?
重載: 發(fā)生在同一個(gè)類中,方法名必須相同,實(shí)質(zhì)表現(xiàn)就是多個(gè)具有不同的參數(shù)個(gè)數(shù)或者類型的同名函數(shù)(返回值類型可隨意,不能以返回類型作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)),返回值類型、訪問修飾符可以不同,發(fā)生在編譯時(shí)。
重寫: 發(fā)生在父子類中,方法名、參數(shù)列表必須相同,是父類與子類之間的多態(tài)性,實(shí)質(zhì)是對(duì)父類的函數(shù)進(jìn)行重新定義。返回值范圍小于等于父類,拋出的異常范圍小于等于父類,訪問修飾符范圍大于等于父類;如果父類方法訪問修飾符為 private 則子類就不能重寫該方法。
Java 構(gòu)造方法能否被重寫和重載?
重寫是子類方法重寫父類的方法,重寫的方法名不變,而類的構(gòu)造方法名必須與類名一致,假設(shè)父類的構(gòu)造方法如果能夠被子類重寫則子類類名必須與父類類名一致才行,所以 Java 的構(gòu)造方法是不能被重寫的。而重載是針對(duì)同一個(gè)的,所以構(gòu)造方法可以被重載。
30、Java 面向?qū)ο缶幊倘筇卣?/h2>
封裝 繼承 多態(tài)
封裝: 封裝就是把抽象的數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行的操作封裝在一起,數(shù)據(jù)被保存在內(nèi)部,程序的其他部分只有通過被授權(quán)的操作(成員方法)才能對(duì)數(shù)據(jù)進(jìn)行操作。
Java提供了四種控制修飾符控制方法和變量訪問的權(quán)限:
public:對(duì)外公開
protected:對(duì)子類和同一包中的類公開
沒有修飾符號(hào):向同一個(gè)包的類公開
private:只有類本身可以訪問,不對(duì)外公開
繼承:(extends ) :繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù)。繼承可以解決代碼復(fù)用問題,當(dāng)多個(gè)類存在相同的屬性(變量)和方法時(shí),可以從這些類中抽象出父類,在父類中定義這些相同的屬性和方法,所有的子類不需要重新定義這些屬性和方法,只需要通過extend語句來聲明繼承父類。
關(guān)于繼承如下 3 點(diǎn)請(qǐng)記?。?/p>
1、子類擁有父類對(duì)象所有的屬性和方法(包括私有屬性和私有方法),但是父類中的私有屬性和方法子類是無法訪問,只是擁有。
2、子類可以擁有自己屬性和方法,即子類可以對(duì)父類進(jìn)行擴(kuò)展。
3、子類可以用自己的方式實(shí)現(xiàn)父類的方法。
多態(tài): :所謂多態(tài),就是指一個(gè)引用(類型)在不同情況下的多種狀態(tài),你也可以這樣理解:父類型的引用指向子類型的對(duì)象。
多態(tài)有兩個(gè)好處:文章來源:http://www.zghlxwxcb.cn/news/detail-462599.html
- 應(yīng)用程序不必為每一個(gè)派生類編寫功能調(diào)用,只需要對(duì)抽象基類進(jìn)行處理即可。大大提高程序的可復(fù)用性。//繼承
- 派生類的功能可以被基類的方法或引用變量所調(diào)用,這叫向后兼容,可以提高可擴(kuò)充性和可維護(hù)性。
關(guān)于三大特征的詳細(xì)講解,請(qǐng)看這篇文章:Java面向?qū)ο蟮娜筇卣鳎韶浽斀?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-462599.html
到了這里,關(guān)于Java大廠常見1000道面試題集錦(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!