常用監控命令-pidstat
Java基礎複習
Java語言特點
- 簡單易學;
- 面向物件(封裝,繼承,多型);
- 平臺無關性( Java 虛擬機器實現平臺無關性);
- 支援多執行緒( C++ 語言沒有內建的多執行緒機制,因此必須呼叫作業系統的多執行緒功能來進行多執行緒程式設計,而 Java 語言卻提供了多執行緒支援);
- 可靠性;
- 安全性;
- 支援網路程式設計並且很方便( Java 語言誕生本身就是為簡化網路程式設計設計的,因此 Java 語言不僅支援網路程式設計而且很方便);
- 編譯與解釋並存;
- 在企業級開發中有極其強大的生態
JVM
Java 虛擬機器(JVM)是執行 Java 位元組碼的虛擬機器。JVM 有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。(實現跨平臺的特性)。
.java檔案可以被Javac程式編譯成.class位元組碼檔案,JVM在將其解釋成機器可執行的機器碼。(JVM只面向位元組碼,只要符合JVM位元組碼規範的都可以執行,無論位元組碼是由Java檔案編譯過來還是python檔案都可以執行)
Java資料型別
Java具有確定的資料型別,它不像其它的程式語言一樣會隨著硬體的架構變換而變化,這也是Java比其他語言具有更好的可移植性的原因之一。
boolean 只有兩個值:true、false,可以使用 1 bit 來儲存,但是具體大小沒有明確規定。JVM 會在編譯時期將 boolean 型別的資料轉換為 int,使用 1 來表示 true,0 表示 false。JVM 支援 boolean 陣列,但是是通過讀寫 byte 陣列來實現的。
基本型別都有對應的包裝型別,基本型別與其對應的包裝型別之間的賦值使用自動裝箱與拆箱完成。以Integer為例
Integer x = 2; // 裝箱 呼叫了 Integer.valueOf(2)
int y = x; // 拆箱 呼叫了 X.intValue()
面試題
Integer x = new Integer(124); Integer y = new Integer(124); System.out.println(x == y); // false Integer z = Integer.valueOf(123); Integer w = Integer.valueOf(123); System.out.println(z == w); // true Integer k = 123; System.out.println(w == k); // true
x,y是兩個不同的物件,他們不相等可以理解,那麼為什麼z == w呢?這就涉及到Java裡面的快取池技術了。以Integer為例,Java會快取-128 ~127範圍內的物件,呼叫Integer.valueOf()會判斷傳入的值在不在範圍,若在直接返回快取池裡的物件
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
在 jdk 1.8 所有的數值類緩衝池中,Integer 的緩衝池 IntegerCache 很特殊,這個緩衝池的下界是 - 128,上界預設是 127,但是這個上界是可調的,在啟動 jvm 的時候,通過 -XX:AutoBoxCacheMax=
為什麼浮點型資料沒有快取池?
你能說出 0~1直接到底有多少個浮點型資料不?
Java引數傳遞
Java的引數傳遞都是值傳遞而不是引用傳遞,對應基本資料型別,Java會拷貝一份值,然後傳遞到形參中,對於引用資料型別Java會把引用的地址以值的形式傳遞給形參。
示例:
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
/*
*結果:
* num1 = 10;
* num2 = 20;
* a = 20;
* b = 10;
*/
分析
class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
func(dog);
System.out.println(dog.getName()); // B
}
private static void func(Dog dog) {
dog.setName("B");
}
}
// 結果: B
final關鍵字
- final關鍵字修飾類,類不能被繼承,類裡的所有方法都隱式的被final關鍵字修飾
- final關鍵字修飾方法,方法不能被重寫,private方法被final關鍵字隱式修飾
- final關鍵字修飾變數,變數就為編譯時常量,在執行時可以通過反射進行修改,若final變數賦予了初始值,在編譯期進行了優化 return (final) var ---> retunrn var的字面量。
static關鍵字
- 修飾成員變數和成員方法: 被 static 修飾的成員屬於類,不屬於單個這個類的某個物件,被類中所有物件共享,可以並且建議通過類名呼叫。被 static 宣告的成員變數屬於靜態成員變數,靜態變數 存放在 Java 記憶體區域的方法區。呼叫格式:類名.靜態變數名 類名.靜態方法名()
- 靜態程式碼塊: 靜態程式碼塊定義在類中方法外, 靜態程式碼塊在非靜態程式碼塊之前執行(靜態程式碼塊—>非靜態程式碼塊—>構造方法)。 該類不管建立多少物件,靜態程式碼塊只執行一次.
- 靜態內部類(static 修飾類的話只能修飾內部類): 靜態內部類與非靜態內部類之間存在一個最大的區別: 非靜態內部類在編譯完成之後會隱含地儲存著一個引用,該引用是指向建立它的外圍類,但是靜態內部類卻沒有。沒有這個引用就意味著:1. 它的建立是不需要依賴外圍類的建立。2. 它不能使用任何外圍類的非 static 成員變數和方法。
Java異常體系
Java異常分為Exceptions 和 Errors,他們都繼承與Throwable。
- Exception:程式能處理的異常,可以通過try,catch處理掉,其又分為受檢查Exceptions和非受檢查異常
- Errors:程式自己不能處理的異常,如記憶體溢位異常,棧溢位異常,發生這種異常虛擬機器會選擇結束掉執行緒
- 受檢查異常
Java 程式碼在編譯過程中,如果受檢查異常沒有被catch/throw
處理的話,就沒辦法通過編譯 。
除了RuntimeException
及其子類以外,其他的Exception
類及其子類都屬於受檢查異常 。常見的受 檢查異常有: IO 相關的異常、ClassNotFoundException
、SQLException
...。 - 非受檢查異常
Java 程式碼在編譯過程中 ,我們即使不處理不受檢查異常也可以正常通過編譯。
RuntimeException
及其子類都統稱為非受檢查異常,例如:NullPointerException
、NumberFormatException
(字串轉換為數字)、ArrayIndexOutOfBoundsException
(陣列越界)、ClassCastException
(型別轉換錯誤)、ArithmeticException
(算術錯誤)等。