1. 程式人生 > 其它 >尚矽谷Java入門筆記 - P40~P173

尚矽谷Java入門筆記 - P40~P173

本文為B站Java教學視訊BV1Kb411W75N的相關筆記,主要用於個人記錄與分享。如有錯誤歡迎留言指出。 本章筆記涵蓋視訊內容P40~P173

Java基礎相關

目錄

前言

本文為B站Java教學視訊BV1Kb411W75N的相關筆記,主要用於個人記錄與分享。如有錯誤歡迎留言指出。

本章筆記涵蓋視訊內容P40~P173

1. 變數型別

  1. 賦值long型變數,必須以"l"或"L"結尾,一般整型變數使用int

    賦值float型變數,必須以"f"或"F"結尾,一般浮點數變數使用double

    可以將"數字"理解為特殊的字面量,而這些字尾是針對數字的"強制型別轉換"。整數的數字預設型別是int,浮點數的數字預設型別是double,如果需要使用long或float型別就需要這種特殊的"強制型別轉換"。

    但是注意double和float型變數仍可以接收整數(見下方第三段例子),能接收的原因可能是編譯器自動進行了調整和轉化。在操作的時候還是建議新增小數點區分整數和浮點數。

int number = 1000000000000000; //報錯,超出int上限
long number = 1000000000000000; //報錯,超出int上限(這裡的int是字面量'1000...'的型別)
long number = 1000000000000000l; //正確

float number = 2.2;	//報錯,2.2‘字面量’賦予的是double型別,不能用float接收
float number = 2.2f;//正確

double = 2;	//正確
float = 2f;	//正確
float = 2;	//正確
  1. Java在boolean型別的使用上和C有些許不同:
boolean bb1 = true;
System.out.println(bb1);

​ 這樣輸出的值是"ture"而不是"1",與C中1代表true,0代表false不同。這樣帶來的最大改變就是在Java中程式設計師無法再和C一樣單純的用1/0來作為判斷條件,而是需要嚴格的使用boolean型別

while(1){	//無法作為判斷條件
    //...
}

while(true){//可以作為判斷條件
    //...
}
  1. 當容量小的資料型別的變數與容量大的資料型別的變數做運算時,結果自動提升為容量大的資料型別

    總共可以歸結為以下情況:

    1. 所有的byte型,short型和char型在運算時(包括同類型之間運算)都將被提升到int型別(注:使用++/+=/*=等運算子時不會被自動提升)
    2. 如果兩個運算元其中有一個是double型別,另一個操作就會轉換為double型別。
      否則,如果其中一個運算元是float型別,另一個將會轉換為float型別。
      否則,如果其中一個運算元是long型別,另一個會轉換為long型別。
      否則,兩個運算元都轉換為int型別。
   char a = 'a';
   char b = 'b';
   a = a + b; //不正確,(a+b)自動提升為int型別
   a = a + 1; //不正確,(a+1)自動提升為int型別
   a++; //正確,++運算子不改變型別
   
   long a = 10000000000l;
   float b = 2.0f;
           
   a = b + a; //錯誤,(a+b)自動提升為float型別
   b = a + b; //正確
  1. String型別可以和8種基本資料型別變數做運算,且運算只能是連線運算(+),運算的結果仍然是String型別;按照從左到右的運算順序,若運算的雙方中有一方為String型別,則計算結果為String型別;若無,則變數之間自動轉換
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c + num + str);	//107hello
System.out.println(c + str + num);	//ahello10
System.out.println(c + (num + str));//a10hello
System.out.println((c + num) + str);//107hello
System.out.println(str + num + c);	//hello10a

//String允許如下寫法:String s1 = "";	√
//char則不允許如下寫法:char c1 = '';   ×

2. Scanner

  • Java中的Scanner相當於C中的scanf,但是存在許多不同

  • Scanner使用步驟:

    1. 導包:import java.util.Scanner;
    2. Scanner例項化:Scanner scan = new Scanner(System.in);
    3. 選擇合適的相關方法:String name = scan.next();
//導包,相當於C中的標頭檔案
import java.util.Scanner;	

class ScannerTest{
    
    public static void main(String[] args){
        
        //Scanner的例項化
        Scanner scan = new Scanner(System.in);
        
        //呼叫Scanner類的相關方法(next()/nextXxx()),來獲取指定型別的變數
        String name = scan.next();
        System.out.println(name);
        
        int age = scan.nextInt();
        System.out.println(age);
        
        double weight = scan.nextDouble();
        System.out.println(weight);
        
        boolean judge = scan.nextBoolean();
        System.out.println(judge);
        
        //對於char型的獲取,Scanner沒有提供相關的方法,只能獲取一個字串
        String gender = scan.next();
        //但是使用charAt()可以獲取字串上指定索引位置上的字元
        char genderChar = gender.charAt(0);//獲取索引為0位置上的字元
    }
}

//需要根據相應的方法,輸入指定型別的值,如果輸入的資料型別與要求的型別不匹配時,會報異常InputMisMatchException()導致程式終止

3. 陣列

  • 陣列屬於引用資料型別的變數。陣列的元素既可以是基本資料型別,也可以是引用資料型別。
  1. 一維陣列的宣告和初始化

    int[] ids; //宣告
    //靜態初始化:陣列的初始化和陣列元素的賦值操作同時進行
    ids = new int[]{1001,1002,1003,1004};
    //動態初始化:陣列的初始化和陣列元素的賦值操作分開進行(這裡宣告也一起做了)
    String[] names = new String[5];
    
  2. 獲取陣列的長度

    //java中的陣列自帶測量自身長度的屬性
    System.out.printfln(names.length);
    System.out.printfln(ids.length);
    
  3. 陣列元素的預設初始化值:

    • 與C不同,java的陣列從建立的時候就已經有了初始值,根據陣列元素不同初始化值也不同

      陣列內資料型別 初始值
      整型 int
      浮點型 float
      char型 0(此處是ASCII表中的0,相當於C中的空字元\0)
      boolean型 false
      引用資料型別 null
  4. 二維陣列的宣告和初始化

    //靜態初始化
    int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
    //動態初始化
    String[][] arr2 = new String[3][2];
    String[][] arr3 = new String[3][];
    
  5. 獲取陣列長度

    System.out.println(arr1.length);	//輸出3
    System.out.println(arr1[1].length); //輸出2
    //arr1的長度是指其包含了多少個數組
    //arr1[1]的長度是指索引值為1的陣列包含了多少個元素
    
  6. 陣列元素的預設初始化值:

    /*
    對於int[][] arr = new int[4][3]
    	外層元素的初始化值為:地址值
    	內層元素的初始化值為:與一維陣列初始化相同
    對於int[][] arr = new int[4][]
    	外層元素的初始化值為:null
    	內層元素的初始化值為:不能呼叫,否則報錯
    */
    
  7. Arrays工具類的呼叫

    //1.boolean equals(int[] a,int[] b):判斷兩個陣列是否相等
    int[] arr1 = new int[]{1,2,3,4};
    int[] arr2 = new int[]{1,3,2,4};
    boolean isEquals = Arrays.equals(arr1,arr2);
    System.out.println(isEquals);
    
    //2.String toString(int[] a):輸出陣列資訊
    System.out.println(Arrays.toString(arr1));
    
    //3.void fill(int[] a,int val):將指定值填充到陣列中
    Arrays.fill(arr1,10);
    System.out.println(Arrays.toString(arr1));
    
    //4.void sort(int[] a):使用快速排序演算法對陣列排序
    Arrays.sort(arr2);
    System.out.println(Arrays.toString(arr2));
    
    //5.int binarySearch(int [] a,int key):使用二分查詢查詢指定值,返回下標
    int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
    int index = Arrays.binarySearch(arr3,210);
    if(index >= 0){
        System.out.println(index);
    }else{
        System.out.println("未找到");
    }
    
  8. 陣列中的常見異常

    //1.陣列下標越界異常:ArrayIndexOutOfBoundsException
    
    //2.空指標異常:NullPointerException
    //情況一:
    int[] arr1 = new int[]{1,2,3};
    arr1 = null;
    System.out.println(arr1[0]);
    
    //情況二:
    int[][] arr2 = new int[4][];
    System.out.println(arr2[0][0]);
    
    //情況三:
    String[] arr3 = new String[]{"AA","BB","CC"};
    arr3[0] = null;
    System.out.println(arr3[0].toString());
    

4. 基礎Dos指令

  • dir : 列出當前目錄下的檔案和資料夾
  • md : 建立目錄
  • rd : 刪除目錄
    • 只能用於刪除空的目錄,如果目錄內有檔案則不能刪除
  • cd : 進入指定目錄
    • 進入某一盤的時候直接輸入碟符即可,不用cd,例如進入D盤 直接d: 而非 cd d:
    • 要跨越多層目錄進入指定目錄可以使用輸入路徑的方法,例如cd new\new_a\b
  • cd.. : 退回到上一級目錄
  • cd\ : 退回到根目錄
  • del : 刪除檔案
    • 要刪除目錄下某一型別的檔案,使用del *.[檔案字尾名]的格式,例如del *.txt刪除當前目錄下所有txt檔案
    • 對著目錄(資料夾)使用del會將資料夾內部所有檔案刪除(但不會刪除資料夾本身)
  • exit : 退出dos命令列
  • 鍵盤↑ ↓ 鍵,檢視歷史操作指令

5. 其它知識點

  1. 獲取隨機數的程式碼為Math.random(),返回值為double型別,返回值範圍為[0.0,1.0)
//公式:[a,b]:(int)(Math.random()*(b-a+1)+a)
int value = (int)(Math.ranodm()*90+10);
  1. 判斷字串內容的程式碼為val.equals("xxx")
String isHuman = scan.next();
if(isHuman.equals("是"))
	System.out.println("Yes");

//一定不要寫成下列形式!
if(isHuman == "是")	//這樣比較的是兩者的地址,永遠不會相等!
  1. 計算程式執行時間的方法:

    • System.currentTimeMillis();返回當前時間距離1970.1.1 00:00:00的毫秒數
    • 在開頭結尾分別建立start和end變數然後相減就可以得出時間,一般使用long型別儲存
long start = System.currentTimeMillis();

//......

long end = System.currentTimeMillis();

System.out.println(end - start);

//若執行所需時間過短則會顯示0
  1. 在Java中用break跳出迴圈或continue結束當次迴圈的時候,可以通過標籤指定此break跳出的是哪一層迴圈。這一功能有些類似C的goto,雖然方便,但不建議在跳出多層迴圈以外的地方頻繁使用,否則容易造成混亂。
label:
for(int i = 1;i <= 4;i++){
	for(int j = 1;j <= 10;j++){
		if(j%4==0){
			continue label;
		}
		System.out.print(j);
	}
	System.out.println();
}
  
//最終的輸出結果為123123123,因為continue結束的是當前的外層迴圈
  1. 取模運算(%)獲得的結果的符號與被模數的符號相同(負數取模也得負數)。但是取模獲得負數有悖數學常識,如果要獲得正數的結果可以使用Math.floorMod()

  2. &與&&,|與||作用是一樣的,區別是&&和||具有短路特性。所謂短路特性就是當&&判斷式第一項判斷失敗或||判斷式第一項判斷成功後,第二項不會再執行。這一特性在某些特殊的題目中可以用來替代遞迴和迴圈進行計算。

boolean a = false;
boolean b = true;
        
if(a && b){	//此時無論b是什麼都不會被執行/判定
	//...
}
  1. 命名規範:

    • 包名:多單片語成時所有字母都小寫:xxxyyyzzz
    • 變數名,方法名:多單片語成時第一個單詞首字母小寫,第二個單詞開始每個單詞首字母大寫:xxxYyyZzz(小駝峰命名法)
    • 類名,介面名:多單片語成時,所有單詞的首字母大寫:XxxYyyZzz(大駝峰命名法)
    • 常量名:所有字母都大寫。多單詞時每個單詞用下劃線連線:XXX_YYY_ZZZ
  2. Java程式編寫-編譯-執行的過程

    • 編寫:將編寫的程式碼儲存在.java結尾的原始檔中
    • 編譯:使用javac.exe命令編譯java原始檔 格式:javac 原始檔名.java
    • 執行:使用java.exe命令解釋執行位元組碼檔案 格式:java 類名 此處不用加檔案型別
  3. 在一個java原始檔中可以宣告多個class,但是隻能最多有一個類被宣告為public,且宣告為public的類的類名必須與原始檔名相同
    編譯的過程:編譯以後,會生成一個或多個位元組碼檔案。位元組碼檔案的檔名與java原始檔中的類名相同。

public class HelloWorld {
	public static void main(String[] args){
	System.out.print("Hello World!");
	System.out.println(); //換行
	System.out.println("Hello World!");
	}
}

class Person{
}

class Animal{  
}
//程式編譯後會生成3個class檔案