Java進階之路
提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加
提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
目錄
- Java進階之路
- 前言
- 一、Java入門
-
- Java基礎
-
- 1、Java概述
-
- 1.1 什么是Java
- 1.2 java的發展史
- 1.3 java的特性和優勢
- 1.4 Java的跨平臺性
- 1.5 字節碼
- 1.6 JDK和JRE
-
- 1.6.1 JDK和JRE的區別
- 1.6.2 JDK安裝
- 2、Java基礎語法
-
- 2.1 基礎數據類型
-
- 2.1.1 計算機存儲單元
- 2.1.2 Java基本數據類型
- 3、面向對象
-
- 3.1 面向對象和面向過程
- 3.2 對象和類
-
- 3.2.1 對象內存圖
- 3.3 變量
-
- 3.3.1 成員變量
- 3.4 構造方法
-
- 3.4.1 構造方法概述
- 3.4.2 構造方法特點
- 4、字符串
-
- 4.1 String為什么是不可變的
- 4.2 字符串常量池
- 4.2 String.intern()
- 5、數組
- Java集合框架
- 二、Java進階
-
- java高級特性
- 多線程
-
- 1、初識多線程
- 2、進程和線程
- 二、使用步驟
-
- 1.引入庫
- 2.讀入數據
- 總結
前言
提示:這里可以添加本文要記錄的大概內容:
例如:隨著人工智能的不斷發展,機器學習這門技術也越來越重要,很多人都開啟了學習機器學習,本文就介紹了機器學習的基礎內容。
提示:以下是本篇文章正文內容,下面案例可供參考
一、Java入門
Java基礎
1、Java概述
1.1 什么是Java
java語言是SUN(Stanford University Network,斯坦福大學網絡公司 ) 1995年推出的一門高級編程語言,是一種面向Internet的編程語言。
Java一開始富有吸引力是因為Java程序可以在Web瀏覽器中運行。這些Java程序被稱為Java小程序(applet)。applet使用現代的圖形用戶界面與Web用戶進行交互。 applet內嵌在HTML代碼中。
隨著Java技術在Web層面的不斷成熟,已經稱為Web應用程序的首選開發語言。
java語言的三個平臺版本:
JavaSE: Java 語言的(標準版),用于桌面應用的開發,是其他兩個版本的基礎
JavaME: Java 語言的(小型版),用于嵌入式消費類電子設備
JavaEE: Java 語言的(企業版),用于 Web 方向的網站開發
1.2 java的發展史
- 1995年5月23日,Oak語言改名為Java,并且在SunWorld大會上正式發布Java 1.0版本。Java語言第一次提出了“Write Once,Run Anywhere”的口號。
- 1999年4月27日,HotSpot虛擬機誕生。HotSpot虛擬機剛發布時是作為JDK 1.2的附加程序提供的,后來它成為JDK 1.3及之后所有JDK版本的默認Java虛擬機。
- 2004年9月30日,JDK 5發布,工程代號為Tiger(老虎),是Java語言的發展史上的又一里程碑事件。JDK的版本不再是“1.x”的命名方式,而采用“JDK x”方式進行命名。
- JDK 8的第一個正式版本于2014年3月18日發布,從JDK 8開始,Oracle啟用JEP(JDK Enhancement Proposals)來定義和管理納入新版JDK發布范圍的功能特性。
- JEP 126:對Lambda表達式的支持,這讓Java語言擁有了流暢的函數式表達能力。
- JEP 104:內置Nashorn JavaScript引擎的支持,成為Java的嵌入式JavaScript引擎。
- JEP 150:新的時間、日期API。
- JEP 122:徹底移除HotSpot的永久代。
- ……
- JDK9于2017年9月21日發布。JDK 9發布后,Oracle隨即宣布Java將會以持續交付的形式和更加敏捷的研發節奏向前推進,以后JDK將會在每年的3月和9月各發布一個大版本。每六個JDK大版本中才會被劃出一個長期支持(Long Term Support,LTS)版,只有LTS版的JDK能夠獲得為期三年的支持和更新,普通版的JDK就只有短短六個月的生命周期。JDK 8和JDK 11是LTS版,再下一個就到2021年發布的JDK 17了。
- 2018年3月20日,JDK 10如期發布,這版本的主要研發目標是內部重構,諸如統一源倉庫、統一垃圾收集器接口、統一即時編譯器接口等,這些都將會是對未來Java發展大有裨益的改進。
- 2018年9月25日,JDK 11發布,這是一個LTS版本的JDK,包含17個JEP,其中有ZGC這樣的革命性的垃圾收集器出現,也有把JDK 10中的類型推斷加入Lambda語法這種可見的改進。
- 2019年2月,在JDK 12發布前夕,Oracle果然如之前宣布那樣在六個月之后就放棄了對上一個版本OpenJDK的維護,RedHat同時從Oracle手上接過OpenJDK 8和OpenJDK 11的管理權利和維護職責。
- 2019年3月20日,JDK 12發布,只包含8個JEP,其中主要有Switch表達式、Java微測試套件(JMH)等新功能,最引人注目的特性無疑是加入了由RedHat領導開發的Shenandoah垃圾收集器。Shenandoah作為首個由非Oracle開發的垃圾收集器,其目標又與Oracle在JDK 11中發布的ZGC幾乎完全一致,兩者天生就存在競爭。Oracle馬上用實際行動抵制了這個新收集器,在JDK 11發布時才說應盡可能保證OracleJDK和OpenJDK的兼容一致,轉眼就在OracleJDK 12里把Shenandoah的代碼通過條件編譯強行剔除掉,使其成為歷史上唯一進入了OpenJDK發布清單,但在OracleJDK中無法使用的功能。
- 2020年 3 月 17 日,JDK14 正式 GA(General Available),新增了Records、switch表達式(JDK 12和JDK 13中的預覽特性,現在正式使用)、文本塊等新特性。在JVM方面,棄用Parallel Scavenge和SerialOld GC組合、刪除CMS垃圾回收器。
1.3 java的特性和優勢
- 簡單性
與C語言不同,Java是一種面向對象編程的語言,他的底層借鑒了C++語言但又不是完全相同,Java語言并不支持多繼承、指針、go to 語句、操作符重載、頭文件等,但其語法基于C語言,免去了預處理操作。
- 面向對象
Java語言是一個面向對象的語言,基本思想是使用對象、類、封裝、繼承、多態等概念進行程序設計。每一個物體都可以成為一個對象,其本身具有唯一性,有各自不同的變化狀態,對Java來說,現有類,才有對象,對象是類實例化后的產物。
- 可移植性
不同于其他語言,Java優點在于自身的跨平臺和可移植性,在Java環境安裝好后,會自帶一個Java的虛擬機,它可以屏蔽掉不同操作系統之間的差異,實現了跨平臺運行Java程序。
- 高性能
在我們實際編寫項目中通常會用到一些Java中間件,像網關、緩存、負載均衡、數據庫、分布式架構等方面都有涉及,這都可以較快提高我們項目的性能,同時Java可以通過虛擬機來優化提升運行效率。
- 分布式
分布式系統是由多個互通節點組成在一起的系統,主要有增加系統容量、加強系統可用、擴展性高、通過服務模塊的拆分提升相應效率、團隊協作流程得到改善等優點。基于Java自身可以實現信息之間的通信,通常使用TCP/IP異步通信可以達到分布式的效果。
- 動態性
Java中的動態性主要體現在反射機制、動態字節碼操作、動態編譯、執行其他腳本編碼等方面,在后期建立各模塊之間的互通,這就意味著在現有的應用程序下可以實現各模塊之間的互連。
- 多線程
一個進程可以啟動多個線程,例如:我們可以將火車站看作一個進程而其中的每一個售票窗口可以看作一個線程,每一個線程都有一個單獨的棧空間,棧與棧之間互不干擾,各自執行各自的線程并發。
- 安全性
Java安全措施主要體現在面向對象的規范上,主要包括:封裝數據細節,只提供接口給用戶、在Java除了基本類型的操作外都是引用的操作、數組邊界檢查、強制類型轉換和語言對線程的支持。
- 健壯性
在Java中有一種機制:自動垃圾回收機制(GC機制),Java虛擬機負責調動該機制,不需要編碼者過多的干涉。
1.4 Java的跨平臺性
我們知道java有跨平臺的特性,即一次編譯處處運行,其實質是jvm在編譯java代碼時,會將代碼編譯成.class的字節碼文件,只要在不同的環境中安裝對應的JDK(其中包含jvm),我們就可以運行程序了。
其實java虛擬機不僅可以支持java語言,對于其他語言,我們都可以通過把它轉換成字節碼文件,最后轉換的字節碼文件都能通過Java虛擬機進行運行和處理。隨著Java7的正式發布,Java虛擬機的設計者們通過JSR-292規范基本實現在Java虛擬機平臺上運行非Java語言編寫的程序。
Java虛擬機根本不關心運行在其內部的程序到底是使用何種編程語言編寫的,它只關心“字節碼”文件。也就是說Java虛擬機擁有語言無關性,并不會單純地與Java語言“終身綁定”,只要其他編程語言的編譯結果滿足并包含Java虛擬機的內部指令集、符號表以及其他的輔助信息,它就是一個有效的字節碼文件,就能夠被虛擬機所識別并裝載運行。
1.5 字節碼
我們平時說的java字節碼,指的是用java語言編譯成的字節碼。準確的說任何能在jvm平臺上執行的字節碼格式都是一樣的。所以應該統稱為:jvm字節碼。
不同的編譯器,可以編譯出相同的字節碼文件,字節碼文件也可以在不同的JVM上運行。Java虛擬機與Java語言并沒有必然的聯系,它只與特定的二進制文件格式——Class文件格式所關聯,Class文件中包含了Java虛擬機指令集(或者稱為字節碼、Bytecodes)和符號表,還有一些其他輔助信息。
1.6 JDK和JRE
1.6.1 JDK和JRE的區別
- JVM(Java Virtual Machine),Java虛擬機,是整個java實現跨平臺的最核心的部分,能夠運行以Java語言寫作的軟件程序。包括了Java運行環境JRE、Java工具和Java基礎類庫。
- JRE(Java Runtime Environment),Java運行環境,包含了JVM和Java的核心類庫(Java API)
- JDK(Java Development Kit)稱為Java開發工具,包含了JRE和開發工具
1.6.2 JDK安裝
2、Java基礎語法
2.1 基礎數據類型
2.1.1 計算機存儲單元
我們知道計算機是可以用來存儲數據的,但是無論是內存還是硬盤,計算機存儲設備的最小信息單元叫“位 (bit)”,我們又稱之為“比特位”,通常用小寫的字母”b”表示。而計算機中最基本的存儲單元叫“字節(byte)”,
通常用大寫字母”B”表示,字節是由連續的8個位組成。
除了字節外還有一些常用的存儲單位,其換算單位如下:
1B(字節) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
2.1.2 Java基本數據類型
數據類型
關鍵字
內存占用
取值范圍
整數類型
byte
1
-128~127
short
2
-32768-32767
int(默認)
4
-2的31次方到2的31次方減1
long
8
-2的63次方到2的63次方減1
字符型
float
4
double(默認)
8
字符類型
char
2
0-65535
布爾類型
boolean
1
e35表示的是乘以10的38次方,同樣e-45表示乘以10的45次方,在java中整數默認是int類型
3、面向對象
3.1 面向對象和面向過程
- 面向過程:強調的是功能行為,以函數為最小單位,考慮怎么做。
- 面向對象:強調具備了功能的對象,以類/對象為最小單位,考慮誰來做。
- 面向對象設計程序(簡稱OOP):
3.2 對象和類
- 類:類是構造對象的模板或藍圖;就是將具有相似的行為或者屬性的事物抽象或者集合形成一個類;是抽象的、概念上的定義
- 對象:是實際存在的該類事物的每個個體,是類的實例
- 由類創建對象的過程稱為創建類的實例
3.2.1 對象內存圖
- 單個對象內存圖
- 多個對象內存圖
總結:多個對象在堆內存中,都有不同的內存劃分,成員變量存儲在各自的內存區域中,成員方法多個對象共用的一份 - 多個對象指向相同內存圖
總結:
當多個對象的引用指向同一個內存空間(變量所記錄的地址值是一樣的)
只要有任何一個對象修改了內存中的數據,隨后,無論使用哪一個對象進行數據獲取,都是修改后的數據。
3.3 變量
3.3.1 成員變量
成員變量(方法外、類內)的聲明格式:
【訪問修飾符】【類型修飾符】<數據類型>變量名
- 訪問修飾符:設置變量的訪問權限
訪問級別
訪問控制修飾符
同類
同包不同類(不含子類)
同包子類
不同包不同類
不同包子類
公開
public
受保護
protected
×
(注意)
默認
沒有訪問修飾符
×
×
私有
private
×
×
×
×
注:成員變量通常設置為private,然后在設置一些public權限的方法來設置、獲取成員變量的值,防止由對象直接訪問變量導致數據的錯誤、混亂或安全性問題。
3.4 構造方法
3.4.1 構造方法概述
在Java中,構造方法(Constructor)是一種特殊類型的方法,用于初始化對象
3.4.2 構造方法特點
- 方法名稱與類名相同:構造方法的名稱必須與類名完全相同。
- 沒有返回類型:構造方法沒有返回類型,甚至不寫 void。
- 在創建對象時自動調用:當使用 new 關鍵字實例化一個對象時,會自動調用該對象的構造方法。
- 可以有多個構造方法:一個類可以有多個構造方法,根據參數列表的不同來區分構造方法的重載。
4、字符串
4.1 String為什么是不可變的
String內部是一個使用final修飾修飾的字符數組,所以不可變
為何這樣設計:
-
安全性:字符串經常用于存儲敏感信息,如網絡連接的用戶名、密碼、URL等。如果字符串是可變的,那么這些信息可能會被惡意修改,從而導致安全問題。
-
線程安全:由于字符串是不可變的,所以它們在多線程環境中是安全的,不需要額外的同步。
-
哈希碼緩存:字符串是哈希映射(如HashMap和HashSet)中常用的鍵類型。由于字符串的內容不會改變,所以它們的哈希碼可以被緩存,而不需要每次使用時都重新計算。這可以提高哈希映射的性能。
-
字符串池:Java虛擬機(JVM)維護了一個特殊的內存區域,稱為字符串池(String Pool)。當你創建一個字符串字面量(如"Hello")時,JVM首先會檢查字符串池中是否已經存在該值。如果存在,JVM將返回對現有字符串的引用;否則,JVM將在字符串池中創建一個新的字符串。這種技術可以節省內存,因為相同的字符串字面量只需要存儲一次。
-
從源碼角度來看:String類的不可變性主要體現在其內部使用了一個私有的、最終的字符數組來存儲其值,并且沒有提供修改這個數組的方法。這意味著一旦一個String對象被創建,其內部的字符數組就不能被改變了。
4.2 字符串常量池
字符串常量池又稱為字符串池,全局字符串池(Spring Pool)。在工作中,String類是我們使用頻率非常高的一種對象類型。JVM為了提升性能和減少內存開銷,避免字符串的重復創建,其維護了一塊特殊的內存空間,就是字符串常量池。字符串常量池由String類私有保護。
4.2 String.intern()
/*** Returns a canonical representation for the string object.* <p>* A pool of strings, initially empty, is maintained privately by the* class {@code String}.* <p>* When the intern method is invoked, if the pool already contains a* string equal to this {@code String} object as determined by* the {@link #equals(Object)} method, then the string from the pool is* returned. Otherwise, this {@code String} object is added to the* pool and a reference to this {@code String} object is returned.* <p>* It follows that for any two strings {@code s} and {@code t},* {@code s.intern() == t.intern()} is {@code true}* if and only if {@code s.equals(t)} is {@code true}.* <p>* All literal strings and string-valued constant expressions are* interned. String literals are defined in section 3.10.5 of the* <cite>The Java™ Language Specification</cite>.** @return a string that has the same contents as this string, but is* guaranteed to be from a pool of unique strings.*/public native String intern();
由源碼可知,String.intern()是一個native方法,注釋大致意思是:如果常量池中存在當前字符串,就會直接返回當前字符串,如果常量池中沒有此字符串,會將此字符串放入常量池中,然后返回。
5、數組
Java集合框架
二、Java進階
java高級特性
多線程
1、初識多線程
多線程是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持能夠在同一時間執行多個線程,提升性能。
2、進程和線程
- 進程:
二、使用步驟
1.引入庫
代碼如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.讀入數據
代碼如下(示例):
data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
該處使用的url網絡請求的數據。
總結
提示:這里對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數據的函數和方法。