java中==和equals和hashCode的區別
- ==比較的是記憶體地址,例:兩個字串物件,盡管內容一模一樣,但記憶體地址是不同的,當你拿==做比較時,得到的結果必然是false,
- equals比較的是物件內容,例:要是想判斷內容是否一樣的話,就得用equals方法,
基本資料型別各占多少位元組數
|
基本資料型別 |
位元組數 |
||
|
數值型 |
整數型別 |
byte |
1位元組 |
|
short |
2位元組 |
||
|
int |
4位元組 |
||
|
long |
8位元組 |
||
|
浮點型別 |
float |
4位元組 |
|
|
double |
8位元組 |
||
|
字符型 |
char |
2位元組 |
|
|
布爾型 |
boolean |
至少1位元組 |
|
int和integer區別
- int則是java的一種基本資料型別,Integer是int的包裝類;
- Integer變數必須實體化后才能使用,而int變數不需要;
- Integer實際是物件的參考,當new一個Integer時,實際上是生成一個指標指向此物件;而int則是直接存盤資料值,
- int默認值是0,integer默認值是null,
包裝類作用及基本資料型別的包裝類
- Java中基本資料型別沒有方法和屬性,而包裝類就是讓基本資料型別擁有方法和屬性,實作物件化互動,
- 數值包裝類繼承Number,字符包裝類、布爾包裝類繼承Object
|
基本資料型別 |
包裝類 |
|
byte |
Byte |
|
short |
Short |
|
int |
Integer |
|
long |
Long |
|
float |
Float |
|
double |
Double |
|
char |
Character |
|
boolean |
Boolean |
String、StringBuffer以及StringBuilder區別
- String是一個字串常量,其值是不可變的物件,也就是說在我們每次對String進行更改的時候就會生成一個新的String物件,指標就會指向新的String物件,從而效率就會低下,也浪費了記憶體,
- StringBuffer是一個可變類,并且執行緒是安全的一個字串操作類,任何對他指向字串操作都不會生成一個新的物件,還自帶緩沖區,當前字串大小沒有超過緩沖容量時,不會自動分配,超過后會自動增加容量,適合多執行緒場合使用,
- StringBuilder也是一個可變類,是一個執行緒不安全的字串操作類,StringBuilder相比StringBuffer是沒有對方法加鎖同步的,所以StringBuilder性能比StringBuffer高、安全性比StringBuffer差,適合單執行緒場合使用,
&&和 || 區別
- &&稱為:短路“與”;&稱為:按位“與”
- || 稱為:短路“或”;| 稱為:按位“或”
- “與”就是并且的意思,多個判斷條件時都得滿足
- “與”和“或”都是邏輯運算子,顧名思義,“短路”在判斷的程序中,一旦當前項為假,就短路了,后面的條件不再進行判斷,“按位”則相反,一直會把所有的條件都判斷完
多載和重寫的區別
- 多載(Override)同一個類中,可以定義多個名字相同的方法,引數、回傳值可以不同,
- 重寫(Override)子類繼承父類,同時也繼承了父類的方法,當父類的方法不能滿足子類需要時,子類可以重寫父類的方法,重寫時方法名、引數以及回傳值型別都必須跟父類一致,構造方法不能重寫,
Java多型的理解
- 多型是同一個行為具有多個不同表現形式或形態的能力,
- 多型就是同一個介面,使用不同的實體而執行不同操作
- 重寫和多載也是多型的一種表現形式
- 多型作為Java的三大特征之一,其目的都是提現Java語言的靈活性、簡化性、可拓展性等,
JVM、JRE、JDK是什么?
- JVM(Java Virtual Machine)是Java虛擬機,
- JRE(Java Runtime Environment)是Java運行環境,
- JDK(Java Development Kit)是Java開發工具包,
- JVM + 基本類別庫 = JRE,
- JRE + 編譯工具 = JDK,
- 所以三者的關系是:JDK > JRE > JVM
Java跨平臺原理
- JAVA之所以能跨平臺,得益于JAVA虛擬機,在任何作業系統下,都有相應版本的虛擬機,我們把編譯好的class檔案,放在任何一臺虛擬機上,都可以正常運行,這樣我們就利用虛擬機屏蔽了作業系統的不同,即達到了一次撰寫處處運行的效果,
Exception和Error區別
- Exception和Error都繼承Throwable類,
- Error,是系統中的錯誤,比如系統崩潰、虛擬機錯誤等,我們只有修改程式配置才能解決,通常Java程式不會捕獲和拋出這類例外,
- Exception分為運行時例外和編譯時例外
- 運行時例外:Java編譯器允許程式不對它們做出處理,而在程式執行的程序中拋出的例外,
- 編譯時例外:Java編譯器要求程式必須通過try catch捕獲或者宣告拋出這種例外
Java序列化的理解
- Java的序列化是指將物件轉換成二進制資料流的一種實作,通過將物件的序列化,可以方便的實作物件的傳輸及保存,
- 序列化方便傳輸,速度快,還很安全,可以拿到最原始的Java物件,常用于執行緒間的物件傳輸,
- 序列化方便存盤,可以存成檔案或資料庫都行,下次使用的時候直接反序列化就能拿到物件,
- 想要實作序列化,直接實作Serializeable介面就好,該介面下什么方法都沒有,只是一個標記介面,
什么是內部類,內部類的作用
- 內部類就是定義在另一個類中或方法中的一個類,有四種內部類:
- 成員內部類,靜態內部類,區域(方法)內部類,匿名內部類,
內部類作用:
- 內部類方法可以訪問該類定義區域的資料,包括私有有資料,
- 內部類提供了更好的封裝,除了該外圍類,其他的類均不能訪問,
- 想要定義一個回呼方法時,使用匿名內部類會很方便
介面和抽象類的區別
- 關鍵字區別:介面關鍵字是interface,抽象類關鍵字是abstract;
- 介面是通過implements來實作的,而抽象類是extends來繼承的;
- 介面可以多實作,抽象類只能單繼承;
- 介面和抽象類都不能被實體化;
- 介面成員變數public static final必須復制且不能被更改
- 抽象類成員變數默認default,可以在子類中進行重新定義或賦值,抽象方法被abstract修飾,并且不帶方法體,不能被private、static、synchronized等修飾符修飾,只能用public或protected修飾,
抽象類的意義
- 更好的將設計與實作分離;
- 提高開發效率,便于日后維護;
- 增加代碼規范;
final、finally、finalize區別
- 三個都是Java的關鍵字
- final是一個修飾符,用于修飾類、方法和屬性,修飾的類不能被繼承,修飾的方法不能被重寫,修飾的屬性不可更改;
- finally是例外處理語法結構的一個模塊,此模塊中的內容總是會被執行;
- finalize是object類的一個方法,垃圾回收器執行的時候呼叫回收物件的方法,
Java泛型的好處
java語言引入泛型的好處是安全和簡單,泛型的好處是在編譯的時候檢查型別安全,并且所有強制型別轉換都是自動的,提高代碼的重用率,
string 轉換成 integer的方式及原理
- 呼叫Integer.parseInt(String s);方法
- 判斷是否為空
- 判斷第一個字符是不是符號
- 回圈遍歷每個字符的十進制
- 通過 *= 和 -= 進行拼接
- 判斷是否為負值
- 回傳結果
extends和super區別
- <? extends T>限定引數型別的上界:引數型別必須是T或T的子型別,
- <? super T> 限定引數型別的下界:引數型別必須是T或T的超型別,
- <? extends T> 只能用于方法回傳,告訴編譯器此返參的型別的最小繼承邊界為T,T和T的父類都能接收,但是入參型別無法確定,只能接受null的傳入,
- <? super T>只能用于限定方法入參,告訴編譯器入參只能是T或其子型別,而返參只能用Object類接收,
- ? 既不能用于入參也不能用于返參,
this和super的區別
- this代表物件本身,是指向當前的物件一個指標,
- this可以區分自身的成員和傳遞過來的引數重名,this.name = name;
- this可以參考本類的建構式,this(name);
- super是指向自己超類的一個指標,并且是離自己最近的一個父類,
- super可以參考父類的建構式super(name);
- this和super需放在構造方法的第一行,
- this和super不能出現在同一個構造方法中,
- this和super指向的都是物件,不能出現在static模塊中,
行程和執行緒的區別
- 行程是程式正在運行的一個實體,是系統分配資源和調度的一個進本單位,
- 執行緒是系統運算調度的最小執行單位,被包含在行程中,也被稱作輕量級行程,
- 同一執行緒共享本行程的地址空間及資源,而行程則之間是獨立的地址空間和資源,
- 行程崩潰后不會影響其他的行程,而執行緒崩潰后則行程也會隨之崩潰,所以行程比執行緒要健壯些,
- 行程切換時占用資源大,能效高,所以涉及到頻繁切換的時候執行緒好于行程,
- 執行的時候每個獨立的行程都擁有程式運行的入口,但是執行緒不能獨立運行,必須依賴于行程之中,由程式提供多個執行緒執行控制,
- 兩者均可并發執行
執行緒開啟的三種方式
- 繼承Thread類
- 實作Runnable介面
- 直接創建Thread實體
繼承Thread類和實作runnable介面區別
- 繼承是單繼承,實作是多實作,
- 繼承的方式比較簡單,實作的方式稍微復雜,
- 繼承不能實作多執行緒共享資源,而實作可以,
sleep、wait、yield、join區別
- sleep 方法是屬于 Thread 類中的,sleep 程序中執行緒不會釋放鎖,只會阻塞執行緒,讓出cpu給其他執行緒,但是他的監控狀態依然保持著,當指定的時間到了又會自動恢復運行狀態,可中斷,sleep 給其他執行緒運行機會時不考慮執行緒的優先級,因此會給低優先級的執行緒以運行的機會,
- wait 方法是屬于 Object 類中的,wait 程序中執行緒會釋放物件鎖,只有當其他執行緒呼叫 notify 才能喚醒此執行緒,wait 使用時必須先獲取物件鎖,即必須在 synchronized 修飾的代碼塊中使用,那么相應的 notify 方法同樣必須在 synchronized 修飾的代碼塊中使用,如果沒有在synchronized 修飾的代碼塊中使用時運行時會拋出IllegalMonitorStateException的例外
- yield和 sleep 一樣都是 Thread 類的方法,都是暫停當前正在執行的執行緒物件,不會釋放資源鎖,和 sleep 不同的是 yield方法并不會讓執行緒進入阻塞狀態,而是讓執行緒重回就緒狀態,它只需要等待重新獲取CPU執行時間,所以執行yield()的執行緒有可能在進入到可執行狀態后馬上又被執行,還有一點和 sleep 不同的是 yield 方法只能使同優先級或更高優先級的執行緒有執行的機會
- 等待呼叫join方法的執行緒結束之后,程式再繼續執行,一般用于等待異步執行緒執行完結果之后才能繼續運行的場景,例如:主執行緒創建并啟動了子執行緒,如果子執行緒中藥進行大量耗時運算計算某個資料值,而主執行緒要取得這個資料值才能運行,這時就要用到 join 方法了
執行緒的運行狀態
- 新建狀態(new)新創建了一個執行緒物件,
- 就緒狀態(runnable)創建完成后其他執行緒呼叫了start()該狀態處于可運行池中,等待獲取CPU使用權,
- 運行狀態(running)就緒狀態的執行緒獲得了CPU,執行了run()方法,
- 阻塞狀態(blocked)阻塞狀態是因為執行緒的某種原因放棄CPU使用權,wait()、join()、yelid()、sleep(),
- 死亡狀態(dead)java執行完了或因例外退出了run()方法,結束了執行緒的生命周期,
什么是執行緒池?執行緒池的作用,
- java.util.concurrent.Executors提供了一個 java.util.concurrent.Executor介面的實作用于創建執行緒池,多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力,
- 執行緒池作用就是限制系統中執行執行緒的數量,根據系統的環境情況,可以自動或手動設定執行緒數量,達到運行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高,用執行緒池控制執行緒數量,其他執行緒排隊等候,一個任務執行完畢,再從佇列的中取最前面的任務開始執行,若佇列中沒有等待行程,執行緒池的這一資源處于等待,當一個新任務需要運行時,如果執行緒池中有等待的作業執行緒,就可以開始運行了;否則進入等待佇列,
- 減少了創建和銷毀執行緒的次數,每個作業執行緒都可以被重復利用,可執行多個任務,
- 可以根據系統的承受能力,調整執行緒池中作業線執行緒的數目,防止因為消耗過多的記憶體,而把服務器累趴下(每個執行緒需要大約1MB記憶體,執行緒開的越多,消耗的記憶體也就越大,最后死機),
synchronized 和volatile 關鍵字的區別
- volatile本質的是在告訴jvm當前變數在暫存器中的值是不確定的,需要從主記憶體中讀取,
- synchronized是鎖定當前變數,只有當前執行緒可以訪問改變數,其他執行緒被阻塞,
- volatile只能在變數級別使用,而synchronized可以在變數和方法中使用,
- volatile僅能實作變數的修改可見性,而synchronized則可以保證變數的修改可見性和原子性.
- volatile不會造成執行緒阻塞,而synchronized會造成執行緒阻塞,
- 使用volatile而不是synchronized的唯一安全情況是類中只有一個可變域,
synchronized和Lock區別
- Lock是一個介面,而synchronized是Java的一個關鍵字
- synchronized在發生例外的時候會主動釋放執行緒占有的鎖,不會導致死鎖的發生,Lock在發生例外時如果沒有呼叫unLock()去釋放鎖時就會造成死鎖,所以使用Lock時,得在finally陳述句塊中釋放鎖,
- Lock可以讓等待的執行緒中斷,而synchronized不可以,
- 通過Lock可以知道是否獲取到鎖,而synchronized不可以,
- Lock可以提高多個執行緒讀操作的效率
- 在性能上來說,如果資源競爭不激烈,兩者性能都是差不多的,如果競爭非常激烈的話,Lock的性能要高于synchronized,所以要視情況選擇,
怎么終止執行緒?
- 使用exit標志位方法,
- 使用interrupt()方法
- 使用stop(不推薦使用,執行緒不安全,過時方法),
List、Set、Map區別
- Collection介面繼承Iterable介面,而List和Set繼承Collection介面,Map不繼承,
- Map和Collection并列為Java的兩大集合
- List特點:元素有放入順序,元素可重復 ,支持for回圈,也就是通過下標來遍歷,也可以用迭代器,有兩大繼承類ArrayList和LinkedList,
- Set特點:元素無放入順序,元素不可重復,重復元素會覆寫掉,但是set只能用迭代,因為他無序,無法用下標來取得想要的值,兩大繼承類:HashSet和TreeSet
- Map是通過鍵值對的方式來存盤資料,兩大繼承類HashMap和TreeMap,
ArrayList和LinkedList區別
- ArrayList和LinkedList都是List下的實作類,
- ArrayList 采用的是陣列形式來保存物件的,這種方式將物件放在連續的位置中,優點是使用索引在陣列中搜索和讀取資料是很快,缺點就是增加洗掉時非常麻煩,
- LinkedList 是采用雙鏈表形式存盤資料,大量的資料時,增加和洗掉性能高于ArrayList,但是缺點就是查找非常麻煩要叢第一個索引開始,
集合和陣列區別
- 陣列的長度是固定的,集合的長度是可變的
HashMap和HashTable區別
- 繼承的父類不同,HashMap是繼承AbstractMap,HashTable繼承Dictionary,
- 執行緒安全不同,HashMap是執行緒不安全的,HashTable是執行緒安全的,
- 遍歷方式內部實作不同,HashMap和HashTable都是使用了Iterator,由于歷史原因HashTable還是用Eunmeration方式,
- Hash值不同,HashTable直接使用物件的HashCode,而HashMap會重新計算Hash值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/200015.html
標籤:其他
