Java總結-2019.10

節點1:環境搭建,Java基礎語法

1. 環境搭建

版本:
J2SE、J2EE、J2ME
下載並安裝JDK
JDK(Java Develop Kit):開發工具包
JRE(Java Runtime Environment):運行時環境
配置環境變量
右鍵—>計算機—>選擇“屬性”—>點擊“高級系統設置”—>打開“系統屬性”窗口—>點擊“環境變量”
(1) 新建“JAVA_HOME”環境變量,值設置爲:JDK的安裝目錄
(2) 修改“Path”環境變量,添加“;%JAVA_HOME%\bin;”
(3) Classpath(可選)
驗證是否安裝成功:
打開“運行”—>輸入cmd—>在命令提示符窗口,輸入java –version,如果能夠出現如下界面,則安裝成功!
在這裏插入圖片描述

2. 第一個Java程序

創建文件名爲HelloWorld.java的源文件:

//定義一個公共類,類名HelloWorld
public class HelloWorld{
	//類體-main方法
	public static void main(String[] args){
		//方法體
		System.out.print("Hello World!");
	}
}

運行Java程序:
(1) 打開“運行”,輸入cmd,打開命令提示符窗口
(2) 切換目錄
a) 切換盤符: e:
b) 切換目錄: cd billfox(cd—change directory)
c) 編譯程序: javac HelloWorld.java(編譯源文件,獲得class字節碼文件)
d) 運行程序: java HelloWorld(運行字節碼文件)

3. 開發工具的安裝使用

安裝版.exe
解壓版

4. 使用Eclipse創建Java項目

包名:反域名制(com.taobao.projectName)
類名:所有單詞首字母要大寫!(UpperCamelCase駝峯命名法 StudentCount)
變量名,方法名,參數名:(lowerCamelCase駝峯命名法 studentCount)
常量:所有字母大寫,每個單詞之間用下劃線隔開。 MAX_STOCK_COUNT

命名規範:由字母,數字,下劃線和$組成,不能以數字開頭。
比如:num1 num_1 $num

5. Java編程基礎

1) 變量

語法:數據類型 變量名 [= 值];
例子:int count = 10;
float studentWeight;

標識符和關鍵字
標識符:是用來表示變量名、類名、方法名、數組名和文件名的有效字符序列。
關鍵字:是Java語言中被賦予特定含義的一些單詞。

變量的作用域

public class Demo01 {
	public static void main(String[] args) {
		//變量的作用域
		int x = 10;
		
		{
			//代碼塊
			int y = 20;
			System.out.println(y);
			System.out.println(x);
		}
		
		System.out.println(y);//報錯,超出了y的作用範圍
		System.out.println(x);
	}
}

2) 數據類型( 四類8種)

(1) 整數型
a) 字節型byte 1個字節(8位) -27 ~27-1
b) 短整型short 2個字節(16位) -215 ~215-1
c) 整型int 4個字節(32位) -231 ~231-1
d) 長整型long 8個字節(64位) -263 ~263-1
(2) 浮點數類型
a) 單精度浮點 float 4個字節
b) 雙精度浮點 double 8個字節
(3) 布爾型 boolean (true,false)
(4) 字符型 char

數據類型轉換
(1) 自動類型轉換(小 轉 大)
byte–>short–>char–>int–>long–>float–>double
例子:
int num = 20;
float f1 = num;
(2) 強制類型轉換(大 轉 小)
例子:
float f2 = 2.5f;
int num2 = (int)f2;//有可能損失精度或者溢出
(3) 字符串型數據和整型數據相互轉換 “10” 10
a) 字符串 轉 數字 int num = Integer.parseInt(“10”);
b) 數字 轉 字符串 String str = 10 + “”;

3) 輸入輸出

輸出:
System.out.print(輸出的內容); //不換行
System.out.println(輸出的內容); //輸出內容後換行
輸入:
Scanner sc = new Scanner(System.in);//簡易的文本掃描器
int I = sc.nextInt();//獲取輸入的整數
float f = sc.nextFloat();//獲取輸入的單精度浮點數
double d = sc.nextDouble();//獲取輸入的雙精度浮點數
String s = sc.next();//獲取輸入的字符串

代碼提示配置
參考https://www.cnblogs.com/zgqys1980/p/5067337.html
主動觸發代碼提示的快捷鍵:Alt + /
字體大小配置
Window->preferences->搜索”font”->選擇”Colors and Fonts”->選擇右側列表中Basic下的Text Font,然後點擊編輯(Edit)按鈕,修改你想要的字體大小即可。

4) 常量

符號常量:final double PI = 3.1415926;
字面常量:10、2.5、’a’

5) 運算符

1. 算術運算符

+、-、*、/、%、++(前/後)、–(前/後)

注意:
/ 當兩個運算數爲整數時,爲取整運算。
/ 當兩個運算符不全爲整數時,爲除法運算。

c = a++;//先把a的值賦給c,然後a再自增
c = ++a;//先把a的值自增,然後把a賦給c

2. 關係運算符

、<、>=、<=、==、!=

由關係運算符構成的關係表達式,返回值爲布爾值,即true/false.

3. 邏輯運算符

&&(短路與)、||(短路或)、!、&(非短路與)、|(非短路或)、^(異或)

邏輯運算符,用於連接關係表達式(boolean),最終的結果,也是布爾值(boolean)。

4. 位運算符

5. 賦值運算符

=、+=、-=、*=、/=、%=

a += 10;// 等價於 a = a + 10;

6. 條件運算符

表達式1?表達式2:表達式3;

“表達式1”是一個結果爲布爾值的邏輯表達式。也就是返回值爲true/false
運算規則:
如果表達式1返回true,則整個表達式的返回值爲表達式2;否則返回表達式3;

7. 字符串運算符

其實就是對字符串進行拼接。

8. 運算符的優先級

. [] ()
算術運算符
關係運算符
邏輯運算符
條件運算符
賦值運算符

6) 流程控制語句

1. 順序結構

2. 分支結構

  1. 單分支if
  2. 雙分支if…else…
  3. 多分支
    a) If…else if…else if…else
    b) Switch(表達式){case 值1:break; default:break;}
  4. 分支結構嵌套

3. 循環結構

  1. While
  2. Do…while
  3. For
  4. Foreach增強for循環

4. 跳轉語句

break;//結束循環
continue;//退出本次循環,進入下一次
return;//退出方法

7) 數組

1. 數組的定義

	(1)int[] scores;//聲明
	     scores = new int[45];//初始化
	
	(2)int[] scores = new int[45];//聲明數組的同時初始化
	
	(3)靜態初始化
		int[] arr = new int[] {1,2,3,4,5,6};
		int[] arr =  {1,2,3,4,5,6};

2. 數組的賦值

		scores[0] = 10;
		scores[1] = 15;

3. 數組的常用操作

	數組遍歷
	數組最值(最大值,最小值)
	數組排序(冒泡排序,選擇排序)
	數組元素的刪除,修改

4. Arrays

	排序 sort
	查詢 binarySearch
	複製 copyOf
	轉字符串 toString
	填充 fill

8) 方法

1. 方法的定義

[修飾符] 返回值類型 方法名([參數類型 參數名1,參數類型 參數2…]){
//方法體
}

例子:

public static void printStar(int line,int column) {
		
		for(int i = 0;i < line;i++) {
			//打印第i行: 
			//打印j個星號
			for(int j=0;j<column;j++) {
				System.out.print("*");
			}
			//打印換行
			System.out.println();
		}
}

2. 方法的分類

(1) 無返回值無參數

public class Demo02 {
	public static void main(String[] args) {
		welcome();
	}
	
	public static void welcome() {
		System.out.println("**************");
		System.out.println("***  歡迎光臨   ***");
		System.out.println("**************");
	}
}

(2) 無返回值有參數

public class Demo03 {
	public static void main(String[] args) {
		welcome("Hello");
	}
	
	public static void welcome(String content) {
		System.out.println("**************");
		System.out.println("***  "+content+"  ***");
		System.out.println("**************");
	}
}

(3) 有返回值無參數

public class Demo04 {
	public static void main(String[] args) {
		int num = getNum();
		//System.out.println(num);
		
	}
	
	//有返回值
	public static int getNum() {
		//創建隨機類
		Random rad = new Random();
		//int n = rad.nextInt(); //獲得一個隨機數
		int n = rad.nextInt(); //獲得一個bound範圍之內的隨機數, 10   [0,10)   n>=0  n<10
		return n;
	}
}

(4) 有返回值有參數

public class Demo05 {
	public static void main(String[] args) {
		int sum = add(8, 5);
		System.out.println(sum);
	}
	
	//加法
	public static int add(int n1,int n2) {
		int result = n1 + n2;
		return result;
	}
}

節點2:Java面向對象編程

  1. 面向對象編程思想
    與面向過程編程思想的區別:
    可以拿生活中的實例來理解面向過程與面向對象,例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。把上面每個步驟用不同的方法來實現。

如果是面向對象的設計思想來解決問題。面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分爲1、黑白雙方,這兩方的行爲是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子佈局的變化,棋盤對象接收到了棋子的變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
2. 類和對象的概念:
• 對象:對象是類的一個實例(對象不是找個女朋友),有狀態和行爲。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行爲有:搖尾巴、叫、吃等。(具體)
• 類:類是一個模板,它描述一類對象的行爲和狀態。(抽象)
3. 類的設計

  1. 類的構成:
    1) 成員變量
    2) 成員方法
    3) 構造方法
     特點:
    1.構造方法的方法名必須和類名一致。
    2.沒有返回值類型。
    4) 類成員
     類變量(靜態變量) 訪問: 類名.類變量
     類方法(靜態方法) 訪問: 類名.類方法()
     靜態代碼塊
    /*
  • 類的設計

  • 1)成員變量

  • 2)成員方法

  • 3)構造方法

  • 4)類成員

  • a.類變量

  • b.類方法

  • c.靜態代碼塊

  • 類,其實一種用戶自定義的數據類型。

  • 編碼規範:駝峯命名法
    */
    public class Student {

    //1.成員變量
    String name;
    String sex;
    int age;

    //2.成員方法
    public void study() {
    System.out.println(name+“在學Java,在”+school);//成員方法可以訪問類變量,但類方法不能訪問成員變量。
    }

    public void playGame() {
    System.out.println(name+“在玩王者榮耀”);
    }

    //3.構造方法
    /*

    • 特點:
    • 1.構造方法的方法名要和類名一致。
    • 2.沒有返回值類型。
    • —3.一般情況下,用public來修飾。
      */
      public Student() {
      System.out.println("–構造方法執行–");
      count++;
      }

    ////////////////////////////////////////////////////////////////////////////////

    //4.類變量(靜態變量)
    static String school;
    static int count;//當前類的對象個數

    //5.類方法(靜態方法)
    public static void count() {
    System.out.println(“學校共有”+ count+“個學生 。”);
    }

    //6.靜態代碼塊
    static {
    //對類進行初始化
    count = 0;
    System.out.println("–學校構建完成。–");
    }
    }

  1. 參數的傳遞(值傳遞)
    基本數據類型:變量值
    引用數據類型:內存值

瞭解:InstanceOf:判斷某個對象是否是某個類的對象。 S1 instanceof Student

  1. 方法重載
    方法重載的特點:
  1. 在同一個類中

  2. 方法名相同

  3. 參數的個數或者類型不同
    public class Actor {
    String name;

    //表演
    public void act() {
    System.out.println(“唱歌”);
    }

    public void act(String instrument) {
    System.out.println(“邊彈” + instrument +“邊唱”);
    }

    public void act(int n) {
    System.out.println(“循環唱” + n +“次”);
    }
    }

    方法重載,包括:

  4. 成員方法重載

  5. 構造方法重載。
    public class Actor {
    //成員變量
    String name;
    String sex;
    int age;

    //成員方法 重載
    public void act() {
    System.out.println(“唱歌”);
    }

    public void act(String instrument) {
    System.out.println(“邊彈” + instrument +“邊唱”);
    }

    public void act(int n) {
    System.out.println(“循環唱” + n +“次”);
    }

    //構造方法 重載
    public Actor() {
    }

    public Actor(String actorName) {
    name = actorName;
    }

    public Actor(String actorName,String actorSex) {
    name = actorName;
    sex = actorSex;
    }

    public Actor(String actorName,String actorSex,int actorAge) {
    name = actorName;
    sex = actorSex;
    age = actorAge;
    }
    }

    補充:可變參數
    //求整數的和(可變參數)
    public int add(int… nums) {
    int sum = 0;
    for (int i = 0; i < nums.length; i++) {
    sum = sum + nums[i];
    }
    return sum;
    }

  1. this
    this指當前類的對象
    public Actor(String name,String sex,int age) {
    this.name = name;//當前要創建的對象的name屬性 = name參數;
    this.sex = sex;
    this.age = age;
    }
    通過this關鍵字
    1.可以調用當前類的成員變量。
    2.可以調用當前類的成員方法。
    3.可以調用當前類的構造方法。
    public class Student {
    String name;
    String sex;

    public void study() {
    System.out.println(this.name+“在學習”);//1.通過this調用成員變量
    }

    public void race() {
    this.study();//2.通過this調用成員方法
    System.out.println(“參加比賽!”);
    }

    public Student() {

    }

    public Student(String name){
    this();//3.通過this調用無參構造
    this.name = name;
    }
    }

節點3:封裝,繼承,多態

  1.  封裝
    

實現步驟:
(1)屬性私有化 (2)提供公共的getter,setter方法
自動生成get,set方法:右鍵—>Source—>Generate Getters and Setters

public class Actor {
//成員變量
private String name;
private String sex;
private int age;

//提供公共的get,set方法
public void setName(String name) {
	this.name = name;
}

public String getName() {
	return this.name;
}

public void setSex(String sex) {
	if (sex.equals("男") || sex.equals("女")) {
		this.sex = sex;
	}else {
		System.out.println("您設置的性別有誤!");
	}
}

public String getSex() {
	return this.sex;
}

public void setAge(int age) {
	if (age < 0 || age > 130) {
		System.out.println("您設置的年齡有誤!");
	}else {
		this.age = age;
	}
	
}

public int getAge() {
	return this.age;
}

//成員方法 重載
public void act() {
	System.out.println("唱歌");
}

public void act(String instrument) {
	System.out.println("邊彈" + instrument +"邊唱");
}

public void act(int n) {
	System.out.println("循環唱" + n +"次");
}

//構造方法  重載
public Actor() {
}

public Actor(String name) {
	this.name = name;
}

public Actor(String name,String sex) {
	this.name = name;
	this.sex = sex;
}

public Actor(String name,String sex,int age) {
	this.name = name;
	this.sex = sex;
	this.age = age;
}

}
2. 繼承

  1. 繼承的概念:
    可以基於已經存在的類構造一個新類。繼承已經存在的類就可以複用這些類的方法和域。在此基礎上,可以添加新的方法和域,從而擴充了類的功能。

繼承的關鍵字:extends

  1. 繼承的特點:
  1. 可以實現代碼的複用—子類擁有父類非私有的屬性和方法。
  2. 子類可以對父類進行擴展—子類可以擁有自己的屬性和方法。
  3. 方法重寫—子類可以用自己的方式去實現父類的方法。
  4. 單繼承,可以多重繼承
  5. 缺點:提高了代碼的耦合度。

例子:
定義父類:
public class Animal {
//父類定義子類共有的屬性和行爲
String name;
String sex;
int age;
String color;

public void eat() {
	System.out.println(name + "吃東西");
}

}
定義子類-Cat:
public class Cat extends Animal{
//貓類特有的行爲
public void catchMouse() {
System.out.println(name+ “抓老鼠…”);
}
}
定義子類-Dog:
public class Dog extends Animal {
//狗類特有的行爲
public void guard() {
System.out.println(name + “看家”);
}

}
3) 修飾符
(1) 訪問修飾符
a) public:所有類都可以訪問。 (當前類,同一個包中的不同類,不同包的類)
b) protected:包的訪問權限+不同包的子類 (當前類,同一個包中的不同類,不同包的子類)
c) 缺省:包的訪問權限。 (當前類,同一個包中的不同類)
d) private:當前類 (當前類)

(2) 非訪問修飾符
a) static
i. 修飾成員變量,則成員變量變爲類變量。static String school = “萊職”;
ii. 修飾成員方法,則成員方法變爲類方法。
iii. 修飾代碼塊,則代碼塊變爲靜態代碼塊。特點:是在main方法之前運行,而且只運行一次。其實就是在類加載時運行。
b) final
i. 修飾變量,則變量變成不可改變的量,即常量。 final int num = 10;
ii. 修飾方法,則方法變爲不可重寫的方法。
iii. 修飾類,則類變爲不可繼承的類。
c) abstract 抽象
4) 方法重寫
特點:
1.要有繼承,重寫發生在兩個類之間,子類去重寫父類的同名的方法
2.子類的方法名要和父類的方法名相同,而且參數(個數,類型)也要完全一致。
3.子類對方法的修飾,只能擴大,不能縮小。

父類:
public class Animal {
//域(成員變量)
String name;
String sex;
int age;
String color;

//方法(成員方法)
public void eat() {
	System.out.println(name + "吃東西");
}

}
子類:
public class Cat extends Animal{
//特有的行爲(擴展)
public void catchMouse() {
System.out.println(name+ “抓老鼠…”);
}

//子類可以重寫從父類繼承而來的方法
public void eat() {
	System.out.println(name+"吃魚");
}

}

  1. Super
    Super:指的是當前對象的父類
    public class Dog extends Animal {
    //特有的行爲(擴展)
    public void guard() {
    System.out.println(name + “看家”);
    }

    //方法重寫 — 註解
    @Override
    public void eat() {
    super.eat();//調用超類(父類)的eat方法
    System.out.println(super.name+“啃骨頭”);//調用超類(父類)的name屬性
    }
    }
    通過super關鍵字
    1.可以調用父類的成員變量 super.property;
    2.可以調用父類的成員方法 super.method();
    3.可以調用父類的構造方法 super();

注意:子類默認會調用父類的無參構造,如果顯式的調用了父類的有參構造,則不會再調用父類的無參構造。

  1. 多態
    多態的三個必要條件:
    1.繼承
    2.重寫
    3.父類引用指向子類對象(上轉型對象)

節點4:抽象類和接口

  1. 抽象類
  1. 定義抽象類:
    abstract class Person{
    //可以包含抽象方法
    }

class Student extends Person{
//子類繼承抽象類,要去重寫父類的抽象方法。
}

  1. 特點:
    1.抽象類不一定包含抽象方法,但包含抽象方法的類,一定是抽象類。
  1. 抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。
    3.抽象類不能實例化。
    4.抽象類只能作爲子類的超類(父類),被用來創建繼承層級裏子類的模板。
    5.Java中只有單繼承。
  2. 構造方法,類方法(用 static 修飾的方法)不能聲明爲抽象方法。
  3. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。
    抽象類存在的意義,就是被繼承。
  4. 接口
  1. 語法 :
    [可見度] interface 接口名稱 [extends 其他的接口名] {
    // 聲明變量
    // 抽象方法
    }

示例:
/*

  • 1.普通類
  • 只能包含非抽象方法。
    */
    public class Student {
    //屬性
    String name;
    String sex;
    int age;
    //方法
    public void study() {
    System.out.println(“學習”);
    }
    }

/*

  • 2.抽象類
  • 可以包含抽象方法,非抽象方法,也可以不包含任何方法。
    */
    public abstract class Animal {
    //屬性
    String name;
    //方法
    public abstract void eat();
public void bark() {
	System.out.println("叫。。。");
}

}

/*

  • 3.接口
  • 只能有抽象方法。
    */
    public interface Work {
    //屬性(默認用public static final修飾)
    int count = 0;//注意:接口中的靜態常量,一定要賦初值。
    //方法(默認用public abstract修飾)
    void work();//抽象方法前的public abstract修飾符可以省略
    public abstract void earnMoney();
    }
  1. 接口的實現:
    public class Teacher implements Work {

    @Override
    public void work() {
    System.out.println(“上課”);
    }

    @Override
    public void earnMoney() {
    System.out.println(“拿課時費”);
    }

}
3) 特點:
抽象類是一種特殊的類。接口是一種特殊的抽象類。
接口是一個抽象方法的集合。、
Java中,對於類來說,只有單繼承,但對於接口來說,可以多繼承。
定義接口的關鍵字:interface

  1. 標記接口
    標記接口是沒有任何方法和屬性的接口.它僅僅表明它的類屬於一個特定的類型,供其他代碼來測試允許做一些事情。
    標記接口作用:簡單形象的說就是給某個對象打個標(蓋個戳),使對象擁有某個或某些特權。
    示例:
    package java.util;
    public interface EventListener {}

節點5:Object類和常用API

  1. Object
    Object類是所有類的父類。
  1. 常用方法:
    (1) hashcode() 返回哈希值
    (2) equals() 判斷對象是否相等
    自動生成方式:在代碼中,右鍵,選擇”source”->”Genareate hashcode() and equals()”
    (3) getClass() 返回此Object的運行時類。
    (4) toString() 返回對象的字符串形式
    自動生成方式:在代碼中,右鍵,選擇”source”->”Genareate toString() ”
  1. String(不可變性)
  1. 創建字符串(構造方法)
    (1) String str0 = “Hello”;//字符串常量
    (2) String str1 = new String(“Hello”);//通過String構造方法
    (3) String str2 = new String(char[] cs);//通過字符數組構造字符串
    瞭解String的11種構造方法

  2. 操作字符串(常用方法)
    (1) charAt(int index) 返回指定索引處的字符
    (2) indexOf(String s) 查找字符在字符串中第一次出現的位置
    (3) lastIndexOf(String) 查找字符在字符串中最後一次出現的位置
    (4) contains(String s) 判斷是否包含字符序列
    (5) substring(int beginIndex)
    從beginIndex位置截取子字符串,一直擴展到字符串末尾
    (6) substring(int beginIndex,int endIndex) [begin,end)
    從beginIndex位置截取子字符串,一直到endIndex位置,不包括endIndex.
    (7) trim() 去除前後空格!
    (8) replace(char oldChar,char newChar) 替換
    (9) split(String s) 字符串分割
    (10) equals() 判斷字符串內容是否相同
    (11) equalsIgnoreCase() 忽略大小寫判斷相等
    (12) matches(正則表達式)
    (13) length() 返回字符串的字符數(長度)
    (14) isEmpty() 判斷字符串是否爲空字符串
    (15) static valueOf(各種數據類型) 返回各種數據類型的字符串形式
    (16) toCharArray() 字符串 轉 字符數組
    (17) getBytes() 字符串 轉 字節
    (18) toLowerCase() 轉小寫
    (19) toUpperCase() 轉大寫
    (20) concat() 字符串拼接 +
    (21) format() 格式化字符串 %f %d %s

  3. 正則表達式
    (1)匹配位置
    ^ 匹配字符串開始的位置。
    $ 匹配字符串結束的位置。
    (2)匹配字符
    .(點號) 匹配任意一個字符
    \ 將下一字符標記爲特殊字符
    \s 匹配任意空白字符(空格,\f換頁符\n換行符\r回車符\t製表符\v垂直製表符)
    \S 匹配任意非空白字符
    \d 匹配任意數字
    \D 匹配非數字
    \w 匹配任何字類字符。等價於[A-Za-z0-9_]
    \W 匹配任何非字類字符。等價於[^A-Za-z0-9_]
    (3)匹配字符範圍
    x|y 匹配x或y.
    [xyz] 匹配包含的任一字符。
    [^xyz] 匹配未包含的任一字符。
    [a-z] 匹配字符範圍。
    [^a-z] 匹配反向範圍字符
    (4)匹配次數

    •    匹配前面的字符1-n次
      
    •    匹配前面的字符0-n次
      

    ? 匹配前面的字符0-1次
    {n} 匹配前面的字符正好n次
    {n,} 匹配前面的字符至少n次
    {n,m} 匹配前面的字符至少n次,至多m次。

    總結:正則表達式,可以用於匹配matches(),替換replace()和分割split()。

  4. StringBuffer 、StringBuilder
    StringBuffer sBuffer = new StringBuffer(“Hello”);
    System.out.println(sBuffer);
    sBuffer.append(“World!”); //在末尾追加字符 //0123456789
    System.out.println(sBuffer); //HelloWorld!
    sBuffer.delete(3, 5); //刪除多個字符(指定範圍) [3,5)
    System.out.println(sBuffer); //HelWorld!
    sBuffer.deleteCharAt(0);//刪除單個字符(指定位置)
    System.out.println(sBuffer);//elWorld!
    sBuffer.insert(2, “123456”);//在指定位置,插入內容
    System.out.println(sBuffer);//el123456World!
    sBuffer.reverse();//倒序
    System.out.println(sBuffer);
    sBuffer.setCharAt(0, ‘A’);//修改指定位置的字符
    System.out.println(sBuffer);
    StringBuffer中包含很多自己特有方法,也包含一些類似String類中的方法。比如(subString,indexOf,charAt)
    StringBuilder和StringBuffer的方法,基本完全相同。

總結:
  String:適用於少量的字符串操作的情況
  StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況
  StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況

  1. 日期時間類
  1. Date
    Date date = new Date();//獲取當前時間

  2. SimpleDateFormat
    (1)Date轉String
    SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 hh時mm分ss秒 SSS E D”);
    String strDate = sdf.format(date);
    System.out.println(strDate);
    (2)String轉Date
    String str = “2018年10月01日 10:30:30”;
    SimpleDateFormat sdf2 = new SimpleDateFormat(“yyyy年MM月dd日 hh:mm:ss”);
    Date date2 = sdf2.parse(str);//異常
    System.out.println(date2);

    獲得系統時間的毫秒數
    long start = System.currentTimeMillis( );
    long end = date.getTime();

  3. Calendar
    //獲取Calendar對象
    Calendar c = Calendar.getInstance();
    System.out.println©;

    //修改Calendar的時間
    //c.set(2009, 6-1, 12);
    
    //獲取日期的部分信息--年份
    System.out.println(c.get(Calendar.YEAR));
    System.out.println(c.get(Calendar.MONTH));
    System.out.println(c.get(Calendar.DAY_OF_MONTH));
    
    
    System.out.println(c.get(Calendar.DAY_OF_WEEK));
    
    System.out.println(c.get(Calendar.HOUR));
    System.out.println(c.get(Calendar.HOUR_OF_DAY));
    
    //單獨設置屬性值
    c.set(Calendar.YEAR, 2009);
    
    c.add(Calendar.YEAR, 5);
    c.add(Calendar.MONTH, 2);
    
    System.out.println(c.get(Calendar.YEAR));//2014
    System.out.println(c.get(Calendar.MONTH));//5
    
    //判斷閏年
    GregorianCalendar gc = new GregorianCalendar();
    System.out.println(gc.isLeapYear(1900));
    
  1. 包裝類
    //包裝類 (Byte,Short,Integer,Long Float,Double Character Boolean)
    //基本數據類型(byte,short,int,long float,double char boolean)

    //面向對象編程
    int num0 = 10;//數字
    Integer num1 = new Integer(20);//對象
    
    //Student student = new Student();
    
    //封箱(基本數據類型--->包裝類)比如:int-->Integer
    Integer num2 = new Integer(num0);
    Integer num3 = Integer.valueOf(num0);
    
    //拆箱(包裝類--->基本數據類型)比如:Integer-->int
    int num4 = num1.intValue();
    
    //自動封箱,拆箱
    Integer num6 = 10;
    int num5 = new Integer(10);
    
    //數值字符串   轉成   基本數據類型   例子: "10"  -->  10
    String str = "10";
    System.out.println(str + 1);
    int num7 = Integer.parseInt(str);
    System.out.println(num7 + 1);
    
    String str2 = "2.5";
    System.out.println(str2 + 1);
    float f = Float.parseFloat(str2);
    System.out.println(f + 1);
    
  2. 數學類
    //數學類
    System.out.println(Math.E);
    System.out.println(Math.PI);

    System.out.println(Math.abs(-10.25));//絕對值
    System.out.println(Math.sin(Math.PI/6));
    System.out.println(Math.cos(Math.PI/3));
    
    System.out.println(Math.ceil(2.5));//天花板
    System.out.println(Math.floor(2.5));//地板
    System.out.println(Math.round(2.26));//近似值
    
    System.out.println(Math.sqrt(9));//開平方根
    System.out.println(Math.cbrt(8));//開立方根
    System.out.println(Math.pow(3, 4));// 求冪
    
    System.out.println(Math.max(10, 8));//最大值
    System.out.println(Math.min(10, 8));//最小值
    
    System.out.println(Math.toDegrees(Math.PI/6));//弧度 轉 角度
    System.out.println(Math.toRadians(30));//角度 轉 弧度
    
    System.out.println(Math.random());//隨機數   0<=x<1
    
    System.out.println(Math.multiplyExact(2, 3));//乘法
    System.out.println(Math.negateExact(10));//取反		
    
  3. System和Runtime
    System.out.println(“Hello”);
    System.err.println(“Hello”);
    Scanner sc = new Scanner(System.in);
    //系統環境變量
    Map<String, String> map = System.getenv();
    for (String string : map.keySet()) {
    System.out.print(string+"😊;
    System.out.println(map.get(string));
    }
    System.out.println("===============");
    //系統屬性
    Properties properties = System.getProperties();
    System.out.println(properties);
    System.out.println("------------------");

    Runtime runtime = Runtime.getRuntime();
    System.out.println("處理器的數量:" + runtime.availableProcessors());
    System.out.println("總內存數:" + runtime.totalMemory());
    
    //runtime.exec("C:\\Program Files (x86)\\Tencent\\TIM\\Bin\\QQScLauncher.exe");
    runtime.exec("notepad.exe");
    

節點6:泛型、集合應用技術
爲什麼要學習集合?
集合相比數組而言,集合的長度是可變的,但是數組是不可變的。

  1. Collection-單列集合
  1. List-列表(有序,可重複)
    數組:靜態數組
    (1)ArrayList:動態數組(線程不同步,查詢效率更高)

    //int[] arr = new int[10];
    //1.創建一個ArrayList(動態數組-可以自動擴展)
    ArrayList list = new ArrayList();
    //在沒有指定泛型的時候,集合中可以添加任意類型的元素。
    list.add(1);
    list.add(2.5);
    list.add('A');
    list.add("Hello");
    list.add(new Student());
    list.add(6);
    list.add(7);
    list.add(8);
    list.add(9);
    list.add(10);
    //集合是永遠都填不滿的,也就是可以自動擴展.
    list.add(11);
    list.add(12);
    list.add(13);
    
    System.out.println(list.toString());
    
    //2.泛型(參數化類型)
    ArrayList<String> iList = new ArrayList<String>();
    
    //3.ArrayList的常用方法
    //3.1添加元素到末尾
    iList.add("tom");
    iList.add("jack");
    iList.add("rose");
    iList.add("Kitty");
    iList.add("Lufy");
    //3.2在指定位置添加元素
    iList.add(2, "Zoro");
    System.out.println(iList);
    //3.3刪除指定位置的元素
    iList.remove(0);
    System.out.println(iList);
    //3.4修改元素
    iList.set(2, "Bluck");
    System.out.println(iList);
    //3.5獲取元素
    String s = iList.get(2);
    System.out.println(s);
    
    //3.6獲取集合元素個數
    System.out.println(iList.size());
    //3.7判斷集合是否爲空
    System.out.println(iList.isEmpty());
    //3.8判斷集合是否包含指定元素
    System.out.println(iList.contains("Tomcat"));
    //3.9查找元素在集合中的位置
    int index = iList.indexOf("Lufy");
    System.out.println("Lufy在集合的"+index+"號位置");
    //3.10清空集合
    iList.clear();
    System.out.println(iList);
    System.out.println("集合是否爲空:"+iList.isEmpty());
    System.out.println("---ArrayList的遍歷--方式一:");
    //ArrayList的遍歷--方式一
    for (int i = 0; i < iList.size(); i++) {
    	System.out.println(iList.get(i));
    }
    System.out.println("---ArrayList的遍歷--方式二:");
    //ArrayList的遍歷--方式二
    for (String string : iList) {
    	System.out.println(string);
    }
    System.out.println("---ArrayList的遍歷--方式三:");
    //ArrayList的遍歷--方式三(迭代器)
    Iterator<String> iter = iList.iterator();//獲取List的迭代器
    while(iter.hasNext()) {//通過迭代器,判斷是否有下一個元素
    	String string = iter.next();//獲取下一個元素
    	System.out.println(string);
    }
    

(2)Vector:(線程同步)[瞭解]
(3)LinkedList:鏈表(修改效率更高)
常用方法跟ArrayList基本相同。
不同之處:在性能方面。ArrayList適用於查詢,LinkedList適用於增刪改
2) Set-集合(無序,不可重複)
(1)HashSet:
//1.創建集合HashSet
HashSet hs = new HashSet();
System.out.print(“s1 equals s2:”);
System.out.println(s1.equals(s2));//true
//System.out.println(“String”.equals(“String”));
hs.add(1);
hs.add(2.5);
hs.add(‘A’);
hs.add(“String”);
hs.add(s1);
hs.add(s2);
hs.add(1);
hs.add(“String”);
//無序,不可重複
System.out.println(hs);

	//2.常用方法 和 泛型
	HashSet<String> sHashSet = new HashSet<String>();
	//2.1 添加
	sHashSet.add("tom");
	sHashSet.add("cat");
	sHashSet.add("rose");
	sHashSet.add("jack");
	System.out.println(sHashSet);
	//2.2刪除
	sHashSet.remove("tom");
	System.out.println(sHashSet);
	//2.3判斷是否包含某元素
	System.out.println(sHashSet.contains("jack"));
	//2.4獲取集合的長度
	System.out.println(sHashSet.size());
	
	System.out.println("HashSet的遍歷(迭代器):");
	//HashSet的遍歷(迭代器)
	Iterator<String> iter = sHashSet.iterator();
	while(iter.hasNext()) {
		String string = iter.next();
		System.out.println(string);
	}

在HashSet類中,如果添加自定義類的對象,要求不可重複,需要在自定義類中重寫hashCode()和equals()方法。
自動生成equals()方法的方式:右鍵SourceGenarate hashcode() and equals()…
2. Map-雙列集合

  1. HashMap(線程不安全)
    ////////////////////創建HashMap雙列集合///////////////////////////
    HashMap hm = new HashMap();//初始容量16 0.75
    hm.put(1, “張三”);
    hm.put(“102”, 6);
    hm.put(2.5, 1);
    hm.put(101,new Student());

    //////////////////////////////使用泛型//////////////////////////////
    HashMap<Integer, Student> hmStudents = new HashMap<Integer, Student>();
    
    Student s1 = new Student();
    s1.setId(101);
    s1.setName("張三");
    Student s2 = new Student();
    s2.setId(102);
    s2.setName("李四");
    Student s3 = new Student();
    s3.setId(103);
    s3.setName("王五");
    Student s4 = new Student();
    s4.setId(104);
    s4.setName("趙六");
    /////////////////////////////一、增刪改查/////////////////////////////////////
    //1.添加元素
    hmStudents.put(101, s1);
    hmStudents.put(102, s2);
    
    //4.獲取元素
    Student s = hmStudents.get(103);
    System.out.println(s);
    
    //2.刪除元素
    s = hmStudents.remove(102);
    System.out.println(s);
    
    //3.替換(修改)元素
    s = hmStudents.replace(101, s2);
    System.out.println(s);
    
    s = hmStudents.get(101);
    System.out.println(s);
    
    hmStudents.put(102, s1);
    hmStudents.put(103, s3);
    hmStudents.put(104, s4);
    //////////////////////////////二、獲取集合//////////////////////////////////////////
    //獲取key的集合(第一列的集合)
    Set<Integer> set = hmStudents.keySet();
    System.out.println(set);
    //獲取value的集合(第二列的集合)
    Collection<Student> cs = hmStudents.values();
    System.out.println(cs);
    //獲取entry的集合(兩個列的集合)
    Set<Entry<Integer, Student>> entries = hmStudents.entrySet();
    System.out.println(entries);
    //////////////////////////////三、判斷包含及其他////////////////////////////////////////
    //判斷是否包含某個key
    boolean b = hmStudents.containsKey(102);
    System.out.println(b);
    //判斷是否包含某個value
    boolean b2 = hmStudents.containsValue(s3);
    System.out.println(b2);
    //判斷集合是否爲空
    hmStudents.isEmpty();
    //清空集合
    //hmStudents.clear();
    
    /////////////////////////////四、遍歷(綜合應用)///////////////////////////////////////
    //HashMap的遍歷
    System.out.println("遍歷方法一:");
    Set<Integer> sIntegers = hmStudents.keySet();//獲取第一列的集合
    Iterator<Integer> iterator = sIntegers.iterator();//獲取第一列集合的迭代器
    while (iterator.hasNext()) {
    	Integer key = (Integer) iterator.next();
    	System.out.print(key+"=");//打印key
    	Student stu = hmStudents.get(key);//根據key,獲取value
    	System.out.println(stu);
    }
    
  2. Hashtable(線程安全,用法跟HashMap相同)

  1. Collections-工具類
    排序 sort
    查詢 binarySearch
    複製 copy
    隨機排列 shuffle
    反轉(逆序)reverse
    交換 swap
    填充 fill
    查找子列表 indexOfSubList()、lastIndexOfSubList()
    節點7:異常和IO技術
  2. 異常
  1. 概念:
    異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。

  2. 異常發生的原因:
    瞭解(物理錯誤,程序錯誤,用戶錯誤)

  3. 異常的分類:
    (1)檢查性異常:(在編譯時,不能被忽略,不可避免,必須處理)
    java.io.FileNotFoundException 文件未找到異常
    (2)運行時異常:(在編譯時被忽略,是可能被程序員避免的異常,可以避免,可以不處理,發生時修改代碼)
    java.lang.ArithmeticException 算術運算異常
    java.lang.ArrayIndexOutOfBoundsException 數組下標越界異常

異常的類圖

  1. 異常處理:
    (1)積極處理-捕獲處理
    try{
    //可能發生異常的代碼
    }catch(發生異常的類型 異常對象名){
    //處理異常的代碼
    }finally{
    //釋放資源(無論是否發生異常,都會執行)
    }
    注意:異常的默認處理方式是,會終止程序。導致程序不能繼續運行!!

異常對象的常用方法
void printStackTrace()
將此throwable和其追溯打印到標準錯誤流。
String
getMessage()
返回此throwable的詳細消息字符串。

多個catch語句
(1)一個try語句塊,可以跟多個catch語句,捕獲多種異常。
(2)在catch語句中,異常類的父類Exception要放在後面。異常類的子類,放在前面。

(2)消極處理
拋出異常 throw:手動拋出異常
throw 異常對象;
聲明拋出異常 throws:一般用於聲明方法,可能會發生異常!
public static void divide() throws Exception{

}

自定義異常
瞭解:繼承Exception
2. IO技術

  1. File類
    概念:
    文件和目錄路徑名的抽象表示。

常用方法:
(1)創建:
1)文件 createNewFile()
2)目錄 mkdir():創建單級目錄 mkdirs():創建多級目錄
(2)刪除:delete()
(3)獲取文件或文件夾屬性
exists():測試此抽象路徑名錶示的文件或目錄是否存在。
getAbsolutePath()
getName()
getParent()
getPath()
isDirectory()
isFile()
isHidden()
lastModified()
list()
(4)文件或文件夾操作
renameTo(File dest)
2) 字節流
(1) 字節輸出流(寫):OutputStream
實現類:

  1. FileOutputStream
    構造方法:
    FileOutputStream(String name)
    FileOutputStream(File file)
    FileOutputStream(String name, boolean append):append爲true,則表示追加文本
    FileOutputStream(File file, boolean append) append爲true,則表示追加文本

注意:如果追加文本,需要換行。Window操作系統中要用”\r\n”
常用方法:

  1. write(int b)寫一個字節
  2. write(byte[] b)寫一個字節數組
  3. write(byte[] b,int off,int len)寫一個字節數組的一部分
  4. close() 關閉流
  5. BufferedOutputStream
    構造方法

常用方法

  1. ObjectOutputStream
  2. PrintStream
    構造方法

常用方法

(2) 字節輸入流(讀):InputStream
實現類:

  1. FileInputStream
    構造方法:
    FileInputStream(String name)
    通過打開與實際文件的連接來創建一個 FileInputStream ,該文件由文件系統中的路徑名 name命名。
    FileInputStream(File file)
    通過打開與實際文件的連接創建一個 FileInputStream ,該文件由文件系統中的 File對象 file命名。
    常用方法:
    available()
    返回從此輸入流中可以讀取(或跳過)的剩餘字節數的估計值,而不會被下一次調用此輸入流的方法阻塞。
    read()
    從該輸入流讀取一個字節的數據。
    read(byte[] b)
    從該輸入流讀取最多 b.length個字節的數據爲字節數組。
    read(byte[] b, int off, int len)
    從該輸入流讀取最多 len字節的數據爲字節數組。
    close()
    關閉此文件輸入流並釋放與流相關聯的任何系統資源。

  2. BufferedInputStream
    構造方法

常用方法
3. ObjectInputStream

  1. 字符流
    (1) 字符輸出流(寫):Writer
    實現類:
    OutputStreamWriter:轉換流(字符流字節流)
  1. FileWriter

  2. BufferedWriter

  3. PrintWriter

(2) 字符輸入流(讀):Reader
實現類:
InputStreamReader:轉換流(字節流字符流)

  1. FileReader

  2. BufferedReader

節點8:JDBC

  1. JDBC基本步驟
  1. 什麼是JDBC?
  2. JDBC原理
  3. JDBC核心類
    參考網址:https://www.cnblogs.com/qlqwjy/p/8227665.html

有:DriverManager、Connection、Statement,和ResultSet!
(1)DriverManger(驅動管理器)的作用有兩個:
  l 註冊驅動: DriverManager.registerDriver(new Driver());
  l 獲取Connection: DriverManager.getConnection(String url,String user,String password)
(2)Connection對象表示連接,與數據庫的通訊都是通過這個對象展開的:
l Connection最爲重要的一個方法就是用來獲取Statement對象;
(1) Statement createStatement()
(2) PreparedStatement prepareStatement(sql);
(3)Statement是用來向數據庫發送SQL語句的,這樣數據庫就會執行發送過來的SQL語句
  l void executeUpdate(String sql):執行更新操作(insert、update、delete等);
  l ResultSet executeQuery(String sql):執行查詢操作,數據庫在執行查詢後會把查詢結果,查詢結果就是ResultSet;
(4)ResultSet對象表示查詢結果集,只有在執行查詢操作後纔會有結果集的產生。結果集是一個二維的表格,有行有列。操作結果集要學習移動ResultSet內部的“行光標”,以及獲取當前行上的每一列上的數據:
  l boolean next():使“行光標”移動到下一行,並返回移動後的行是否存在;
  l XXX getXXX(int col):獲取當前行指定列上的值,參數就是列數,列數從1開始,而不是0。
2. JDBC-CRUD(Statement)
void executeUpdate(String sql)—執行增刪改
ResultSet executeQuery(String sql)—執行查詢
3. PreparedStatement
優點:(1)防止SQL注入。(2)效率更高。

【結論】:實際開發中,推薦使用PreparedStatement!!!
4. 自定義工具類
package com.ambow.dbwork;
import java.sql.;
/

JDBC連接數據庫的工具類—自定義工具類【瞭解,自己能寫】
//1. 獲取數據庫連接
//2. 釋放資源
*/
public class JDBCUtils {
private static String DRIVERNAME = “com.mysql.jdbc.Driver”;
private static String URL = “jdbc:mysql://localhost:3306/db_book”;
private static String USER = “root”;
private static String PWD = “root”;

//1. 獲取數據庫連接
public static Connection getConnection(){
    Connection conn = null;
    //1.加載驅動
    try {
        Class.forName(DRIVERNAME);
        //2.獲取數據庫連接
        conn = DriverManager.getConnection(URL, USER, PWD);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}
//2. 釋放資源
public static void closeAll(Connection conn, Statement stmt, ResultSet rs){
    if (rs != null){
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (stmt != null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (conn != null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

}

  1. 數據庫連接池
    (1) c3p0
    參考網址:https://blog.csdn.net/HeiSeHuoEr/article/details/89537080
    (2) druid-阿里【推薦】
    參考網址:https://blog.csdn.net/Dear_UU/article/details/89370491
    package com.ambow.jdbc;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DruidUtils {
//Druid德魯伊,據說是魔獸世界中的一個角色,森林女神
public static DruidDataSource dataSource;//數據庫連接池

//1.初始化Druid連接池
static {
    //第二種方式:使用軟編碼通過配置文件初始化
    try {
        Properties properties = new Properties();
        //通過類加載器加載配置文件
        InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(inputStream);
        //創建連接池
        dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

//2.獲取連接
public static Connection getConnection() {
    try {
        return dataSource.getConnection();//從連接池中獲取連接
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

//3.釋放資源
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
    //釋放resultSet
    try {
        if (resultSet != null) {
            resultSet.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    //釋放Statement
    try {
        if (statement != null) {
            statement.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    //釋放Connection
    try {
        if (connection != null) {
            connection.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

}
6. Apache DBUtils工具類/Spring JDBCTemplate
參考網址:https://blog.csdn.net/HeiSeHuoEr/article/details/85157546

JDK8新特性:
lambda表達式
https://www.liaoxuefeng.com/article/001411306573093ce6ebcdd67624db98acedb2a905c8ea4000
全新的Stream API
https://www.liaoxuefeng.com/article/001411309538536a1455df20d284b81a7bfa2f91db0f223000
JDK11新特性解讀
https://www.liaoxuefeng.com/article/0015419379727788f4e146b6fb1409dbaa7ad35db2560fc000

廖雪峯SQL教程
https://www.liaoxuefeng.com/wiki/001508284671805d39d23243d884b8b99f440bfae87b0f4000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章