天天看點

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

Java後端必掌握知識系列文章

1.Java基礎—目前

2.資料庫基本知識

3.Web後端

4.JVM必掌握

5.Spring核心之IOC和AOP

6. 資料結構與算法基礎

文章目錄

  • Java後端必掌握知識系列文章
  • 前言
  • 一.i java相關
    • 1.java相比其他程式設計語言的優勢有那些?
    • 2.Java與C++的異同
    • 3.JDK JRE JVM?
    • 4.java代碼編譯執行過程
    • 5.如何了解面向對象程式設計的思想?
    • 6.面向對象的Solid原則
    • 7.淺拷貝和深拷貝的差別?
    • 8.java的無符号數?
    • 9.簡述JDK8的新特性
    • 9.什麼是反射(reflection)?
    • 10.關于java反射機制
    • 11.Class類的作用,如何擷取Class類的對象?
    • 12.什麼是注解?什麼是元注解?
    • 13.異常相關?
    • 14.泛型與泛型擦除?
    • .虛拟機棧和本地方法棧為什麼是私有的?
    • .簡單了解堆和方法區
    • .
  • 一.ii 計算機網絡原理
    • 1.
    • 2.
    • .網絡通信模型:OSI和TCP/IP
    • .HTTP/HTTPS協定
    • .DNS協定
    • .TCP/UDP協定
    • .GET和POST的差別?
    • .TCP三向交握
    • .TCP四次揮手
    • .
  • 一.iii 作業系統
    • 1.計算機基礎知識?
    • 2.作業系統簡述:
    • .
  • 二、java基礎
    • 1.java的基本資料類型?
    • 4.包裝類相關,自動拆箱與裝箱?
    • 3. i++與++i
    • 4. & &&和 | ||
    • 5.關于位運算?
    • 6.Java的常見關鍵字
    • 7.private 預設 protected public ?
    • .static關鍵字
    • . final finally finalize
    • .
    • 1.String類--->字元串相關?
    • 2.String StringBuffer StringBuilder ?
    • 3.字元串拼接方式?
    • 4.
    • 5.
    • 6.
    • 7.
    • .數組對比集合的劣勢?
    • .Java的主要集合類?Colletion Map?
    • .ArryaList LinkedList Vector?
    • .HashMap jdk1.7和1.8
    • .java8的ConcurrentHashMap?
    • 1.程序與線程的差別?
    • .
    • .線程安全性談一下?
    • .java如何解決線程安全性?
    • .sychronized和ReetronLock
    • .進行哪些操作會使線程釋放鎖資源?sleep wait yield join方法
    • .
    • .
    • .
    • .
    • .
    • .
    • .
  • 總結
    • 以上就是我所總結的java基礎知識彙總

前言

個人對Java基礎的一些知識彙總,相當于複習歸納總結吧。

一.i java相關

1.java相比其他程式設計語言的優勢有那些?

①跨平台性: “一次編寫,到處運作” win mac linux android;Java程式是通過JVM(java虛拟機)在系統平台上運作的

③面向對象程式設計語言:封裝、繼承、多态三大特性

②安全性:相對安全的記憶體管理和通路機制,避免大部分記憶體洩漏和指針越界。

③ 豐富的API(網絡程式設計 多線程程式設計),支援第三方類庫

④ 熱點代碼檢測和運作時編譯及優化,使程式随運作時間增長獲得更高性能

2.Java與C++的異同

①同:面向對象程式設計語言,都具封裝 繼承 多态的特性

②異:

i. java不提供指針來直接通路記憶體,更安全

iI. java的類是單繼承的,C++是多繼承;java通過接口來實作多繼承

iii. java有自動記憶體管理(JVM GC), 而C++沒有 需要手動釋放記憶體

iv. java字元/串不需要"\0"來表示結束

深入了解java的跨平台性:

強大的JVM: Java編譯器可生成與計算機體系結構無關的位元組碼指令,".class"檔案在任何機器上解釋執行,還可以動态地轉換成本地機器代碼,轉換是由JVM實作的,因為JVM是平台相關的,屏蔽了不同作業系統之間的差異。

3.JDK JRE JVM?

JDK: java development kit java開發工具。含有JRE 編譯工具(javac java javadoc)及其他指令

JRE: java runtim environment java運作時環境。含有JVM java核心類庫

JVM: java virtual machine java虛拟機(運作java .class位元組碼)

圖示

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

4.java代碼編譯執行過程

圖示

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結
Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

5.如何了解面向對象程式設計的思想?

對于面向過程和面向對象的程式設計思想,大多數同學可能無法較為深入的了解,下面就來談談這倆吧。

可以用我們生活上的兩大常見食物來舉例:蛋炒飯和蓋澆飯

①蛋炒飯展現的是面向過程的思想,加入油再加入蛋…最後一步加入米飯和雞蛋混在一起炒勻即可,但是不合胃口的話,隻有重做一份了

②蓋澆飯展現的是面向對象的思想,蓋澆飯隻需要在一碗煮好的米飯澆上一份菜即可,喜歡什麼口味的菜品,就澆什麼菜。極大地展現除了"高内聚、低耦合、可擴充的特性

封裝:封裝就是用不同的特性來描述一個對象。比如一個人張三,我們就可以用姓名、年齡、性别、愛好等等特性來描述他;

繼承:

多态:

6.面向對象的Solid原則

①單一職責: 一個類隻應承擔一種責任。讓一個類隻做一件事,如果需要承擔更多的工作,那麼分解就這個類,使分工明确,符合低耦合的設計思想

②開放封閉: 實體應該對擴充是開放的,對修改是封閉的。即可擴充(extension),不可修改(modification) java可以通過**接口(interface)**的方式實作開閉原則

③裡式替換: 一個對象在其出現的任何地方,都可以用子類執行個體做替換,且不會導緻程式的錯誤.

當子類可以在任意地方替換基類且軟體功能不受影響時,這種繼承關系才是合理的。

④接口分離: 客戶(client)不應被強迫依賴它不使用的方法。一個類實作的接口中,包含了它不需要的方法, 将接口拆分成更小和更具體的接口,有助于解耦,進而更容易重構、更改。

⑤依賴倒置: 依賴倒置是實作開閉原則的方法。

i.高層次的子產品不應依賴低層次的子產品,他們都應該依賴于抽象。

ii.抽象不應依賴于具體實作,具體實作應依賴抽象

——————————————————————————————————————————————————

7.淺拷貝和深拷貝的差別?

①淺拷貝:隻複制目前對象的基本資料類型及引用變量, 沒有複制引用變量指向的實際對象。修改克隆對象可能影響原對象,不安全。

②深拷貝:完全拷貝基本資料類型和引用資料類型,安全。

8.java的無符号數?

java中沒有所謂的無符号數,如int型資料 的取值為:-2^31 ~ 2^31 - 1(2147483647)

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

代碼示範

public static void main(String[] args) {
        int a = Integer.MAX_VALUE; // int最大值
        int b = Integer.MIN_VALUE; // int最小值
        System.out.println("a="+a); // 2147483647
        System.out.println("b="+b); // -2147483648
        System.out.println("a+1="+(a+1)); // -2147483648
        System.out.println("b-1="+(b-1)); // 2147483647
    }
           

運作結果,我們可以發現int的最大值+1會變成int的最小值,而int的最小值-1則會變成int的最大值

9.簡述JDK8的新特性

①接口中可以添加default 去修飾的非抽象方法,可以有方法體和内容。

②可以使用lambda表達式,減少代碼備援。

③函數式接口:使用**@FunctionalInterface注解标明,該接口有且僅有一個抽象方法**。

④方法引用:可以直接引用已有Java類或對象的方法或構造器,進一步簡化lambda表達式。

⑤stream流:用于解決已有集合/數組類庫的弊端,如有foreach周遊 filter過濾 map映射 concat合并等功能。

⑥增加日期相關的API

lambda表達式的簡易使用介紹:

————————————————————————————————————————————————

9.什麼是反射(reflection)?

在運作狀态中,對于任意一個類都能知道它的所有屬性和方法,對于任意一個對象都能調用它的任意方法和屬性,這種動态擷取資訊及調用對象方法的功能稱為反射。缺點是破壞了封裝性以及泛型限制。反射是架構的核心,SpringFramework系列架構大量使用java的反射機制

灰色

10.關于java反射機制

①利用反射可以通路類的私有屬性及方法

②反射會降低效率

③禁止安全檢查,可以提高反射的運作速度

11.Class類的作用,如何擷取Class類的對象?

在程式運作期間,Java 運作時系統為所有對象維護一個運作時類型辨別,這個資訊會跟蹤每個對象所屬的類,

虛拟機利用運作時類型資訊選擇要執行的正确方法,儲存這些資訊的類就是 Class,這是一個泛型類。

①Class klass = String.class; ② Class klazz = new String(“牛逼!”).getClass();

③Class clazz = Class.forName(“String”);

代碼示例

12.什麼是注解?什麼是元注解?

注解是一種标記,使類或接口附加額外資訊,幫助編譯器和JVM完成一些特定功能,如@Override辨別一個方法是重寫方法。

元注解是自定義注解的注解,例如:

@Target:限制作用位置,值是 ElementType 枚舉常量,包括 METHOD 方法、VARIABLE 變量、TYPE 類/接口、PARAMETER 方法參數、CONSTRUCTORS 構造方法和 LOACL_VARIABLE 局部變量等。

@Rentention:限制生命周期,值是 RetentionPolicy 枚舉常量,包括 SOURCE 源碼、CLASS 位元組碼和 RUNTIME 運作時。

@Documented:表明這個注解應該被 javadoc 記錄。

13.異常相關?

Throwable是所有異常類的基類,分為Error和Exception。Error是Java運作時系統的内部錯誤和資源耗盡而産生的錯誤,例如StackOverFlowError: 方法執行時建立的棧幀(存儲局部變量表)超出了棧的深度

OutOfMemoryError:heap space堆空間(存儲對象),巨大量的對象被建立這種異常程式無法處理。

public static void main(String[] args) {
	// 棧溢出 java.lang.StackOverFlowError
	main(args);
	// 堆溢出 java.lang.OutOfMemoryErro
	int[] arr = new int[1024 * 1024 *1024 * 1024];
}
           

Exception 分為checked和unchecked:受檢異常(編譯時異常)需要在代碼中顯式處理(try-catch throws),否則會編譯出錯;非受檢異常即RuntimeException運作時異常,不許要處理,在運作java程式後才可能會出現

受檢(checked)異常:① 無能為力型,如字段超長導緻的 SQLException。② 力所能及型,如未授權異常 UnAuthorizedException,程式可跳轉權限申請頁面。常見受檢異常還有 FileNotFoundException、ClassNotFoundException、IOException等。

非受檢(unchecked)異常:① 可預測異常,例如 NullPointerException、ClassCastException、NumberFormatException、 ArithmaticException、IndexOutOfBoundsException等,這類異常應該提前處理。② 需捕捉異常,例如進行 RPC 調用時的遠端服務逾時,這類異常用戶端必須顯式處理。③可透出異常,指架構或系統産生的且會自行處理的異常,例如Spring的NoSuchRequestHandingMethodException,Spring會自動完成異常處理,将異常自動映射到合适的狀态碼。

14.泛型與泛型擦除?

泛型本質是參數化類型,解決不确定對象具體類型的問題。泛型在定義處隻具備執行Object類方法的能力。

① 類型安全,放置什麼出來就是什麼,不存在ClassCastException。

② 提升可讀性,編碼階段就顯式知道泛型集合、泛型方法等處理的對象類型。

③ 代碼重用,合并了同類型的處理代碼。

泛型擦除

泛型用于編譯階段,編譯後的位元組碼檔案不包含泛型類型資訊,因為虛拟機沒有泛型類型對象,所有對象都屬于普通類。例如定義 List< Object > 或 List< String > ,在編譯後都會變成List 。

分割條

.虛拟機棧和本地方法棧為什麼是私有的?

為了保證線程中的局部變量不被别的線程通路到,虛拟機棧和本地方法棧是線程私有的。

①虛拟機棧:每個 Java 方法在執行的同時會建立一個棧幀用于存儲局部變量表、操作數棧、常量池引用等資訊。從方法調用直至執行完成的過程,就對應着一個棧幀在 Java 虛拟機棧中入棧和出棧的過程。

②本地方法棧:和虛拟機棧所發揮的作用非常相似,差別是: 虛拟機棧為虛拟機執行 Java 方法 (位元組碼)服務,而本地方法棧則為虛拟機使用到的 Native 方法服務。 在 HotSpot 虛拟機中和 Java 虛拟機棧合二為一。

.簡單了解堆和方法區

堆和方法區是所有線程共享的資源

堆:是程序中最大的一塊記憶體,主要用于存放新建立的對象 (所有對象都在這裡配置設定記憶體)

方法區:主要用于存放已被加載的類資訊、常量、靜态變量、即時編譯器編譯後的代碼等資料。

.

灰色

分割條

一.ii 計算機網絡原理

1.

灰色

2.

灰色

.網絡通信模型:OSI和TCP/IP

①OSI:實體層、資料鍊路層 、網絡層、 傳輸層、 會話層、表示層、應用層

②TCP/IP:實體+資料鍊路層、網絡層、傳輸層、 應用層

圖示

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

.HTTP/HTTPS協定

.DNS協定

測試

.TCP/UDP協定

測試

.GET和POST的差別?

GET在浏覽器回退時是無害的,而POST會再次送出請求。

GET産生的URL位址可以被Bookmark,而POST不可以。

GET請求會被浏覽器主動cache,而POST不會,除非手動設定。

GET請求隻能進行url編碼,而POST支援多種編碼方式。

GET請求參數會被完整保留在浏覽器曆史記錄裡,而POST中的參數不會被保留。

GET請求在URL中傳送的參數是有長度限制的,而POST麼有。

GET隻接受ASCII字元,而POST沒有限制。

GET比POST更不安全,因為參數直接暴露在URL上,是以不能用來傳遞敏感資訊。

GET參數通過URL傳遞,POST放在Request body中。

.TCP三向交握

測試

.TCP四次揮手

.

一.iii 作業系統

1.計算機基礎知識?

①馮*諾依曼計算機體系是計算機的基本結構,他也是計算機之父

③三大(商業)定律:

2.作業系統簡述:

測試

.

—————————————————————————————————————————————————

二、java基礎

1.java的基本資料類型?

如下圖所示,特别地boolean布爾類型用1byte存儲 如true:0000 0001

所示

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

java自動類型轉換

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

java的基本資料類型大小有明确規定,例如int隻為32(4bytes)位,而 C/C++ 中可能是16/32 位,也可能是編譯器開發商指定的其他大小。Java中數值類型有固定位元組數,二進制資料以固定格式存儲和傳輸,字元串采用标準的Unicode格式存儲。

4.包裝類相關,自動拆箱與裝箱?

包裝類:每個基本資料類型都對應一個包裝類,除了int和char對應Integer和Character外,其餘基本資料類型的包裝類都是首字母大寫即可。

①自動裝箱: 将基本資料類型包裝為一個包裝類對象,例如向一個泛型為Integer的集合添加int元素。

②自動拆箱: 将一個包裝類對象轉換為一個基本資料類型,例如将一個包裝類對象指派給一個基本資料類型的變量。

代碼示範如下:

Integer i1 = 66, i2 = 66, i3 = 0;
Integer i4 = new Integer(66);
Integer i5 = new Integer(66);
Integer i6 = new Integer(0);
System.out.println("i1==i2" + (i1 == i2)); // true
System.out.println("i1==i2 + i3" + (i1 == i2 + i3)); // true

System.out.println("i1==i4" + (i1 == i4)); // false
System.out.println("i4==i5" + (i4 == i5)); // false
System.out.println("i4.equals(i5)" + i4.equals(i5)); // true

System.out.println("i4==i5+i6" + (i4 == i5 + i6)); // true
System.out.println("40==i5+i6" + (40 == i5 + i6)); // true 
           

其中i4== i5+i6,會進行Integer對象的自動拆箱轉換為int類型來進行 數值的相加後進行數值相等比較

比較兩個包裝類數值要用equals,而不能用== 。所有的數值類型的包裝類都初始化為**-128~127**之間

3. i++與++i

i++: 先指派給i,後自增1

++i: 先自增1,後指派給i

代碼示例

在這裡插入代碼片
           

大量地執行這兩個運算符,記憶體上的消耗一緻嗎?

答案:一緻的

彙編層面的代碼 如下

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

4. & &&和 | ||

& &&: 兩者的運算結果一緻;前者為按位與,後者為短路與; 當符号左邊是false時,&繼續執行運算,而&&不再執行

| ||: 兩者的運算結果一緻,前者為按位或,後者為短路或; 當符号左邊是true時,&繼續執行運算,而&&不再執行

邏輯運算符如下圖

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

5.關于位運算?

如下圖

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

6.Java的常見關鍵字

如下圖

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

Java有沒有goto/const關鍵字? : 兩者都有,屬于保留字; 是關鍵字但是無法使用。

7.private 預設 protected public ?

①private:隻有在本類中才能通路。

②預設(不寫)包權限:在同包内能通路。

③protected:在同包内的類及包外的子類能通路。

④public:在任何地方都能通路。

.static關鍵字

灰色

. final finally finalize

①final: 修飾符(關鍵字),以修飾變量、方法、類,用來表示它修飾的類、方法和變量不可改變

i:修飾類該類不能被繼承,不能有子類!與abstract是反義詞

ii:修飾方法 該方法不能被子類重寫

iii:修飾變量該變量的必須有初值,且該變量隻能被讀取不可修改

②finally: 放在 try-catch的後面構造總是執行代碼塊,無論正常執行還是發生異常,隻要 JVM 不關閉都能執行,主要用于釋放外部資源

③finalize: Object的方法,使用 finalize()方法可以進行在JVM GC之前的必要工作。GC銷毀對象時調用的,通過重寫 finalize()方法可以整理系統資源或者執行其他清理工作。

.

灰色

————————————————————————————————————————————————

1.String類—>字元串相關?

String字元串是被final修飾常量的變量,底層為一個長度為16的char數組;

①String的建立方式:i.在常量池中直接拿對象 ii.在堆記憶體空間直接建立一個新的String對象

代碼示範:此處建立了幾個字元串?

建立了2個字元串

②**replace()**方法的使用

③intern()方法的:會查找在常量池是否存在一份相等的字元串,如果則傳回該字元串的引用,沒用則添加自己的字元串進入常量池。

代碼示例:

String s1 = new String("計算機");
		String s2 = s1.intern();
		String s3 = "計算機";
		System.out.println("s1 == s2: " + (s1 == s2)); // false
		System.out.println("s2 == s3: " + (s2 == s3)); // true, 常量池同一字元串 位址值相同
		System.out.println("s1 == s3: " + (s1 == s3)); // false
		System.out.println("s1.equals(s3): " + (s1.equals(s3))); // true
           

2.String StringBuffer StringBuilder ?

①String:不可變的字元序列,底層使用**char[]**存儲

②StringBuffer:可變的字元序列;線程安全的, 但字元拼接效率低;底層使用char[]存儲

i:建立StringBuffer對象時,底層為length=16的char[],擴容機制:為原來的2倍 + 2,後複制資料。

③StringBuilder:可變的字元序列;線程不安全的, 字元拼接但效率低;底層使用char[]存儲

i:底層原理基本與StringBuffer一緻 效率高!

3.字元串拼接方式?

①直接用 + 拼湊,底層用 StringBuilder 實作:隻适用小數量,如果在循環中使用 + 拼接,相當于不斷建立新的 StringBuilder 對象再轉換成 String 對象,效率極差。任何變量與字元串 + 拼接都會變成String字元串

② 使用 String 的 concat 方法,該方法中使用 Arrays.copyOf 建立一個新的字元數組 buf 并将目前字元串 value 數組的值拷貝到 buf 中,buf 長度 = 目前字元串長度 + 拼接字元串長度。之後調用 getChars 方法使用 System.arraycopy 将拼接字元串的值也拷貝到 buf 數組,最後用 buf 作為構造參數 new 一個新的 String 對象傳回。效率稍高于直接使用 +。

③ 使用 StringBuilder 或 StringBuffer的append方法,都繼承自 AbstractStringBuilder,該方法首先使用 Arrays.copyOf 确定新的字元數組容量,再調用 getChars 方法使用System.arraycopy 将新的值追加到數組中。StringBuilder 是 JDK5 引入的,效率高但線程不安全。StringBuffer 使用 synchronized 關鍵字保證線程安全。

4.

灰色

5.

灰色

6.

灰色

7.

灰色

.數組對比集合的劣勢?

①一旦初始化以後,其長度就不可修改。

②數組中提供的方法非常有限, 對于添加、删除、插入資料等操作非常不便, 且效率不高。

③擷取數組中某元素的個數的需求, 數組沒有現成的屬性或方法可用

④數組存儲資料的特點:有序、可重複。對于無序、不可重複的需求無法滿足。

.Java的主要集合類?Colletion Map?

①Colletion單列集合(存儲單列的資料),都可使用Iterator疊代器周遊資料,其主要有兩大實作:

i.實作接口List:存儲有序的、可重複的資料 —>“動态”數組

主要的實作類:ArrayList LinkedList Vector

ii.實作接口Set:存儲無序的、不可重複的資料 —>高中“集合”

主要實作類:HashSet LinkedHashSet TreeSet

②Map雙列集合(存儲key-value的鍵值對資料),其主要有實作:

HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

.ArryaList LinkedList Vector?

同:存儲有序的、可重複的資料---->都實作了 List 接口

①ArrayList: 作為List主要實作類, 線程不安全的 查詢效率高; 使用數組Object[] elementData存儲

I.JDK1.7:建立對象時,底層為length=10的Object數組;擴容:為原來的1.5倍,再複制資料到新數組

ii.JDK1.8:建立對象時,底層為的Object[] {}數組,add資料時[10];擴容:為原來的1.5倍,再複制資料到新數組

②LinkedList: 對于頻繁地插入、删除操作, 效率較高; 底層使用雙向連結清單存儲

③Vector: List的老實作類(jdk1.0), 線程安全的 效率低; 使用Object[] elementData存儲

灰色

.HashMap jdk1.7和1.8

1.8主要優化減少了Hash沖突 ,提高哈希表的存、取效率。

① 底層資料結構不一樣,1.7是數組+連結清單,1.8則是數組+連結清單+紅黑樹結構(當連結清單長度大于8轉為紅黑樹)。

②JDK1.8中resize()方法在表為空時建立表;在表不為空時,插入資料成功之後擴容;

而JDK1.7中resize()方法負責擴容 插入資料之前擴容,inflateTable()負責建立表。

③ 1.8中沒有區分鍵為null的情況,而1.7版本中對于鍵為null的情況調用putForNullKey()方法。但是兩個版本中如果鍵為null,那麼調用hash()方法得到的值是0

④ 當1.8尾插法 桶中元素處于連結清單的情況,周遊的同時最後如果沒有比對的,直接将節點添加到連結清單尾部;rehash時保證原連結清單的順序,1.8不容易出現環型連結清單

1.7頭插法在周遊的同時沒有添加資料,而是另外調用了addEntry()方法,将節點添加到連結清單頭部。

⑥ 1.7中是通過更改hashSeed值修改節點的hash值進而達到rehash時的連結清單分散,而1.8中鍵的hash值不會改變,rehash時根(hash&oldCap)==0将連結清單分散。

.java8的ConcurrentHashMap?

① 取消分段鎖機制,進一步降低沖突機率。

② 引入紅黑樹結構,同一個哈希槽上的元素個數超過一定門檻值後,單向連結清單改為紅黑樹結構。

③ 使用了更加優化的方式統計集合内的元素數量。具體優化表現在:在 put、resize 和 size 方法中設計元素總數的更新和計算都避免了鎖,使用 CAS 代替。

get同樣不需要同步,put操作時如果沒有出現哈希沖突,就使用 CAS 添加元素,否則使用synchronized加鎖添加元素。

當某個槽内的元素個數達到 7 且 table 容量不小于 64 時,連結清單轉為紅黑樹。當某個槽内的元素減少到 6 時,由紅黑樹重新轉為連結清單。在轉化過程中,使用同步塊鎖住目前槽的首元素,防止其他線程對目前槽進行增删改操作,轉化完成後利用 CAS 替換原有連結清單。由于 TreeNode 節點也存儲了 next 引用,是以紅黑樹轉為連結清單很簡單,隻需從 first 元素開始周遊所有節點,并把節點從 TreeNode 轉為 Node 類型即可,當構造好新連結清單後同樣用 CAS 替換紅黑樹。

1.程序與線程的差別?

①程序是作業系統資源配置設定的基本機關,而線程是處理器任務排程和執行的基本機關

②資源開銷:

每個程序都有獨立的代碼和資料空間(程式上下文),程式之間的切換會有較大的開銷;

線程可以看做輕量級的程序,同一類線程共享代碼和資料空間,每個線程都有自己獨立的運作棧和程式計數器(PC),線程之間切換的開銷小。

③包含關系:如果一個程序内有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是程序的一部分,是以線程也被稱為輕權程序或者輕量級程序。

④記憶體配置設定:同一程序的線程共享本程序的位址空間和資源,而程序之間的位址空間和資源是互相獨立的

⑤影響關系:一個程序崩潰後,在保護模式下不會對其他程序産生影響,但是一個線程崩潰整個程序都死掉。是以多程序要比多線程健壯

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

圖示

Java基礎知識Java後端必掌握知識系列文章前言一.i java相關一.ii 計算機網絡原理一.iii 作業系統二、java基礎總結

.

灰色

.線程安全性談一下?

灰色

.java如何解決線程安全性?

①通過volatile 修飾變量(不進行寄存器優化),可以實作線程之間的可見性,

避免變量髒讀的出現,底層是通過限制JVM指令的重排序來實作的适用于一個線程修改,多個線程讀的場景

②通過synchronized鎖(任意對象)來實作線程同步, 自動鎖的底層實作原理:

當有線程進入同步代碼塊之後,利用jvm的計數器将鎖的标記置為1,當别的線程再想進入的時候,發現鎖的标記為1, 該線程就去鎖池等待,當第一個線程出來之後,鎖的标記會置為0,之後cpu會随機配置設定一個線程再次進入同步代碼塊.

③通過lock鎖的機制, 進行手動lock和unlock, 但是這種很容易出現死鎖。注意加鎖以及解鎖的順序,就可以避免死鎖

--------死鎖的了解:A在等待 B也在等待,

④通過線程安全的集合類,可以解決并發問題:i.如ConcurrentHashMap CopyonWriteArrayList

ii.使用 Collections.synchronizedXxx() 方法給該集合加上鎖,傳回一個線程安全的集合。

⑤使用并發包(JUC)下面的原子類,底層使用的是CAS機制(樂觀鎖), 可以解決并發問題 atomicInteger線程安全的原子整型類

⑥:使用線程池來建立和管理線程, 也可以一定程度上解決并發問題

⑦:使用ThreadLocal來修飾變量,可以解決并發問題:多個線程會複制一份threadLocao變量的副本進行操作, 互不影響, 來保證的線程安全性

.sychronized和ReetronLock

灰色

.進行哪些操作會使線程釋放鎖資源?sleep wait yield join方法

①sleep(long time):讓正在執行的線程在一段指定時間内暫時不執行,線程進入阻塞态,不會釋放"鎖"

②wait():在其他線程調用對象的notify/notifyAll()方法前,緻使目前線程等待。線程會釋放它目前的"鎖資源",進而使得别的線程有機會搶占該"鎖"

③yield(): 使目前線程重新回到可執行狀态,是以執行yield()的線程有可能在進入到可執行狀态馬上又被執行。并不會釋放資源

④join(): 搶占主線程的鎖資源,等待目标線程的結束後,又繼續執行線程。主線程釋放了鎖資源,會調用**wait()**方法

.

灰色

.

灰色

.

灰色

.

灰色

.

灰色

.

灰色

.

灰色

總結

以上就是我所總結的java基礎知識彙總