JavaSE入門知識點講解

2020-08-11 16:48:59

一丶JAVA的概述與環境搭建

Java的歷史

Java之父:James Gosling,高司令

Java的各種版本

1995年推出JDK1.0

​ JDK8.0

Java的三大體系

A:JavaSE,Java Platform Standard Edition(Java平臺標準版)

B:JavaEE,Java Platform Enterprise Edition(Java平臺企業版),企業級開發

C:JavaME,Java Platform Micro Edition(Java平臺微小版)

Java的特點

1、純物件導向

2、簡單性

3、跨平臺:靠JVM

Java的執行機制 機製

1、解釋執行:

將原始檔一行一行解釋,一行一行執行。不同的操作系統具備不同的直譯器。

執行效率低。跨平臺。

2、編譯執行:

將原始檔編譯成機器碼檔案,一次編譯。多次執行。

執行效率高。不可跨平臺。

Java環境搭建

安裝JDK–>版本是8.0版本 設定環境變數

二丶JAVA語言基礎

註釋:

1、單行註釋

2、多行註釋

3、文件註釋

編碼規則:

語法要求:

1、組成:數位,字母,_,$,組成
2、數位不能開頭
3、區分大小寫
4、長度
5、不能是java中的關鍵字和保留字。

約定俗成:

見名知意

1丶變數:

變數的三要素:

  • 變數的數據型別
  • 變數的名字
  • 變數的值

定義變數的語法形式:

1.先宣告,再賦值

2.宣告和賦值寫一起

3.多個變數統一宣告,就是寫在一起宣告:同種型別

變數的注意點:

1、變數必須先定義,才能 纔能使用
2、變數名不能衝突,同一個作用域內。
3、目前所學的變數:先初始化,再使用。

2丶數據型別

整數型:

byte,位元組,1個位元組,8bit,-128~127

short,短整形,2個位元組,16bit

int,預設型別,4個位元組,32bit

long,長整形,8個位元組,64bit

在宣告long型別的時候,數值後加L或l。建議L。

浮點型:

float型別:4個位元組,32bit,定義變數的時候,數值後加f,或F

double型別:8個位元組,64bit,預設型別

布爾型別:

boolean型別:取值只有兩個,true(對,真),false(錯,假),

字元型:

char,表示單個的字元,使用單引號引起來的,但本質上是個數值,因爲對應的字元編碼值。

跳脫字元:

1、將有特殊作用的字元,轉爲普通的字元,不再起作用

2、還可以將一些普通的字元,轉爲有特殊含義的作用
\n,\t

參照型別:

String,用於表示一個字元序列。使用雙引號引起來的都是字串的內容

3丶數據型別的轉換:

自動轉換:

A:兩種型別相容
B:目標型別的取值範圍 大於 源型別取值範圍

強制轉換:

A:兩種型別相容
B:目標型別的取值範圍 小於 源型別的取值範圍

取值範圍:
byte–>short–>int–>long–>float–>double
char-int

4丶運算子:

算術運算子:+,-,*,/,%,++,–

賦值運算子:=,+=,-=,*=,/=,%=

關係運算符:也叫比較運算子,比較兩個數值的關係的。計算結果是boolean型別

邏輯運算子:運算元是boolean型別,計算結果也是boolean型別。

三元運算子:根據條件獲取一個結果。 語法:X ? Y:Z

5丶自動型別提升

[外連圖片轉存失敗,源站可能有防盜鏈機制 機製,建議將圖片儲存下來直接上傳(img-Mk1EYTV0-1597135689170)(C:\Users\Administrator\Desktop\javaSE\day4\課堂筆記\img\自動型別提升.png)]

6丶控制檯輸入

//step1:匯入Scanenr這個掃描器
imprt java.util.Scanner;
//step2:建立Scanner掃描器
Scanner sc = new Scanner(System.in);
//step3:使用sc呼叫對應的方法,來讀取鍵盤的輸入
int num1 = sc.nextInt();//讀取一個int型別的數據
double num2 = sc.nextDouble();//讀取一個double型別的數據
String str = sc.next();//讀取一個String型別的數據
char c = sc.next().charAt(0);//讀取一個char型別的字串

三丶選擇結構與分支語句

程式的流程結構

程式的流程結構:
A:順序結構:預設的,從上向下,逐行的執行。
B:選擇結構:條件滿足,某些程式碼纔會執行。
C:回圈結構:條件滿足,某些程式碼會反覆 反復多次的執行。直到條件不滿足。

1.1丶if語句

if(條件:boolean){
	//條件成立,執行此處的程式碼
}

1.2丶if…else語句

if(條件:boolean){
	//條件成立,執行此處的程式碼
}else{
	//條件不成立,執行此處的程式碼
}

1.3丶多個條件:

if(條件1){
	條件1滿足,執行此處的程式碼
}else if(條件2){
	條件1不滿足,條件2滿足,執行此處的程式碼
}else if(條件3){
	條件12都不滿足,條件3滿足,執行此處的程式碼。
}。。。
else{

}

1.4丶if語句的巢狀:

if(外層條件){
	if(內層條件){
	
	}else{
	
	}
}else{

}

2丶switch語句:

switch也是實現分支語句

switch(變數/表達式){
case 數值1:分支1breakcase 數值2:分支2breakcase 數值3:分支3breakdefault:最後一個分支;
}
注意點:

1、case後的數值,不能重複。

2、case是無序的,先寫後寫都可以,關鍵是是否能夠匹配上switch作用的變數。

3、switch作用的變數型別:short,byte,char,int,String。

4、default語句是可選的。

5、某個case匹配上後,如果該分支中沒有break,那麼後續的case都不再匹配,直接執行。一直到遇到break位置。

3丶區域性變數

區域性變數:定義在函數裏面的變數。

在一個變數的作用範圍內,任何的地方都可以直接使用該變數。不能定義相同名字的其他變數。區域性變數必須要賦值才能 纔能直接使用

四丶回圈結構

1丶概念

條件滿足,某些程式碼會被反覆 反復多次的執行。條件不成立了,回圈結束。0-n次。

回圈的組成部分
1、初始化部分:對回圈變數進行初始賦值。

2、回圈條件部分:判斷回圈變數是否滿足回圈條件。

3、回圈體部分:要回圈執行的具體的程式碼。

4、更新回圈變數部分:修改回圈變數的值。

2丶 while回圈

while( 回圈條件判斷 ){
	//回圈體
	//(回圈中變數的變化)
}
//執行流程:while回圈的特點:先判斷條件,再執行程式碼。
//CTRl+c終止回圈死回圈

3丶do-while回圈

do{
	//回圈體
	//(回圈變數的變化)
}while( 回圈條件 );
//執行流程:先執行一次再判斷

4丶for回圈

for(表達式1:回圈變數的初始化 ; 表達式2:回圈的條件 ; 表達式3:回圈變數的變化 ){
    //回圈體;
}
//執行流程:表達式一次判斷

5丶流程控制關鍵字

break關鍵字

break:詞義:打破,打碎,破壞
用法一:switch-case語句中,break用於防止switch穿透。
用法二:回圈語句:whiledo-whilefor。強制結束了回圈語句,無論回圈條件是否滿足。

continue:

continue:詞義:繼續

用法:結束當前這次回圈,回圈下次會繼續執行。

6丶回圈巢狀

多種回圈,指的就是回圈的巢狀。
特點:外層回圈執行1次。記憶體回圈要完整的執行一遍。

7丶佔位符:

printf(" 佔位符 \n",型別的變數);//格式化列印:print+format
	%d,整數佔位符
    %s,字串佔位符
    %f,浮點佔位符
        %.2f,%.3f
    %c,字元佔位符

五丶函數/方法

1丶函數/方法的概念

Java中的方法,類似於其他語言的函數,一段用來完成特定功能的程式碼。這段程式碼可以被多次呼叫並執行。
函數:function
方法:method

2丶方法的使用

step1:方法宣告,只是做一個方法宣告,裏面寫清楚方法的程式碼。但是這些程式碼並不執行。
step2:方法的呼叫,呼叫幾次,方法中的程式碼就執行幾次。

3丶方法的語法

1.宣告一個方法的語法:

2.宣告方法的語法格式:
[修飾符1,修飾符2…] 返回值型別 方法名(形式參數){
方法體;//方法中的程式碼
}

4丶函數的定義

public static void 函數名稱(){
//函數主體
}
//定義函數的位置:與main函數並列
//函數呼叫,通過函數名稱進行呼叫

5丶函數的參數

  • 形式參數:簡稱叫形參。宣告方法的時候,用於接收外部傳入的數據。
  • 實際參數:簡稱叫實參。呼叫方法的時候,給形參所賦值,實際的數據。
返回值:

返回值只能返回一個

return語句:

return語句有兩個作用
1、將一個方法的結果返回給呼叫處。
2、結束該方法的執行。

方法:方法分爲無參和有參

6丶遞回函數

遞回:英文單詞:Recursion

遞回演算法:

  • 方法自己呼叫自己
  • 要有出口,逐漸的向出口靠近

六丶陣列

1丶陣列的概念

就是一組相同數據型別的數據。記憶體上是開闢的連續的記憶體空間。

2丶陣列的宣告與賦值

方式一:數據型別[] 陣列名 = new 數據型別[長度];

A:先宣告,再建立(分配記憶體空間)
B:宣告並建立
C:宣告,建立,並賦值
數據型別[] 陣列名 = {數值1,數值2,數值3,數值4.。。。};
D:宣告,建立,並賦值
數據型別[] 陣列名 = new 數據型別[]{數值1,數值2,數值3,數值4.。。。}

3丶陣列的遍歷

遍歷:依次存取,從第一個元素,存取到最後一個元素。
1、使用回圈來遍歷陣列
for(int i = 0;i < arr.length; i++){
	arr[i] = i;//賦值
	System.out.println(arr[i]);//獲取數值
}

4丶for-each回圈

for(數據型別 變數名 : 陣列名){
    System.out.println(變數名);
}
工作原理:
for(int e :arr){
    System.out.println(e);
}

5丶陣列中的預設值

陣列的預設值,就是陣列建立後,裏面儲存的預設的數據。
陣列中是有預設值的
			整數:0
			小數:0.0
			字元:\u0000
			布爾:false
			其他:null

6丶陣列作爲參數

陣列是參照型別:傳遞的是地址。就是參數也會指向這塊記憶體。當方法結束的時候,參數就銷燬了。

class Test5ArrayMethod 
{

	//設計一個方法,用於列印陣列
	public static void printArray(int[] arr){//int[] arr = a;a的地址給了arr,那麼arr和
       // a指向同一塊記憶體的陣列
		for(int e : arr){
			System.out.print(e +"\t");
		}
		System.out.println();
	}

	public static void main(String[] args) 
	{

		int[] a = {1,2,3,4,5};

		//設計一個方法,用於列印陣列
		printArray(a);//將a的地址,傳遞給arr
		System.out.println("Hello World!");
	}
}

7丶陣列作爲返回值

//設計一個方法,用於建立一個數組, 並賦值。陣列要返回給呼叫處
public static int[] createArray(int len){
		int[] arr = new int[len];
		for(int i = 0;i <arr.length;i++){
			arr[i] = i * 2;
		}
		return arr;
	}

8丶陣列的排序

1、氣泡排序:

Bubble Sort 原理:比較相鄰的兩個數,將較大的數,向後移動。

class Test7BubbleSort 
{
	public static void main(String[] args) 
	{
		int[] arr = {15,23,8,10,7};
		
		for(int i= 1; i<arr.length;i++){//控制輪數:
			//i=1,2,3,4
			/*
			i=1,	j<4
			i=2,	j<3
			i=3,	j<2
			*/
			for(int j = 0;j < arr.length - i;j++){
				if(arr[j] > arr[j+1]){
					//交換
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}

		for(int i = 0;i<arr.length;i++){
			System.out.println(arr[i]);
		}

	}
}

2丶選擇排序

思路(升序):每次找個基準值,定一個變數k表示比較小的值的下標。每輪比較完,都在基準值上放一個比較小數。

int[] a = {15,23,8,10,7};
for(int i= 0;i <a.length - 1;i++){//控制輪數,趟數
    int k = i;
    for(int j = k + 1;j<a.length;j++){
        if(arr[k] > arr[j]){
            k = j;
        } 
    }
    //交換
    if(k != i){
        int temp = arr[k];
        arr[k] = arr[i];
        arr[i] = temp;
    }
}

3丶工具類:Arrays

JDK提供好的類:
A:Scanner,讀取鍵盤
B:String,字串
C:Math,數學的
D:Arrays,提供陣列的常規操作的
E:System,

9丶陣列的複製

就是將一個數組的數據,複製到另一個數值中。

方法一:通過回圈,依次複製,將原陣列的數據,一個一個,複製到目標陣列中
方法二:Arrays類裡方法:copyOf(原陣列,新陣列的長度)–>返回值是新陣列
方法三:System類裡的方法:arraycopy(原陣列,原陣列位置,新陣列,新陣列位置,拷貝的個數)

10丶二維陣列

int[][]i={{}{}{}};

七丶面向對向

1丶Java中定義類的格式

/*
class ClassName{//類名首字母大寫
	//屬性描述:外部特徵
	//行爲描述:能夠幹啥
}
*/

2丶記憶體分析

package com.qf.demo01;

public class Test1Person {

	public static void main(String[] args) {
		//step1:建立Person類的物件
		//語法:類名 物件名 = new 類名();
		
		Person p1 = new Person();
		System.out.println(p1);//列印p1的值,p1是參照型別,列印都是p1指向的物件的地址。
		
		System.out.println(p1.name);
		System.out.println(p1.age);
		System.out.println(p1.sex);
		
		
		
		
		/*
		 * com.qf.demo01.Person@15db9742
		 * 包名.類名@編碼值	---->理解爲p1的記憶體地址。
		 * 
		 * java中的數據型別:
		 * 	基本型別:byte,short,char,int,long,bolean,float,double
		 * 	參照型別:
		 * 			陣列,類類型別
		 * 
		 */
		//step2:通過物件存取屬性,語法是.
		//給物件的屬性,進行賦值
		p1.name = "王二狗";//給p1這個物件的name屬性進行賦值
		p1.age = 18;
		p1.sex = '男';
		
		
		//獲取物件的屬性值
		System.out.println("姓名:"+p1.name);
		System.out.println("年齡:"+p1.age);
		System.out.println("性別:"+p1.sex);
		
		
		//step3:通過物件,存取成員方法--->理解爲就是物件呼叫成員方法
		p1.eat();
		p1.sleep();
		p1.daDouDou();
		
		
	}

}

3丶方法的過載:overload

如何判定多個方法是否是過載的?衡量標準,要同時滿足以下三條:
	A:必須同一個類中。
	B:方法名稱必須一致。
	C:參數列表必須不同。(順序,個數,型別)

4丶構造方法

構造方法:是一個很特殊的方法。

  • 宣告的語法:public 類名(){}
    • 修飾符:只能有存取許可權的修飾符,public。不能加static。
    • 返回值:沒有返回值,也不能寫void。
    • 方法名:必須和類名相同
  • 呼叫的方式:new 關鍵字呼叫
    • new關鍵字後面跟着構造方法即可。
  • 作用:專門用於建立物件。

普通方法:一段具有特殊功能的程式碼。而且可以被多次呼叫執行。

自定義的構造方法
語法規則:
public 類名(){

}
public 類名(參數列表){
	將參數的數值,賦值給屬性即可。
}
//分爲有參和無參夠構造
對比一下構造方法和普通方法:
序號 對比點 構造方法 普通方法
1 返回值 沒有,也不能寫void 必須寫返回值型別,沒有就寫void
2 方法名 必須和類名一致 見名知意
3 參數列表 —— ——
4 修飾符 最多隻能存取許可權:public 存取許可權public,還有其他,比如static
5 呼叫 必須使用new關鍵字 沒有static,類中的成員方法。物件.方法 有static,直接方法名。
6 作用 專門用於建立物件,並且可以初始化屬性的值。 實現特定的功能
7 執行 每當建立一個物件,就會呼叫一次,執行1次 通過方法名,呼叫幾次就執行幾次。

5丶this關鍵字

this的用法一:表示當前物件。

this的用法二:this()指代當前類的構造方法。

六丶匿名物件

匿名物件,就是隻有=右側,沒有=左側。
new 構造方法(必要的參數);

八丶三大特性

1丶封裝性

1.private關鍵字

修飾符:public,private,static,final,abstract。。。

2 getter和setter方法

使用了private存取許可權修飾符,限制了只能在類中使用。那麼對於外部的物件,如何給屬性進行操作?賦值,取值。

使用setter方法,給屬性進行賦值。

使用getter方法,獲取屬性值

2丶繼承性

Java中的繼承的概念

​ 繼承指的是兩個類的關係。如果一個類(子類),繼承了另外一個類(父類別)。那麼子類就可以直接使用父類別的非私有化的成員(屬性,和方法)

繼承的好處

1、實現程式碼的重用和擴充套件。

2、模擬現實世界的關係。

類的繼承:

關鍵字:extends,詞義:擴充套件的。描述兩個類的關係:子類,父類別。

繼承的注意點

1、兩個類存在了繼承關係。
子類可以使用父類別的屬性和方法
但是父類別不能使用子類的屬性和方法。
2、Java語言的繼承是侷限性:單繼承。
一個子類,只能有一個父類別。
Java語言,不允許多繼承,但是可以多層繼承。
一個父類別,爺爺類,太爺爺,祖爺爺。。祖宗。。
一個父類別是可以有多個子類的。

子類物件的建立過程

呼叫子類的構造方法中,先呼叫父類別的構造方法。預設父類別的無參構造方法。

super關鍵字

用法一:表示父類別的構造方法。super(),表示父類別的構造方法。同this()相類似。

3丶方法的重寫

1、繼承結構中。
2、方法的宣告,必須和父類別的一致。
	方法名必須和父類別一致
	參數列表必須和父類別一致
	返回值必須和父類別一致
3、存取許可權,不能比父類別更加嚴格。
4、子類重寫的方法,不能拋出比父類別更大更多的異常。

4丶存取許可權修飾符

private:私有的。本類中。

protected:受保護的。本類,同包下,不同包(子類使用)

public,沒有限制的。

預設的:(default):注意,啥修飾符都不寫,就是預設的。本類。同包下可以存取。

5丶物件的多型性

一個父類別兩個兒子 2個子類都可以重寫父類別的方法

6丶向上轉型和向下轉型

向上轉型:一個子類物件看成了父類別型別。那麼就失去了子類新增。

Animal a2 = new Cat();//

九丶三個修飾符

1丶abstract關鍵字

表示抽象的意思。

abstract class Animal{
	public abstract void run();//只有宣告, 沒有實現,那麼就是抽象方法。
}

public static void main(String[] args){
    //對於抽象類,不能建立物件
    //Animal a = new Animal();
	//a.run();
}
//最大目的強制子類重寫方法
//抽象類不能有物件

2丶final關鍵字

詞義:「最終的,最後的」。可不可以把final理解成最後的,誰都不能更改。

1、final修飾變數(成員變數和區域性變數),則爲常數,只能賦值這一次

2、final修飾方法,則該方法不能被子類重寫

3、final修飾類,則類不能被繼承

3丶static關鍵字

1、修飾屬性【重點】

靜態的屬性:屬於類,僅一份。所有的物件共用。

2、修飾方法【重點】

靜態的方法:屬於類,由類直接呼叫,方法裡不能存取物件的內容(屬性,方法),以及this和super關鍵字。

​ 繼承中,子類可以繼承父類別的靜態方法,但是不能重寫。

3、修飾程式碼塊

4、修飾內部類

4丶程式碼塊

區域性程式碼塊

構造程式碼塊

靜態程式碼塊 加static

同步程式碼塊 多執行緒

​ {

}

十丶介面

1丶什麼是介面

介面就是一種能力和約定。一種協定,一種規則。

2丶介面的內容

A:介面中,包含靜態常數,預設的(預設)修飾符:public static final
B:介面中,包含抽象方法,預設的(預設)修飾符:public abstract

3丶介面的語法

//1.定義一個介面
interface 介面名{
    //靜態常數
    //抽象方法
}
//2.需要實現類來實現介面:類比子類繼承抽象類。
class 實現類 implements 介面名{
    //重寫介面中的抽象方法
}
//3.建立實現類的物件

4丶介面參照

介面型別的參照 = new 實現類的物件

5丶介面注意點

1、介面可以多實現:一個實現類可以同時實現多個介面

2丶介面可以多繼承

3、一個類如果實現介面了,還能繼承其他的父類別嗎?可以的

4、如果一個類沒有實現介面中的所有的方法,那麼它是抽象的

5丶介面的好處

A:降低了程式的耦合性。程式碼的關聯程度。
介面中只做功能的宣告,沒有具體的實現。
面向介面程式設計:關心功能有哪些
B:定義的都是規則,對外暴露的功能是一致。
C:介面可以多繼承,以及多實現,使用更靈活。

6丶介面回撥

首有個介面A,和它 實現類。然後在另一個類B中,持有A的參照,那麼在B類中可以呼叫介面A的方法。這就是一種回撥。

十一丶常用類

1丶類和類的關係

1、繼承關係

2、實現關係

3、依賴關係

public class Pet{}
public class Girl{
    public void play(Pet pet){
        
    }
}

4、關聯關係

public class Book{}
public class Person{
	Book book;
}

特殊的關聯關係:聚合,組合。。。

2丶匿名內部類

匿名內部類:沒有名字的內部的類。

interface A{
	public void test();
}

//A a = new 實現類物件;
A a  = new A(){//從此處開始,就是匿名的呢不累
    public void test();
};//到此處結束
a.test();

一般匿名內部類適合:使用一次,建立一次物件。

3丶Object類

Object類是所有類的基礎類別。所以只要是Java中的類的物件,預設都可以執行Object類中的方法。

A:getClass()–>Class,未完待續—>反射

B:hashCode()—>int,獲取物件的雜湊碼

C:toString()—>String,返回一個物件的字串表示形式

D:equals()–>boolean,用於比較兩個物件是否相等。

Object類中,equals()方法的原始碼:
//在方法中this,就指代了c1物件   
public boolean equals(Object obj) {//Object obj = c2;
   return (this == obj);
}

c1.equals(c2);//false

子類重寫:重寫的規則

​ 應該比較物件的各個屬性值即可,如果都相同,那麼認爲是相同的物件,最終返回true,否則返回false。

c1.equals(c2);
/*
分析:
this-->c1
obj-->c2,向上轉型
Cat c2 = new Cat();
c1.equals(c2);//Object obj = c2;
*/
//step1:先比較地址:c1和c2 的地址:this == obj,如果地址相等,直接返回true。
//step2:判斷,obj == null? obj--->Cat
//step3:比較對應的屬性是否相等
		this.各種屬性和
        obj--->向下轉型:c2.各種屬性

4丶8種包裝類

序號 基本數據型別 對應的包裝類
1 byte java.lang.Byte
2 short java.lang.Short
3 int java.lang.Integer
4 long java.lang.Long
5 float java.lang.Float
6 double java.lang.Double
7 char java.lang.Character
8 boolean java.lang.Boolean

5丶String類

1丶StringBuffer類

new StringBuffer();//預設的緩衝區大小16個字元
new StringBuffer(int capacity);//也可以自己指定容量大小
new StringBuffer(String s);//StringBuffer物件建立好,並且裏面還儲存了字串
//在String基礎上增加的add新增 delete刪除  reverse修改

2丶StringBuilder類

StringBuilder類提供的方法,和StringBuffer功能相同。

它們的區別:

​ StringBuffer是執行緒安全的,效率比StringBuilder低一些。JDK1.0

​ StringBuilder執行緒不安全。效率比StringBuffer高一些。JDK1.5

3丶math類

Math類:和數學相關:PI,abs(),ceil(),floor(),round(),random()。。

4丶Random類:

亂數

5丶BigDecimal類

大小數。精準的計算。double,float

6丶Date類

Date類中的很多獲取日期,時間等等的方法, 都被Calendar類所提供替代。

7丶 SimpleDateFormat類

/*
		 * SimpleDateFormat類:
		 * Date-->String:日期格式化?就是將一個日期Date物件,按照指定的字串格式去顯示。
		 * 		format(),根據模板,將date日期,轉爲String字串型別
		 * 		1.建立SimpleDateFormat物件。可以通過構造方法指定模板(格式):"yyyy-MM-dd"
		 * 			如果沒有指定模板,使用系統預設:20-4-16 上午11:09
		 * 		2.sdf.format(date)-->String
		 * 
		 * 
		 * String-->Date:解析?就是將一個文字字串,解析成一個Date物件。
		 * 		parse(),根據模板,將字串解析爲對應的日期物件,異常。
		 * 		1.同上
		 * 		2.sdf.parse(String)-->date
		 */

8丶Calendar類

Calendar類是抽象的。GregorianCalendar子類。

獲取日期時間,也可以設定日期時間。

//step1:建立Calendar類的物件。
Calendar calendar = new GregorianCalendar();//方式一
Calendar rightNow = Calendar.getInstance();//方式二
//step2:
//獲取類
calender.get(YEAR,MONTH,DAY_OF_MONTH,DAY_OF_WEEK,HOUE,MINUTE....);
//設定
calendar.set();

十二丶集合

1丶集合的概念

動態儲存多個物件。

物件:集閤中所儲存的數據,僅限於物件。

  • 參照型別,能夠儲存
  • 基本型別,裝箱----->包裝類型別,可以儲存。

2丶Collection介面

集合框架的最大的父介面:規定的都是集合容器最基本的功能。

3丶list介面與實現類

1丶List介面

​ 爲Collection介面的子介面,也是一種容器。但是有自己的獨特的儲存特點。

遍歷一個List介面中的所有元素:

  • for-each,增強for回圈
  • Iterator,迭代器
  • 普通的for回圈,結合get()方法。

2丶ArrayList實現類

作爲List介面的實現類,將介面中的方法全部實現。

底層:陣列的結構來實現的。也會有人叫動態陣列。

理解爲ArrayList相當於一個可變長度的陣列,存取遍歷效率較高。增加,刪除元素,效率較低。

3丶LinkedList實現類

作爲List介面的實現類,將介面中的方法全部實現。同時還實現了Deque雙端佇列中的方法。

queue:佇列。排隊,佇列
deque:雙端佇列,全名:double-ended queue

棧:

模擬棧的結構:後進先出(LIFO),棧頂元素,
push(),壓棧,入棧,pop(),彈棧,出棧

佇列:

模擬佇列的結構:先進先出(FIFO),隊頭元素
offer(),poll()

4丶set介面和實現類

1丶set介面

Set詞義:數學中集合的概念。也是Collection的子介面。

2丶hashset實現類

底層是由雜湊表實現。它不保證迭代的順序。特別是不保證順序一直不變。

真正判斷元素是否是重複,是否是相同的:看equals()。

  • Object類:equals()–>boolean,判斷物件是否相等。

  • 子類是否重寫:

    ​ String,Integer,Date,。。。。

HashSet集合去重的流程**:

step1:先獲取物件的hashCode,物件的雜湊值不同,直接儲存到HashSet容器中。

step2:如果雜湊值相同,呼叫equals()比較。

​ true:認爲是相同的元素,不儲存

​ false:不同的元素,儲存

原則:hashCode()和equals()的原則:

重寫的規則:
重寫的規則:
hashCode()
	物件相同,屬性值相同。雜湊碼必須相同。
	物件不同,屬性值不同。雜湊碼儘量不同。
	
equals()
	物件相同:屬性值相同。必須true。
	物件不同:屬性值不同。必須false

3丶TreeSet實現類

也要去除重複的元素。可以給儲存的元素進行整理排序。

預設的規則:Comparable介面,定義排序的規則。

interface Comparable{
	int compareTo(T obj);//排序的規則
}

4丶LinkedHashSet集合

回憶:HashSet儲存特點?1、無序。2、去重

HashSet儲存數據,記錄儲存的順序。

儲存原理同HashSet相同,但是外層套了一個鏈表結構。用於記錄儲存的順序。

5丶Comparable介面

  • 正數:o1 > o2,將o1排在o2的後面。
  • 負數:o1 < o2,將o1排在o2的前面。
  • 零:認爲o1和o2相同,不儲存了。

僅有唯一的一個方法:compareTo()–>此方法用於排序,返回值int型別型別

預設的TreeSet集合,使用的是Comparable介面,來給物件進行排序。以及去重。

6丶Comparator介面

int compare(T o1, T o2) 
比較其兩個參數的順序。
    比較的兩個物件:o1和o2
  • 無參構造:new TreeSet();–>使用預設的比較器:Comparable
  • 有參構造:new TreeSet(Comparator)–>使用自定義的比較器:Comparator

7丶Map介面與實現類

1丶map介面

map每次操作的元素是成對的。兩個:key(鍵),value(值)。

map中儲存的元素,鍵值對。其中鍵不能重複。值可以重複。鍵和值,必須是一一對應的。

put(key,value);向map中新增鍵值對,鍵不能重複。如果鍵重複了,那麼value會被覆蓋的。

2丶HashMap實現類

HashMap集合——>key如何去重?原理同HashSet相同。

HashSet集合——>如何去重?step1:hashCode(),step2:equals()

3丶TreeMap實現類

​ 對比TreeSet和TreeMap

1、都要求物件具有可比性。
	TreeSet來講:裏面所儲存的元素,能夠進行比較大小。
	TreeMap來講,所儲存 key,能夠進行比較大小。
2、區別於HashSet和HashMap,要給排序。從小到大排序。
	Comparable介面:預設的
	Comparator介面:自定義

4丶Map.Entry map沒有迭代器就要用Entry

​ Entry可以認爲是一個鍵值對物件。理解爲:將鍵值對看成一個整體的物件。包含了Key,Value。

Map中操作的是一對物件。key和value。存在一個對映關係。對應的。

對於map集合,無法直接迭代獲取裏面的元素。

5丶LinkedHashMap實現類

記錄了儲存的順序。去重的原理和HashMap相同。

6丶HashTable是map的實現類

HashTable的父類別是:Dictionary

HashMap的父類別是:AbstractMap

HashTable是舊的類,執行緒安全,效率低

對於null的處理:

  • HashMap對null,看成了普通的物件。可以key爲null,也可以value爲null
  • HashTable對null沒有進行處理。拋出異常:NullPointerException
1丶Properties是HashTable子類

集合儲存物件的,Properties儲存屬性資訊。

將屬性集合Properties中的數據——>file檔案中

8丶泛型限定 -泛型Generics<>

1、泛型應用在集合上。
List<String> list = new ArrayList();
list.add(String);//儲存String型別
2、泛型應用在類上。
class 類名<T>{
	//T這個型別,當建立物件的時候決定好。
}
3、泛型作用在靜態方法上
//3.<M>,靜態方法上自己獨立宣告泛型,不能使用類的。
	public static <M> M test(M m){
		System.out.println(m);
		return m;
	}
4、泛型的限定:集閤中

List<?>,List

5、不允許使用泛型的地方
  • 靜態屬性:private static T member;//錯誤的

  • 建立T的範例:T t = new T();//錯誤

  • 自定義異常,不能使用泛型

    class MyException extends Exception

9丶Collections工具類

Collections:集合的工具類,包含了集合的常用方法。

10丶迭代器Iterator

Iterator i1=new Iterator();

while(i1.hasNext()){

System.out.println(i1.next())

}

十三丶異常 Exception

1丶異常的概念:

概念:在程式執行的時候,程式碼中產生的不正常事件,導致程式無法正常的執行。

2丶異常的分類

Throwable類:可拋出的。

Exception:異常

1.受檢異常----必須處理,程式才能 纔能執行。

2.非受檢異常,又叫執行時異常-----程式碼中的邏輯問題導致的異常。

3丶捕獲異常 try必須存在 catch可以不用存在

子類異常不能大於父類別異常

try{
	//try語句塊中,有可能產生異常的程式碼,嘗試着執行
}catch(異常型別1 e){
	//對例外處理
}catch(異常型別2 e){
	//
}...
finally{
	//此處的操作是可選的,
	這裏的程式碼,一定會被執行的。。
}

4丶拋出異常

public void test()throws 異常型別1,異常型別2...{

}

5丶throws關鍵字和throw關鍵字

throws:用於一個方法的對外宣告:用於表示該方法不處理異常,交由呼叫處進行處理。

throw:用於程式碼中主動拋出一個異常物件:設計一個方法的功能的時候,根據邏輯分析,可以主動拋出一個異常物件。

程式碼級別上,主動拋出一個異常物件,提示呼叫者:產生問題啦。。
以下是String這個類的原始碼:
 public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

6丶自定義異常

自己定義一個類,用於表示某種異常。需要繼承Exception或其子類即可。

class MyException extends Exception{
	//提供有參構造方法。。
	public MyException(String msg){
		super(msg);//呼叫父類別的有參構造:提供異常的資訊
	}
	
	public MyException(){
		super();//父類別的無參構造,沒有提供異常的資訊
	}
	
}

程式中主動拋出一個異常物件:

/*
	 * 設計一個方法,用於檢驗年齡,年齡不合法,拋出一個異常
	 */
	public static void checkAge(int age) throws MyException{
		if(age < 0){
//			return;
			throw new MyException("年齡不能爲負數。。");
		}
		System.out.println("年齡輸入正確,請繼續。。。");
	}