日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

精华Java问题总结

發布時間:2023/12/13 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 精华Java问题总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當時在網上匯總了不知多少面試和基礎題,弄了個精華總結。

1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什么限制?

可以有多個類,但只能有一個public的類,并且public的類名必須與文件名相一致。

2、short s1= 1; s1= s1+1;?有沒有錯?

s1+1運算時會自動提升類型,結果是int,賦值給s1時,將報告需要強轉類型的錯誤。

3、short s1= 1; s1 += 1;有沒有錯?

+=是java規定的運算符,編譯器會對它進行特殊處理,因此可以正確編譯。

4、使用final關鍵字修飾一個變量時,引用的內容一定不能變?

使用final修飾變量時,是引用變量(也就是地址)不能變,引用變量所指向的對象中的內容還是可以改變的

5、是否可以從static方法內對非static方法調用?為什么?

????????不可以。因為非static方法是與對象關聯的,必須創建一個對象,才可以在該對象上進行方法調用(對象.方法)。而static方法調用時不需要創建對象,可以直接調用。如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立。

6、Overload和Override的區別?

重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。

重寫Override表示子類中的方法可以與父類中的方法的名稱和參數完全相同,子類對象調用這個方法時,將調用子類中的定義方法,這就把父類中的方法覆蓋了,這也是面向對象編程的多態性的一種表現。

7、Overloaded的方法是否可以改變返回值的類型?

如果幾個重載Overloaded的方法的參數列表不一樣,它們的返回者類型當然也可以不一樣。

如果兩個方法的參數列表完全一樣,不管返回值是否相同,都不允許。因為無法確定編程者倒底是想調用哪個方法了,因為他們被調用時看起來完全相同。

8、接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concreteclass)?抽象類中是否可以有靜態的main方法?

????????接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態的main方法。

????????記住抽象類與普通類的唯一區別就是不能創建實例對象和允許有abstract方法。

9、Java中實現多態的機制是什么?

????????靠的是父類(或接口定義)的引用變量可以指向子類(或具體實現類)的實例對象。

而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,而不是引用變量的類型中定義的方法。

10、abstractclass和interface有什么區別?

抽象類可以有構造方法,接口中不能有構造方法。

抽象類中可以有普通成員變量,接口中沒有普通成員變量

抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。

抽象類中的抽象方法類型可以是public,protected,接口中的抽象方法只能是public類型的,并且默認為public abstract。

7. 一個類可以實現多個接口,但只能繼承一個抽象類。

11、String s = "Hello";s = s + "world!";執行后,原始的String對象中的內容變了沒有?

????????沒有。因為String被設計成不可變類,所以它的所有對象都是不可變對象。只是s不再指向舊的對象了。

12、下面這條語句一共創建了多少個對象:String s="a"+"b"+"c"+"d";

javac編譯可以對字符串常量直接相加的表達式進行優化直接得出答案,不必要等到運行期再去進行加法運算處理

這行代碼被編譯器在編譯時優化后,相當于直接定義了一個”abcd”的字符串,所以,上面的代碼應該只創建了一個String對象。

13、final, finally, finalize的區別。

????????final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

????????finally是異常處理語句結構的一部分,表示總是執行。

????????finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法.

14、error和exception有什么區別?

????????error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。? ? ? ? ? ? ? ? ? exception表示程序還能夠克服和恢復的問題

15、Java 中堆和棧區別?
棧常用于保存方法幀和局部變量,而對象總是在堆上分配。

棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。

????????棧:在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java 會自動釋放掉為該變量分配的內存空間,該內存空間可以立即被另作它用。

????????堆:堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。

16、能將 int 強制轉換為 byte 類型的變量嗎?(引申到所有大類型轉小類型)
? ? ? ? 實際中,我們可以做強制轉換,不會報錯。

但是存在大類型轉小類型的通病: int 是 32 位的,而 byte 是 8 位的,如果強制轉化,int 類型的高 24 位將會被丟棄,所以盡量不要這樣做。

17、hashCode有什么用?與 a.equals(b) 有什么關系?
????????hashCode方法對應對象的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。根? ? ? ? ? ? 據 Java 規范,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。

18、垃圾回收的優點和原理。

????????垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。

原理:可以給對象添加一個被引用的計數器,就可以判斷是否已經是無引用對象。但是難以解決循環引用問題。

如果不下小心直接把 Obj1-reference 和 Obj2-reference 置 null。則在 Java 堆當中的兩塊內存依然保持著互相引用無法回收。

可達性分析法:通過一系列的 ‘GC Roots’ 的對象作為起始點,從這些節點出發所走過的路徑稱為引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連的時候說明對象不可用。?

19,java中會存在內存泄漏嗎

內存泄漏:指一個不再被程序使用的對象或變量一直被占據在內存中。java中有垃圾回收機制,它可以保證當對象不再被引用的時候,對象將自動被垃圾回收器從內存中清除掉。

????????由于Java使用有向圖的方式進行垃圾回收管理,可以消除引用循環的問題,例如有兩個對象,相互引用,只要它們和根進程不可達,那么GC也是可以回收它們的。

java中的內存泄露的情況:長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄露.

盡管短生命周期對象已經不再需要,但是因為長生命周期對象持有它的引用而導致不能被回收,這就是java中內存泄露的發生場景。通俗地說,就是程序員可能創建了一個對象,以后一直不再使用這個對象,這個對象卻一直被引用,即這個對象無用但是卻無法被垃圾回收器回收的,這就是java中可能出現內存泄露的情況,例如,緩存系統,我們加載了一個對象放在緩存中(例如放在一個全局map對象中),然后一直不再使用它,這個對象一直被緩存引用,但卻不再被使用。

?

?

21、線程和進程有什么區別?

進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位

線程是進程的子集,一個進程可以有很多線程,每條線程并行執行不同的任務。

不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。

22、如何在Java中實現線程?

繼承Thread類 class Handler extends Thread{public void run(){//方法重寫}public static void main(String[] args){Thread thread = new Handler();//創建線程對象thread.start();//啟動線程} } 實現Runnable接口 class Handler implements Runnable{public void run(){//方法實現}public static void main(String[] args){Handler handler = new Handler();Thread thread = new Thread(handler);//創建線程對象thread.start();//啟動線程} }

23、Java 關鍵字volatile 與 synchronized 作用與區別?

????1,volatile
? ??它所修飾的變量不保留拷貝,直接訪問主內存中的。
在Java內存模型中,有main memory,每個線程也有自己的memory (例如寄存器)。

為了性能,一個線程會在自己的memory中保持要訪問的變量的副本。這樣就會出現同一個變 量在某個瞬間,在一個線程的memory中的值可能與另外一個線程memory中的值,或者main memory中的值不一致的情況。?

一個變量聲明為volatile,就意味著這個變量是隨時會被其他線程修改的,因此不能將它cache在線程memory中。
????2,synchronized

當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執行該段代碼。

一、當兩個并發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。

二、當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。

三、尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有synchronized(this)同步代碼塊的訪問將被阻塞。

24、線程生命周期?

新建一個線程時,它的狀態是New。當我們調用線程的start()方法時,狀態被改變為Runnable。線程調度器會為Runnable線程池中的線程分配CPU時間并且將它們的狀態改變為Running。其他的線程狀態還有Waiting,Blocked?和Dead。

25、死鎖?

指多個進程在運行過程中因爭奪資源而造成的一種僵局,當處于這種狀態時,若無外力作用,它們都將無法再向前推進。

原因可歸結為兩點:競爭資源、?進程間推進順序非法
產生死鎖的必要條件:

互斥條件:在一段時間內某資源僅為一進程所占用。
請求和保持條件:對已獲得的資源保持不放。
不剝奪條件:已獲得的資源只能由自己釋放。
環路等待條件:存在一個進程--資源的環形鏈。

26、什么是線程池? 為什么要使用它?

創建線程要花費昂貴的資源和時間,如果任務來了才創建線程那么響應時間會變長,而且一個進程能創建的線程數有限。

線程池實現了線程重復利用,節約了時間和資源。

// Java線程池的完整構造函數 public ThreadPoolExecutor(int corePoolSize, // 線程池長期維持的線程數,即使線程處于Idle狀態,也不會回收。int maximumPoolSize, // 線程數的上限long keepAliveTime, TimeUnit unit, // 超過corePoolSize的線程的idle時長,// 超過這個時間,多余的線程會被回收。BlockingQueue<Runnable> workQueue, // 任務的排隊隊列ThreadFactory threadFactory, // 新線程的產生方式RejectedExecutionHandler handler) // 拒絕策略

27、反射?

JAVA反射機制是在運行狀態中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。

28、JDK 、 JRE 、JVM有什么區別和聯系?

JVM : Java 虛擬機。能夠將 class 文件中的字節碼指令進行識別并調用操作系統向上的 API 完成動作。所以說,jvm 是 Java 能夠跨平臺的核心。

JRE :Java 運行時環境。包含兩個部分,jvm和 Java 的一些基本類庫。

JDK :Java 開發工具包。jdk 是整個 Java 開發的核心,它集成了 jre 和一些好用的小工具。

這三者的關系是:一層層的嵌套關系。JDK>JRE>JVM。

29、深拷貝淺拷貝

? ? ? 數據類型分為兩種基礎類型和引用類型:

基礎類型:像Number、String、Boolean等這種為基本類型
引用類型:Object和Array

淺拷貝只是復制了對象的引用地址,兩個對象指向同一個內存地址,修改其中任意的值,另一個值會隨之變化

深拷貝是將對象及值復制過來,兩個對象修改其中任意的值另一個值不會改變。

30、JVM內存分為哪幾部分?各個部分的作用是什么?

JVM內存區域分為五個部分,分別是堆,方法區,虛擬機棧,本地方法棧,程序計數器。


1)堆。

堆是Java對象的存儲區域,任何用new字段分配的Java對象實例和數組。
2)方法區。

它用于存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據,方法區,從JDK1.8永久代被移除。
3)虛擬機棧。

虛擬機棧中執行每個方法的時候,都會創建一個棧幀用于存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。
4)本地方法棧。

與虛擬機棧發揮的作用相似,相比于虛擬機棧為Java方法服務,本地方法棧為虛擬機使用的Native方法服務,執行每個本地方法的時候,都會創建一個棧幀用于存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。
5)程序計數器。

指示Java虛擬機下一條需要執行的字節碼指令。

總:其中方法區和堆被JVM中多個線程共享,比如類的靜態常量就被存放在方法區,供類對象之間共享,虛擬機棧,本地方法棧,pc寄存器是每個線程獨立擁有的,不會與其他線程共享。

31、為什么會出現4.0-3.6=0.40000001這種現象?

2進制的小數無法精確的表達10進制小數,在計算10進制小數的過程中要先轉換為2進制進行計算,這個過程中出現誤差。

32、“==”比較的是什么?

“==”兩邊是對象,比較地址。

“==”兩邊是基本類型,比較數值。

總結

以上是生活随笔為你收集整理的精华Java问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。