尚矽谷Java入門筆記 - P40~P173
Java基礎相關
目錄前言
本文為B站Java教學視訊BV1Kb411W75N的相關筆記,主要用於個人記錄與分享。如有錯誤歡迎留言指出。
本章筆記涵蓋視訊內容P40~P173
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; //正確
- 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){//可以作為判斷條件
//...
}
-
當容量小的資料型別的變數與容量大的資料型別的變數做運算時,結果自動提升為容量大的資料型別
總共可以歸結為以下情況:
- 所有的byte型,short型和char型在運算時(包括同類型之間運算)都將被提升到int型別(注:使用++/+=/*=等運算子時不會被自動提升)
- 如果兩個運算元其中有一個是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; //正確
- 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使用步驟:
- 導包:import java.util.Scanner;
- Scanner例項化:Scanner scan = new Scanner(System.in);
- 選擇合適的相關方法: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. 陣列
- 陣列屬於引用資料型別的變數。陣列的元素既可以是基本資料型別,也可以是引用資料型別。
-
一維陣列的宣告和初始化
int[] ids; //宣告 //靜態初始化:陣列的初始化和陣列元素的賦值操作同時進行 ids = new int[]{1001,1002,1003,1004}; //動態初始化:陣列的初始化和陣列元素的賦值操作分開進行(這裡宣告也一起做了) String[] names = new String[5];
-
獲取陣列的長度
//java中的陣列自帶測量自身長度的屬性 System.out.printfln(names.length); System.out.printfln(ids.length);
-
陣列元素的預設初始化值:
-
與C不同,java的陣列從建立的時候就已經有了初始值,根據陣列元素不同初始化值也不同
陣列內資料型別 初始值 整型 int 浮點型 float char型 0(此處是ASCII表中的0,相當於C中的空字元\0) boolean型 false 引用資料型別 null
-
-
二維陣列的宣告和初始化
//靜態初始化 int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}}; //動態初始化 String[][] arr2 = new String[3][2]; String[][] arr3 = new String[3][];
-
獲取陣列長度
System.out.println(arr1.length); //輸出3 System.out.println(arr1[1].length); //輸出2 //arr1的長度是指其包含了多少個數組 //arr1[1]的長度是指索引值為1的陣列包含了多少個元素
-
陣列元素的預設初始化值:
/* 對於int[][] arr = new int[4][3] 外層元素的初始化值為:地址值 內層元素的初始化值為:與一維陣列初始化相同 對於int[][] arr = new int[4][] 外層元素的初始化值為:null 內層元素的初始化值為:不能呼叫,否則報錯 */
-
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("未找到"); }
-
陣列中的常見異常
//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. 其它知識點
- 獲取隨機數的程式碼為Math.random(),返回值為double型別,返回值範圍為[0.0,1.0)
//公式:[a,b]:(int)(Math.random()*(b-a+1)+a)
int value = (int)(Math.ranodm()*90+10);
- 判斷字串內容的程式碼為val.equals("xxx")
String isHuman = scan.next();
if(isHuman.equals("是"))
System.out.println("Yes");
//一定不要寫成下列形式!
if(isHuman == "是") //這樣比較的是兩者的地址,永遠不會相等!
-
計算程式執行時間的方法:
- 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
- 在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結束的是當前的外層迴圈
-
取模運算(%)獲得的結果的符號與被模數的符號相同(負數取模也得負數)。但是取模獲得負數有悖數學常識,如果要獲得正數的結果可以使用Math.floorMod()
-
&與&&,|與||作用是一樣的,區別是&&和||具有短路特性。所謂短路特性就是當&&判斷式第一項判斷失敗或||判斷式第一項判斷成功後,第二項不會再執行。這一特性在某些特殊的題目中可以用來替代遞迴和迴圈進行計算。
boolean a = false;
boolean b = true;
if(a && b){ //此時無論b是什麼都不會被執行/判定
//...
}
-
命名規範:
- 包名:多單片語成時所有字母都小寫:xxxyyyzzz
- 變數名,方法名:多單片語成時第一個單詞首字母小寫,第二個單詞開始每個單詞首字母大寫:xxxYyyZzz(小駝峰命名法)
- 類名,介面名:多單片語成時,所有單詞的首字母大寫:XxxYyyZzz(大駝峰命名法)
- 常量名:所有字母都大寫。多單詞時每個單詞用下劃線連線:XXX_YYY_ZZZ
-
Java程式編寫-編譯-執行的過程
- 編寫:將編寫的程式碼儲存在.java結尾的原始檔中
- 編譯:使用javac.exe命令編譯java原始檔 格式:javac 原始檔名.java
- 執行:使用java.exe命令解釋執行位元組碼檔案 格式:java 類名 此處不用加檔案型別
-
在一個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檔案