1.什么是JDK?什么是JRE?
JDK:java development kit:java開發(fā)工具包,是開發(fā)人員所需要安裝的環(huán)境
JRE:java runtime environment:java運行環(huán)境,java程序運行所需要安裝的環(huán)境
2.什么是OOP?
面向?qū)ο缶幊?br>
世間萬物都可以看成一個對象。每個物體包括動態(tài)的行為和靜態(tài)的屬性,這些就構(gòu)成了一個對象。
java是面向?qū)ο蟮恼Z言,c是面向過程的語言
3.類與對象的關(guān)系?
類是對象的抽象,對象是類的具體,類是對象的模板,對象是類的實例
4.Java中有幾種數(shù)據(jù)類型
整形:byte,short,int,long
浮點型:float,double
字符型:char
布爾型:boolean
5.什么是拆裝箱?
拆箱:把包裝類型轉(zhuǎn)成基本數(shù)據(jù)類型
裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)成包裝類型
6.Java中的包裝類都是那些?
byte:Byte
short:Short
int:Integer
long:Long
float:Float
double:Double
char:Character
boolean:Boolean
7.int和Integer的區(qū)別
區(qū)別:
Integer是int的包裝類;int是基本數(shù)據(jù)類型;
Integer的默認值是null;int的默認值是0。
9.一個java類中包含那些內(nèi)容?
屬性、方法、內(nèi)部類、構(gòu)造方法、代碼塊。
10.例如: if(a+1.0=4.0),這樣做好嗎?那針對浮點型數(shù)據(jù)運算出現(xiàn)的誤差的問題,你怎么解決?
不好,因為計算機在浮點型數(shù)據(jù)運算的時候,會有誤差,盡量在布爾表達式中不使用浮點型數(shù)據(jù)(if,while,switch中判斷條件不使用浮點型)
使用Bigdecimal類進行浮點型數(shù)據(jù)的運算
11.++i與i++的區(qū)別
++i:先賦值,后計算
i++:先計算,后賦值
12.Java中各種數(shù)據(jù)默認值
Byte,short,int,long默認是都是0
Boolean默認值是false
Char類型的默認值是’’
Float與double類型的默認是0.0
對象類型的默認值是null
13.Object類常用方法有那些?
Equals
Hashcode
toString
wait
notify
clone
getClass
14.java中有沒有指針?
有指針,但是隱藏了,開發(fā)人員無法直接操作指針,由jvm來操作指針
15.java中是值傳遞引用傳遞?
理論上說,java都是引用傳遞,對于基本數(shù)據(jù)類型,傳遞是值的副本,而不是值本身。對于對象類型,傳遞是對象的引用,當在一個方法操作操作參數(shù)的時候,其實操作的是引用所指向的對象。
16.假設(shè)把實例化的數(shù)組的變量當成方法參數(shù),當方法執(zhí)行的時候改變了數(shù)組內(nèi)的元素,那么在方法外,數(shù)組元素有發(fā)生改變嗎?
改變了,因為傳遞是對象的引用,操作的是引用所指向的對象
17.實例化數(shù)組后,能不能改變數(shù)組長度呢?
不能,數(shù)組一旦實例化,它的長度就是固定的
18.形參與實參
形參:全稱為“形式參數(shù)”,是在定義方法名和方法體的時候使用的參數(shù),用于接收調(diào)用該方法時傳入的實際值;實參:全稱為“實際參數(shù)”,是在調(diào)用方法時傳遞給該方法的實際值。
19.構(gòu)造方法能不能顯式調(diào)用?
不能構(gòu)造方法當成普通方法調(diào)用,只有在創(chuàng)建對象的時候它才會被系統(tǒng)調(diào)用
20.構(gòu)造方法能不能重寫?能不能重載?
可以重寫,也可以重載
21.什么是方法重載?
方法的重載就是在同一個類中允許同時存在一個以上的同名方法,只要它們的參數(shù)個數(shù)或者類型不同即可。在這種情況下,該方法就叫被重載了,這個過程稱為方法的重載(override)
22.內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別?
靜態(tài)內(nèi)部類相對與外部類是獨立存在的,在靜態(tài)內(nèi)部類中無法直接訪問外部類中變量、方法。如果要訪問的話,必須要new一個外部類的對象,使用new出來的對象來訪問。但是可以直接訪問靜態(tài)的變量、調(diào)用靜態(tài)的方法;
普通內(nèi)部類作為外部類一個成員而存在,在普通內(nèi)部類中可以直接訪問外部類屬性,調(diào)用外部類的方法。
如果外部類要訪問內(nèi)部類的屬性或者調(diào)用內(nèi)部類的方法,必須要創(chuàng)建一個內(nèi)部類的對象,使用該對象訪問屬性或者調(diào)用方法。
如果其他的類要訪問普通內(nèi)部類的屬性或者調(diào)用普通內(nèi)部類的方法,必須要在外部類中創(chuàng)建一個普通內(nèi)部類的對象作為一個屬性,外同類可以通過該屬性調(diào)用普通內(nèi)部類的方法或者訪問普通內(nèi)部類的屬性
如果其他的類要訪問靜態(tài)內(nèi)部類的屬性或者調(diào)用靜態(tài)內(nèi)部類的方法,直接創(chuàng)建一個靜態(tài)內(nèi)部類對象即可。
23.Static關(guān)鍵字有什么作用?
Static可以修飾內(nèi)部類、方法、變量、代碼塊
Static修飾的類是靜態(tài)內(nèi)部類
Static修飾的方法是靜態(tài)方法,表示該方法屬于當前類的,而不屬于某個對象的,靜態(tài)方法也不能被重寫,可以直接使用類名來調(diào)用。在static方法中不能使用this或者super關(guān)鍵字。
Static修飾變量是靜態(tài)變量或者叫類變量,靜態(tài)變量被所有實例所共享,不會依賴于對象。靜態(tài)變量在內(nèi)存中只有一份拷貝,在JVM加載類的時候,只為靜態(tài)分配一次內(nèi)存。
Static修飾的代碼塊叫靜態(tài)代碼塊,通常用來做程序優(yōu)化的。靜態(tài)代碼塊中的代碼在整個類加載的時候只會執(zhí)行一次。靜態(tài)代碼塊可以有多個,如果有多個,按照先后順序依次執(zhí)行。
24.Final在java中的作用
Final可以修飾類,修飾方法,修飾變量。
修飾的類叫最終類。該類不能被繼承。
修飾的方法不能被重寫。
修飾的變量叫常量,常量必須初始化,一旦初始化后,常量的值不能發(fā)生改變。
25.Java中操作字符串使用哪個類?
String,StringBuffer,StringBuilder
26.StringBuffer,Stringbuilder有什么區(qū)別?
StringBuffer是線程安全的,Stringbuilder是非線程安全的。所以Stringbuilder比stringbuffer效率更高,StringBuffer的方法大多都加了synchronized關(guān)鍵字
27.String str=”aaa”,與String str=new String(“aaa”)一樣嗎?
不一樣的。因為內(nèi)存分配的方式不一樣。
第一種,創(chuàng)建的”aaa”是常量,jvm都將其分配在常量池中。
第二種創(chuàng)建的是一個對象,jvm將其值分配在堆內(nèi)存中。
28.String str=”aa”,String s=”bb”,String aa=aa+s;一種創(chuàng)建了幾個對象?
一共有兩個引用,三個對象。因為”aa”與”bb”都是常量,常量的值不能改變,當執(zhí)行字符串拼接時候,會創(chuàng)建一個新的常量是” aabbb”,有將其存到常量池中。
29.String類的常用方法有那些?
charAt:返回指定索引處的字符
indexOf():返回指定字符的索引
replace():字符串替換
trim():去除字符串兩端空白
split():分割字符串,返回一個分割后的字符串數(shù)組
getBytes():返回字符串的byte類型數(shù)組
length():返回字符串長度
toLowerCase():將字符串轉(zhuǎn)成小寫字母
toUpperCase():將字符串轉(zhuǎn)成大寫字符
substring():截取字符串
format():格式化字符串
equals():字符串比較
30.判斷兩個對象是否相同,能使用equlas比較嗎?
不能。Equlas大多用來做字符串比較,要判斷基本數(shù)據(jù)類型或者對象類型,需要使用==
31.==與equlas有什么區(qū)別?
==可以判斷基本數(shù)據(jù)類型值是否相等,也可以判斷兩個對象指向的內(nèi)存地址是否相同,也就是說判斷兩個對象是否是同一個對象,Equlas通常用來做字符串比較。
32.如何將字符串反轉(zhuǎn)?
Stringbuilder或者stringbuffer的reverse方法
33.如何將數(shù)組反轉(zhuǎn)?
Collections的reverse方法
34.面向?qū)ο蟮恼Z言有那些特征?
封裝、繼承、多態(tài)
35.Java中的繼承是單繼承還是多繼承
Java中既有單繼承,又有多繼承。對于java類來說只能有一個父類,對于接口來說可以同時繼承多個接口
36.如果父類只有有參構(gòu)造方法,那么子類必須要重寫父類的構(gòu)造方法嗎?
必須重寫
37.創(chuàng)建一個子類對象的時候,那么父類的構(gòu)造方法會執(zhí)行嗎?
會執(zhí)行。當創(chuàng)建一個子類對象,調(diào)用子類構(gòu)造方法的時候,子類構(gòu)造方法會默認調(diào)用父類的構(gòu)造方法。
38.當父類引用指向子類對象的時候,子類重寫了父類方法和屬性,那么當訪問屬性的時候,訪問是誰的屬性?調(diào)用方法時,調(diào)用的是誰的方法?
子類重寫了父類方法和屬性,訪問的是父類的屬性,調(diào)用的是子類的方法
39.Super與this表示什么?
Super表示當前類的父類對象
This表示當前類的對象
40.抽象的關(guān)鍵字是什么?
Abstract
41.抽象類必須要有抽象方法嗎
不是必須。抽象類可以沒有抽象方法。
42.如果一個類中有抽象方法,那么這個一定是抽象類?
包含抽象方法的類一定是抽象類
43.抽象類可以使用final修飾嗎?
不可以。定義抽象類就是讓其他繼承的,而final修飾類表示該類不能被繼承,與抽象類的理念違背了
44.普通類與抽象類有什么區(qū)別?
普通類不能包含抽象方法,抽象類可以包含抽象方法
抽象類不能直接實例化,普通類可以直接實例化
45.什么是接口?
接口就是某個事物對外提供的一些功能的聲明,是一種特殊的java類
46.JAVA為什么需要接口?
接口彌補了java單繼承的缺點
47.接口有什么特點?
接口中聲明全是public static final修飾的常量
接口中所有方法都是抽象方法
接口是沒有構(gòu)造方法的
接口也不能直接實例化
接口可以多繼承
48.接口與抽象類有什么區(qū)別?
抽象類有構(gòu)造方法,接口沒有構(gòu)造方法
抽象類只能單繼承,接口可以多繼承
抽象類可以有普通方法,接口中的所有方法都是抽象方法
接口的屬性都是public static final修飾的,而抽象的不是
49.Java中異常分為哪兩種?
編譯時異常
運行時異常
50.說幾個常見的編譯時異常類?
NullPointerException:空指針異常
ArrayIndexOutOfBoundsException:數(shù)組下標越界
NumberFormatException:數(shù)字轉(zhuǎn)換異常
IllegalArgumentException:參數(shù)不匹配異常
51.異常的處理機制有幾種?
異常捕捉:try…catch…finally,異常拋出:throws。
52.在異常捕捉時,如果發(fā)生異常,那么try.catch.finally塊外的return語句會執(zhí)行嗎?
會執(zhí)行,如果有finally,在finally之后被執(zhí)行,如果沒有finally,在catch之后被執(zhí)行
53.Try.catch.finally是必須要存在的嗎?
Try塊必須存在,catch和finally可以不存在,但不能同時不存在
54.除了使用new創(chuàng)建對象之外,還可以用什么方法創(chuàng)建對象?
Java反射
55.Java反射創(chuàng)建對象效率高還是通過new創(chuàng)建對象的效率高?
通過new創(chuàng)建對象的效率比較高。通過反射時,先找查找類資源,使用類加載器創(chuàng)建,過程比較繁瑣,所以效率較低
56.Java中數(shù)據(jù)結(jié)構(gòu)有哪些?
數(shù)組、list、map、set
獲取數(shù)組或者鏈表長度:數(shù)組有l(wèi)ength屬性,list有size()方法
57.數(shù)組與list區(qū)別是什么?
數(shù)組在內(nèi)存中地址是連續(xù)的,list是不連續(xù)的
數(shù)組大小不可變,list可變
數(shù)組查找效率高,增刪效率低;list相反
57.ArrayList與LinkedList有什么區(qū)別?
ArrayList與LinkedList都實現(xiàn)了List接口。
ArrayList是線性表,底層是使用數(shù)組實現(xiàn)的,它在尾端插入和訪問數(shù)據(jù)時效率較高,
Linked是雙向鏈表,他在中間插入或者頭部插入時效率較高,在訪問數(shù)據(jù)時效率較低
58.Map有什么特點
以鍵值對存儲數(shù)據(jù)
元素存儲循序是無須的
不允許出現(xiàn)重復鍵
59.HashMap的原理是什么?
底層是用數(shù)組+鏈表實現(xiàn)。如下圖。
綜合數(shù)組和鏈表的特性,做出一種尋址容易,插入刪除也容易的數(shù)據(jù)結(jié)構(gòu)哈希表

60.常用io類有那些?
File
FileInputSteam,F(xiàn)ileOutputStream
BufferInputStream,BufferedOutputSream
FileReader,F(xiàn)ileWriter
BufferReader,BufferedWriter
61.final、finalize()、finally
性質(zhì)不同
final為關(guān)鍵字;
finalize()為方法;
finally為區(qū)塊標志,用于try語句中;
作用
final為用于標識常量的關(guān)鍵字,final標識的關(guān)鍵字存儲在常量池中(在這里final常量的具體用法將在下面進行介紹);
finalize()方法在Object中進行了定義,用于在對象“消失”時,由JVM進行調(diào)用用于對對象進行垃圾回收,類似于C++中的析構(gòu)函數(shù);用戶自定義時,用于釋放對象占用的資源(比如進行I/0操作);
finally{}用于標識代碼塊,與try{}進行配合,不論try中的代碼執(zhí)行完或沒有執(zhí)行完(這里指有異常),該代碼塊之中的程序必定會進行;
62.線程同步的方法
wait():讓線程等待。將線程存儲到一個線程池中。
notify():喚醒被等待的線程。通常都喚醒線程池中的第一個。讓被喚醒的線程處于臨時阻塞狀態(tài)。
notifyAll(): 喚醒所有的等待線程。將線程池中的所有線程都喚醒。
63.線程與進程的區(qū)別
進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位,線程是CPU調(diào)度和分派的基本單位
進程和線程的關(guān)系:
一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。
資源分配給進程,同一進程的所有線程共享該進程的所有資源。
線程在執(zhí)行過程中,需要協(xié)作同步。不同進程的線程間要利用消息通信的辦法實現(xiàn)同步。
線程是指進程內(nèi)的一個執(zhí)行單元,也是進程內(nèi)的可調(diào)度實體。
線程與進程的區(qū)別:
調(diào)度:線程作為調(diào)度和分配的基本單位,進程作為擁有資源的基本單位。
并發(fā)性:不僅進程之間可以并發(fā)執(zhí)行,同一個進程的多個線程之間也可以并發(fā)執(zhí)行。
擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進程的資源。
系統(tǒng)開銷:在創(chuàng)建或撤銷進程的時候,由于系統(tǒng)都要為之分配和回收資源,導致系統(tǒng)的明顯大于創(chuàng)建或撤銷線程時的開銷。但進程有獨立的地址空間,進程崩潰后,在保護模式下不會對其他的進程產(chǎn)生影響,而線程只是一個進程中的不同的執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但是在進程切換時,耗費的資源較大,效率要差些。
64.java設(shè)計模式有哪些?
有23種設(shè)計模式,如下:
單例模式:某個類只能有一個實例,提供一個全局的訪問點。
簡單工廠:一個工廠類根據(jù)傳入的參量決定創(chuàng)建出那一種產(chǎn)品類的實例。
工廠方法:定義一個創(chuàng)建對象的接口,讓子類決定實例化那個類。
抽象工廠:創(chuàng)建相關(guān)或依賴對象的家族,而無需明確指定具體類。
建造者模式:封裝一個復雜對象的構(gòu)建過程,并可以按步驟構(gòu)造。
原型模式:通過復制現(xiàn)有的實例來創(chuàng)建新的實例。
適配器模式:將一個類的方法接口轉(zhuǎn)換成客戶希望的另外一個接口。
組合模式:將對象組合成樹形結(jié)構(gòu)以表示“”部分-整體“”的層次結(jié)構(gòu)。
裝飾模式:動態(tài)的給對象添加新的功能。
代理模式:為其他對象提供一個代理以便控制這個對象的訪問。
亨元(蠅量)模式:通過共享技術(shù)來有效的支持大量細粒度的對象。
外觀模式:對外提供一個統(tǒng)一的方法,來訪問子系統(tǒng)中的一群接口。
橋接模式:將抽象部分和它的實現(xiàn)部分分離,使它們都可以獨立的變化。
模板模式:定義一個算法結(jié)構(gòu),而將一些步驟延遲到子類實現(xiàn)。
解釋器模式:給定一個語言,定義它的文法的一種表示,并定義一個解釋器。
策略模式:定義一系列算法,把他們封裝起來,并且使它們可以相互替換。
狀態(tài)模式:允許一個對象在其對象內(nèi)部狀態(tài)改變時改變它的行為。
觀察者模式:對象間的一對多的依賴關(guān)系。
備忘錄模式:在不破壞封裝的前提下,保持對象的內(nèi)部狀態(tài)。
中介者模式:用一個中介對象來封裝一系列的對象交互。
命令模式:將命令請求封裝為一個對象,使得可以用不同的請求來進行參數(shù)化。
訪問者模式:在不改變數(shù)據(jù)結(jié)構(gòu)的前提下,增加作用于一組對象元素的新功能。
責任鏈模式:將請求的發(fā)送者和接收者解耦,使的多個對象都有處理這個請求的機會。
迭代器模式:一種遍歷訪問聚合對象中各個元素的方法,不暴露該對象的內(nèi)部結(jié)構(gòu)。
了解:單例、工廠、觀察者模式即可
65.常見的排序方式:冒泡排序、選擇排序、快速排序
https://www.cnblogs.com/ll409546297/p/10956960.html
