主頁 > 後端開發 > Java 萬字長文基礎知識總結(下)-王者筆記《收藏版》

Java 萬字長文基礎知識總結(下)-王者筆記《收藏版》

2021-07-29 07:26:01 後端開發

上一篇 Java基礎知識學習總結之(上)

目錄

三、計算機原理和作業系統

記憶體、CPU、硬碟?

Linux基本命令

執行緒和行程的區別?

四、資料庫基礎

關系型資料庫和非關系型資料庫有哪些區別?舉例說明

資料庫索引是做什么用的

什么情況需要給欄位建立索引?

什么情況下索引會失效?

慢查詢是什么?

主從庫是什么?

五、Java開發相關基礎

MVC框架?

js跨域請求是什么意思?

服務器500、502、503、504、505錯誤是什么?

負載均衡是什么?

Cookie和Session分別是什么?Cookie的容量限制是多少?說?下 Session 的?作原理?

如果客戶端禁? Cookie 能實作 Session 還能用嗎?

Session共享原理是什么?怎么實作?

java的歷史

正則運算式?

反射技術?

Java 語?有哪些特點?

多載和重寫的區別?

接?和抽象類的區別是什么?

成員變數與區域變數的區別有哪些?

== 與 equals?

hashCode 與 equals ?

hashCode()介紹

為什么要有 hashCode

JVM

什么是位元組碼?采用位元組碼的好處是什么?

JDK 和 JRE


三、計算機原理和作業系統

記憶體、CPU、硬碟?

記憶體是計算機的重要部件之?, 它是外存與CPU進?溝通的橋梁,計算機中所有程式的運?都在記憶體中進?,記憶體性能的強弱影響計算機整體發揮的?平, 記憶體(Memory)也稱記憶體儲器和主存盤器,它用于暫時存放CPU中的運 算資料,與硬碟等外部存盤器交換的資料, 只要計算機開始運?,作業系統就會把需要運算的資料從記憶體調到 CPU中進?運算,當運算完成,CPU將結果傳送出來, 記憶體的運?也決定計算機整體運?快慢的程度, 記憶體條由記憶體芯片、電路板、??指等部分組成, 電腦硬碟是計算機最主要的存盤設備,硬碟(港臺稱之為硬碟,英? 名:Hard Disk Drive, 簡稱HDD 全名溫徹斯特式硬碟)由?個或者多個 鋁制或者玻璃制的碟片組成,這些碟片外覆寫有鐵磁性材料, 絕?多數硬碟都是固定硬碟,被永久性地密封固定在硬碟驅動器中, 早期的硬碟存盤媒介是可替換的,不過今日典型的硬碟是固定的存盤媒 介,被封在硬碟里 (除了?個過濾孔,用來平衡空?壓?),隨著發 展,可移動硬碟也出現了,?且越來越普及,種類也越來越多.?多數微 機上安裝的硬碟,由于都采用溫切斯特(winchester)技術?被稱之為“溫切 斯特硬碟”,或簡稱“溫盤”, 中央處理器(CPU),是電?計算機的主要設備之?,電腦中的核? 配件,其功能主要是解釋計算機指令以及處理計算機軟體中的資料,CPU 是計算機中負責讀取指令,對指令譯碼并執?指令的核?部件,中央處理 器主要包括兩個部分,即控制器、運算器,其中還包括?速緩沖存盤器及 實作它們之間聯系的資料、控制的總線,電?計算機三?核?部件就CPU、內部存盤器、輸?/輸出設備,中央處理器的功效主要為處理指 令、執?操作、控制時間、處理資料,

Linux基本命令

1.sudo

這個SuperUserDo是Linux新?要使用的最重要的命令,需要根權限的 每?個命令都需要這個sudo命令,你可以在需要根權限的每個命令之前使 用sudo,$ sudo su

2.ls(list)

借助list命令,終端就會顯示你正在處理的那個目錄里面的所有?件和?件夾,假設我在/home?件夾里面,想查看/home里面的目錄和? 件,

/home$ ls

/home中的ls回傳下列結果:

imad lost+found

3.cd

更改目錄(cd)是始終在終端中使用的主要命令,它是最基本的Linux命 令之?,使用這個命令很簡單,只要輸?你想要從當前目錄進?到的那個 ?件夾的名稱,如果想要回傳上?級,只要將雙圓點(..)作為引數,假設我在/home目錄中,想進?到始終在/home里面的usr目錄,下面 是我可以使用cd命令的?法:

/home $ cd usr

/home/usr $

4.mkdir

僅僅更改目錄還不全面,有時候,你想要創建?個新的?件夾或??

件夾,可以使用mkdir命令來做到這?點,只要在終端中將你的?件夾名稱放在mkdir命令的后面即可,

$ mkdir folderName

5.cp

拷貝粘貼是我們為了組織整理?件?需要完成的重要任務,使用cp將 幫助你從終端拷貝粘貼?件,首先,你確定想要拷貝的那個?件,然后輸?目的地位置,即可粘貼?件,

$ cp src des

注意:如果你將?件拷貝到任何新?件都需要根權限的目錄,那么你就需要使用sudo命令,

6.rm

rm這個命令可以移除你的?件,甚?移除你的目錄,如果?件需要根權限才能移除,可以使用-f,你還可以使用-r來進?遞回移除,從?移除你的?件夾,

$ rm myfile.txt

7.apt-get

就不同的發?版??,這個命令各不相同,在基于Debian的Linux發 ?版中,想安裝、移除和升級任何軟體包,我們可以使用?級包裝?具 (APT)軟體包管理器,apt-get命令可幫助你安裝需要在Linux中運?的軟體,這是個功能強?的命令??具,可以執?安裝、升級、甚?移除軟體這類任務, 在其他發?版(比如Fedora和Centos)中,有不同的軟體包管理器,

Fedora過去有yum,但現在它有dnf,

$ sudo apt-get update

$sudo dnf update

8.grep

你需要找到?個?件,但是又記不得它的確切位置或路徑,grep可以幫助你解決這個問題,你可以使用grep命令,根據給定的關鍵字幫助找到?件,

$ grep user /etc/passwd

9.cat

作為用戶,你常常需要查看來自腳本的?些?檔或代碼,同樣,其中?個Linux基本命令是cat命令,它會為你顯示?件里面的?本,

$ cat CMakeLists.txt

10.poweroff

有時候,你需要直接從終端來關機,這個命令就能完成這項任務,別忘了在命令的開頭添加sudo,因為它需要根權限才能執?poweroff,

$ sudo poweroff

執行緒和行程的區別?

行程和執行緒的根本區別是行程是作業系統資源分配的基本單位,?線 程是處理器任務調度和執?的基本單位,另外區別還有資源開銷、包含關 系、記憶體分配、影響關系、執?程序等,

資源開銷:每個行程都有獨立的代碼和資料空間(程式上下?),程 序之間的切換會有較?的開銷;執行緒可以看做輕量級的行程,同?類執行緒 共享代碼和資料空間,每個執行緒都有自?獨立的運?堆疊和程式計數器(PC),執行緒之間切換的開銷小,

包含關系:如果?個行程內有多個執行緒,則執?程序不是?條線的,

?是多條線(執行緒)共同完成的;執行緒是行程的?部分,所以執行緒也被稱為輕權行程或者輕量級行程,

記憶體分配:同?行程的執行緒共享本行程的地址空間和資源,?行程之間的地址空間和資源是相互獨立的,

影響關系:?個行程崩潰后,在保護模式下不會對其他行程產?影響,但是?個執行緒崩潰整個行程都死掉,所以多行程要比多執行緒健壯,

執?程序:每個獨立的行程有程式運?的??、順序執?序列和程式出?,但是執行緒不能獨立執?,必須依存在應用程式中,由應用程式提供多個執行緒執?控制,兩者均可并發執?,

行程和執行緒的根本區別是行程是作業系統資源分配的基本單位,?執行緒是處理器任務調度和執?的基本單位,

四、資料庫基礎

關系型資料庫和非關系型資料庫有哪些區別?舉例說明

關系型資料庫,是指采用了關系模型來組織資料的資料庫,其以?和列的形式存盤資料,以便于用戶理解,關系型資料庫這?系列的?和列被稱為表,?組表組成了資料庫,用戶通過查詢來檢索資料庫中的資料,?查詢是?個用于限定資料庫中某些區域的執?代碼,關系模型可以簡單理解為?維表格模型,??個關系型資料庫就是由?維表及其之間的關系組成的?個資料組織,例如:mysql、oracle、sql server NoSQL,泛指非關系型的資料庫,隨著互聯?web2.0?站的興起,傳統的關系資料庫在處理web2.0?站,特別是超?規模和?并發的SNS型別的web2.0純動態?站已經顯得?不從?,出現了很多難以克服的問題,?非關系型的資料庫則由于其本身的特點得到了非常迅速的發展,NoSQL資料庫的產?就是為了解決?規模資料集合多重資料種類帶來的挑戰,尤其是?資料應用難題,例如:redis

資料庫索引是做什么用的

在關系資料庫中,索引是?種單獨的、物理的對資料庫表中?列或多列的值進?排序的?種存盤結構,它是某個表中?列或若?列值的集合和 相應的指向表中物理標識這些值的資料頁的邏輯指標清單,索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容,

什么情況需要給欄位建立索引?

表的主鍵、外鍵必須有索引;

資料量超過300的表應該有索引;

經常與其他表進連接的表,在連接欄位上應該建索引;

經常出現在Where句 order by中的欄位,特別是表的欄位,應該建索引;

索引應該建在選擇性的欄位上;

索引應該建在欄位上,對于的本欄位甚超欄位,不要建索引;

什么情況下索引會失效?

1.單獨參考復合索引里非第?位置的索引列 假如有INDEX(a,b,c), 當條件為a或a,b或a,b,c時都可以使用索引,

但是當條件為b,c時將不會使用索引,

復合索引遵守“最左前綴”原則,即在查詢條件中使用了復合索引的第 ?個欄位,索引才會被使用,因此,在復合索引中索引列的順序?關重要,如果不是按照索引的最左列開始查找,則?法使用索引,

2.對索引列運算,運算包括(+、-、*、/、!、、%、like’%_’(%放在前面)、or、in、exist等),導致索引失效,

錯誤的例?:select * from test where id-1=9;

正確的例?:select * from test where id=10;

注意!!

mysql sql 中如果使用了 not in , not exists , ( 不等于 !=) 這些不? < 小于 > ?于 = 這個根據實際查詢資料來判斷,如果全盤掃描速度比索引速度要快則不?索引 ,

3.對索引應用內部函式,這種情況下應該建立基于函式的索引,

select * from template t where ROUND(t.logicdb_id) = 1

此時應該建ROUND(t.logicdb_id)為索引,

4、型別錯誤,如欄位型別為varchar,where條件用number,

例:template_id欄位是varchar型別,

錯誤寫法:select * from template t where t.template_id = 1

正確寫法:select * from template t where t.template_id = ‘1’

5.如果MySQL預計使用全表掃描要比使用索引快,則不使用索引

6.like的模糊查詢以%開頭,索引失效

7.索引列沒有限制 not null,索引不存盤空值,如果不限制索引列是 not null,oracle會認為索引列有可能存在空值,所以不會按照索引計算

慢查詢是什么?

分析MySQL陳述句查詢性能的?法除了使用 EXPLAIN 輸出執?計劃,還可以讓MySQL記錄下查詢超過指定時間的陳述句,我們將超過指定時間的SQL陳述句查詢稱為“慢查詢”,

主從庫是什么?

1、做資料的熱備,作為后備資料庫,主資料庫服務器故障后,可切 換到從資料庫繼續?作,避免資料丟失,

2、架構的擴展,業務量越來越?,I/O訪問頻率過?,單機?法滿?,此時做多庫的存盤,降低磁盤I/O訪問的頻率,提?單個機器的I/O性能,

3、讀寫分離,使資料庫能支撐更?的并發,在報表中尤其重要,由于部分報表sql陳述句非常的慢,導致鎖表,影響前臺服務,如果前臺使用master,報表使用slave,那么報表sql將不會造成前臺鎖,保證了前臺速度,

五、Java開發相關基礎

MVC框架?

MVC開始是存在于桌面程式中的,M是指業務模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實作代碼分離,從?使同?個程式可以使用不同的表現形式,比如?批統計資料可以分別用柱狀圖、餅圖來表示,C存在的目的則是確保M和V的同步,?旦M改變,V應該同步更新, [1-2] 模型-視圖-控制器(MVC)是Xerox PARC在??世紀??年代為編程語?Smalltalk-80發明的?種軟體設計模式,已被?泛使用,后來被推薦為Oracle旗下Sun公司Java EE平臺的設計模式,并且受到越來越多的使用ColdFusion和PHP的開發者的歡迎,模型-視圖-控制器模式是?個有用的?具箱,它有很多好處,但也有?些缺點,

js跨域請求是什么意思?

跨域訪問,簡單來說就是 A ?站的 javascript 代碼試圖訪問 B ?站,包括提交內容和獲取內容,由于安全原因,跨域訪問是被各?瀏覽器所默認禁?的,

服務器500、502、503、504、505錯誤是什么?

HTTP 500 - 內部服務器錯誤

HTTP 502 - ?關錯誤

503 服務器目前?法使用(由于超載或停機維護),通常,這只是暫時狀態,(服務不可用)

504 表示超時,也就是客戶端所發出的請求沒有到達?關

505 服務器不支持請求中所用的 HTTP 協議版本,(HTTP 版本不受支持)

負載均衡是什么?

負載均衡建立在現有?絡結構之上,它提供了?種廉價有效透明的?法擴展?絡設備和服務器的帶寬、增加吞吐量、加強?絡資料處理能?、提??絡的靈活性和可用性,

負載均衡(Load Balance)其意思就是分攤到多個操作單元上進?執?,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從?共同完成?作任務,

Cookie和Session分別是什么?Cookie的容量限制是多少?說?下 Session 的?作原理?

Cookie是?段不超過4KB的小型?本資料,由?個名稱(Name)、?個值(Value)和其它?個用于控制Cookie有效期、安全性、使用范圍的可選屬性組成,

Session:在計算機中,尤其是在?絡應用中,稱為“會話控制”,

Session物件存盤特定用戶會話所需的屬性及配置資訊,這樣,當用戶在應用程式的Web頁之間跳轉時,存盤在Session物件中的變數將不會丟失,?是在整個用戶會話中?直存在下去,當用戶請求來自應用程式的 Web頁時,如果該用戶還沒有會話,則Web服務器將自動創建?個 Session物件,當會話過期或被放棄后,服務器將終?該會話,Session 物件最常見的?個用法就是存盤用戶的首選項,

如果客戶端禁? Cookie 能實作 Session 還能用嗎?

能用,需要特殊處理,

Session共享原理是什么?怎么實作?

應用服務器間的session復制共享

基于cache DB快取的session共享

基于redis快取的session共享目的是實作單點登錄

java的歷史

1991 年Sun公司的James Gosling等?開始開發名稱為 Oak 的語?,希望用于控制嵌?在有線電視交換盒、PDA等的微處理器;

1994年將Oak語?更名為Java;

Java的三種技術架構:

JAVAEE:Java Platform Enterprise Edition,開發企業環境下的應用程式,主要針對web程式開發;

JAVASE:Java Platform Standard Edition,完成桌面應用程式的開發,是其它兩者的基礎;

JAVAME:Java Platform Micro Edition,開發電?消費產品和嵌?式設備,如?機中的程式;

正則運算式?

好處:正則的出現,對字串的復雜操作變得更為簡單,

特點:將對字串操作的代碼用?些符號來表示,只要使用了指定符號,就可以呼叫底層的代碼對字串進?操作,符號的出現,簡化了代碼的書寫,

弊端:符號的出現雖然簡化了書寫,但是卻降低了閱讀性,

其實更多是用正則解決字串操作的問題,

組:用小括號標示,每定義?個小括號,就是?個組,?且有自動編 號,從1開始, 只要使用組,對應的數字就是使用該組的內容,別忘了,陣列要加 \\, (aaa(wwww(ccc))(eee))技巧,從左括號開始數即可,有?個左括號就是?組,

常見操作:

1,匹配:其實用的就是String類中的matches?法,

String reg = “[1—9][0—9]{4,14}";

boolean b = qq.matches(reg);//將正則和字串關聯對字串進?匹配,

2,切割:其實用的就是String類中的split?法,

3,替換:其實用的就是String類中的replaceAll();

4,獲取:

1),先要將正則運算式編譯成正則物件,使用的是Pattern中靜態?法 compile(regex);

2),通過Pattern物件獲取Matcher物件,

Pattern用于描述正則運算式,可以對正則運算式進?決議, ?將規則操作字串,需要從新封裝到匹配器物件Matcher中,

然后使用Matcher物件的?法來操作字串,

如何獲取匹配器物件呢?

通過Pattern物件中的matcher?法,該?法可以正則規則和字串想關聯,并回傳匹配器物件,

3),使用Matcher物件中的?法即可對字串進?各種正則操作,

反射技術?

就是動態加載?個指定的類,并獲取該類中的所有的內容,?且將字

節碼?件封裝成物件,并將位元組碼?件中的內容都封裝成物件,這樣便于操作這些成員,簡單說:反射技術可以對?個類進?解剖,

反射的好處:??的增強了程式的擴展性,

反射的基本步驟:

1、獲得Class物件,就是獲取到指定的名稱的位元組碼?件物件,

2、實體化物件,獲得類的屬性、?法或建構式,

3、訪問屬性、呼叫?法、呼叫建構式創建物件,

Java 語?有哪些特點?

簡單易學;

面向物件(封裝,繼承,多型);

平臺?關性( Java 虛擬機實作平臺?關性);

可靠性;

安全性;

支持多執行緒( C++ 語?沒有內置的多執行緒機制,因此必須呼叫操作

系統的多執行緒功能來進?多執行緒程式設計,? Java 語?卻提供了多執行緒支持);

支持?絡編程并且很?便( Java 語?誕?本身就是為簡化?絡編程

設計的,因此 Java 語?不僅支持?絡編程?且很?便);

多載和重寫的區別?

多載: 發?在同?個類中,?法名必須相同,引數型別不同、個數

不同、順序不同,?法回傳值和訪問修飾符可以不同,發?在編譯時,

重寫: 發?在??類中,?法名、引數串列必須相同,回傳值范圍

小于等于?類,拋出的例外范圍小于等于?類,訪問修飾符范圍?于等于?類;如果?類?法訪問修飾符為 private 則?類就不能重寫該?法,

接?和抽象類的區別是什么?

接?的?法默認是 public,所有?法在接?中不能有實作(Java 8 開始接??法可以有默認實作),?抽象類可以有非抽象的?法,

接?中除了static、final變數,不能有其他變數,?抽象類中則不?

定, ?個類可以實作多個接?,但只能實作?個抽象類,接?自?本身可以通過extends關鍵字擴展多個接?,

接??法默認修飾符是public,抽象?法可以有public、protected和 default這些修飾符(抽象?法就是為了被重寫所以不能使用private關鍵字 修飾!), 從設計層面來說,抽象是對類的抽象,是?種模板設計,?接?是對?為的抽象,是?種?為的規范,

備注:在JDK8中,接?也可以定義靜態?法,可以直接用接?名調

用,實作類和實作是不可以呼叫的,如果同時實作兩個接?,接?中定義了?樣的默認?法,則必須重寫,不然會報錯,

成員變數與區域變數的區別有哪些?

從語法形式上看:成員變數是屬于類的,?區域變數是在?法中定義

的變數或是?法的引數;成員變數可以被 public,private,static 等修飾符所修飾,?區域變數不能被訪問控制修飾符及 static 所修飾;但是,成員變數和區域變數都能被 final 所修飾,

從變數在記憶體中的存盤?式來看:如果成員變數是使用static修飾的,

那么這個成員變數是屬于類的,如果沒有使用static修飾,這個成員變數是屬于實體的,?物件存在于堆記憶體,區域變數則存在于堆疊記憶體,

從變數在記憶體中的?存時間上看:成員變數是物件的?部分,它隨著

物件的創建?存在,?區域變數隨著?法的呼叫?自動消失,

成員變數如果沒有被賦初值:則會自動以型別的默認值?賦值(?種

情況例外:被 final 修飾的成員變數也必須顯式地賦值),?區域變數則不會自動賦值,

== 與 equals?

== : 它的作用是判斷兩個物件的地址是不是相等,即,判斷兩個物件 是不是同?個物件(基本資料型別==比較的是值,參考資料型別==比較的是記憶體地址),

equals() : 它的作用也是判斷兩個物件是否相等,但它?般有兩種使用情況:

情況1:類沒有覆寫 equals() ?法,則通過 equals() 比較該類的兩個物件時,等價于通過“==”比較這兩個物件,

情況2:類覆寫了 equals() ?法,?般,我們都覆寫 equals() ?法來比較兩個物件的內容是否相等;若它們的內容相等,則回傳 true (即,認為這兩個物件相等),

舉個例?:

public class test1 {

public static void main(String[] args) {

String a = new String("ab"); // a 為?個參考

String b = new String("ab"); // b為另?個參考,物件的內容?樣

String aa = "ab"; // 放在常量池中

String bb = "ab"; // 從常量池中查找

if (aa == bb) // true

System.out.println("aa==bb");

if (a == b) // false,非同?物件

System.out.println("a==b");

if (a.equals(b)) // true

System.out.println("aEQb");

if (42 == 42.0) { // true

System.out.println("true");

}

}

}

說明:

String 中的 equals ?法是被重寫過的,因為 object 的 equals ?法是比 較的物件的記憶體地址,? String 的 equals ?法比較的是物件的值,

當創建 String 型別的物件時,虛擬機會在常量池中查找有沒有已經存在的值和要創建的值相同的物件,如果有就把它賦給當前參考,如果沒有就在常量池中重新創建?個 String 物件,

hashCode 與 equals ?

hashCode()介紹

hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是回傳? 個int整數,這個哈希碼的作用是確定該物件在哈希表中的索引位置, hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包 含有hashCode() 函式,

散串列存盤的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”,這其中就利用到了散列碼!(可以快速找到所需要的物件)

為什么要有 hashCode

我們先以“HashSet 如何檢查重復”為例?來說明為什么要有

hashCode: 當你把物件加? HashSet 時,HashSet 會先計算物件的hashcode 值來判斷物件加?的位置,同時也會與其他已經加?的物件的hashcode 值作比較,如果沒有相符的hashcode,HashSet會假設物件沒有重復出現,但是如果發現有相同 hashcode 值的物件,這時會呼叫 equals() ?法來檢查 hashcode 相等的物件是否真的相同,如果兩者相同,HashSet 就不會讓其加?操作成功,如果不同的話,就會重新散列到其他位置,

(摘自我的Java啟蒙書《Head first java》第?版),這樣我們就??減少了 equals 的次數,相應就??提?了執?速度,

通過我們可以看出:hashCode() 的作用就是獲取哈希碼,也稱為散列碼;它實際上是回傳?個int整數,這個哈希碼的作用是確定該物件在哈希表中的索引位置,hashCode()在散串列中才有用,在其它情況下沒用,在散串列中hashCode() 的作用是獲取物件的散列碼,進?確定該物件在散串列中的位置,hashCode()與equals()的相關規定如果兩個物件相等,則hashcode?定也是相同的 兩個物件相等,對兩個物件分別呼叫equals?法都回傳true兩個物件有相同的hashcode值,它們也不?定是相等的因此,equals ?法被覆寫過,則 hashCode ?法也必須被覆寫hashCode() 的默認?為是對堆上的物件產?獨特值,如果沒有重寫hashCode(),則該 class 的兩個物件?論如何都不會相等(即使這兩個物件指向相同的資料)

關于 JVM JDK 和 JRE

JVM

Java虛擬機(JVM)是運? Java 位元組碼的虛擬機,JVM有針對不同系統的特定實作(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果,

什么是位元組碼?采用位元組碼的好處是什么?

在 Java 中,JVM可以理解的代碼就叫做位元組碼(即擴展名為 .class 的?件),它不面向任何特定的處理器,只面向虛擬機,Java 語?通過位元組碼的?式,在?定程度上解決了傳統解釋型語?執?效率低的問題,同時又保留了解釋型語?可移植的特點,所以 Java 程式運?時比較?效,?且,由于位元組碼并不針對?種特定的機器,因此,Java程式?須重新編譯便可在多種不同作業系統的計算機上運?,

我們需要格外注意的是 .class->機器碼 這?步,在這?步 JVM 類加載器首先加載位元組碼?件,然后通過解釋器逐?解釋執?,這種?式的執?速度會相對比較慢,?且,有些?法和代碼塊是經常需要被呼叫的(也就是所謂的熱點代碼),所以后面引進了 JIT 編譯器,?JIT 屬于運?時編譯,當 JIT 編譯器完成第?次編譯后,其會將位元組碼對應的機器碼保存下來,下次可以直接使用,?我們知道,機器碼的運?效率肯定是?于 Java解釋器的,這也解釋了我們為什么經常會說 Java 是編譯與解釋共存的語?,

HotSpot采用了惰性評估(Lazy Evaluation)的做法,根據??定律,消耗?部分系統資源的只有那?小部分的代碼(熱點代碼),?這也就是JIT所需要編譯的部分,JVM會根據代碼每次被執?的情況收集資訊并相應地做出?些優化,因此執?的次數越多,它的速度就越快,JDK 9引? 了?種新的編譯模式AOT(Ahead of Time Compilation),它是直接將位元組碼編譯成機器碼,這樣就避免了JIT預熱等各?面的開銷,JDK支持分層編譯和AOT協作使用,但是 ,AOT 編譯器的編譯質量是肯定比不上 JIT編譯器的,

總結:

Java虛擬機(JVM)是運? Java 位元組碼的虛擬機,JVM有針對不同系統的特定實作(Windows,Linux,macOS),目的是使用相同的位元組碼,

它們都會給出相同的結果,位元組碼和不同系統的 JVM 實作是 Java 語?“?次編譯,隨處可以運?”的關鍵所在,

JDK 和 JRE

JDK是Java Development Kit,它是功能齊全的Java SDK,它擁有JRE 所擁有的?切,還有編譯器(javac)和?具(如javadoc和jdb),它能夠創建和編譯程式,

JRE 是 Java運?時環境,它是運?已編譯 Java 程式所需的所有內容的集合,包括 Java虛擬機(JVM),Java類別庫,java命令和其他的?些基礎構件,但是,它不能用于創建新程式,

如果你只是為了運??下 Java 程式的話,那么你只需要安裝 JRE 就可以了,如果你需要進??些 Java 編程?面的?作,那么你就需要安裝JDK了,但是,這不是絕對的,有時,即使您不打算在計算機上進?任何Java開發,仍然需要安裝JDK,例如,如果要使用JSP部署Web應用程式,那么從技術上講,您只是在應用程式服務器中運?Java程式,那你為什么需要JDK呢?因為應用程式服務器會將 JSP 轉換為 Java servlet,并且需要使用 JDK 來編譯 servlet,

靜態?法和實體?法有何不同?

在外部呼叫靜態?法時,可以使用”類名.?法名”的?式,也可以使用”物件名.?法名”的?式,?實體?法只有后面這種?式,也就是說,呼叫靜態?法可以?需創建物件,

靜態?法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變 量和靜態?法),?不允許訪問實體成員變數和實體?法;實體?法則?此限制

今天就到這兒吧,小伙伴們點贊、收藏、評論是對我最大的支持、下期見~~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290647.html

標籤:java

上一篇:JAVA803_Stream流的生產方式、forEach、filter、map、limit、skip、concat、distinct、sorted?、collect

下一篇:java小白訓練營day04-流程控制:分支+回圈+例外

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more