互斥鎖(mutex) python
某種程度上是學過一輪Java了,但是細節點總會有問題,所以打算看著書重新來過,敲一下程式碼,盡力不讓IDEA幫我糾錯...然後文件是對於書本的總結以及自己的一些思考吧...但願有深刻的思考
教材:黑皮第10版
本篇內容為程式設計基礎,下一篇是面向物件
第1章 計算機、程式與Java概述
任何一本程式設計的書的頭不出意外就會講講歷史,計算機組成的基礎,語言的概念...關於計算機硬體,記憶體等基礎概念就忽略不談了
關於寫Java的一些開發規範:可參考《阿里巴巴Java開發手冊》
Java的語言規範和應用程式介面(API)定義了Java的標準
JDK是Java 語言的軟體開發工具包,JDK是整個java開發的核心,它包含了JAVA的執行環境,JAVA工具和JAVA基礎的類庫,大多時候採用Java8
緊接著我們看向第一個Java程式Welcome.java
public class Welcome {
public static void main(String[] args){
System.out.println("Welcome to Java!");
}
}
1.class
定義了一個類,Java面向物件,至少一個類,類名開頭大寫,顯然這個程式第一個類是Welcome
類,這同時也是檔名
2.main
定義主方法,程式入口
關於public
,static
,println
前面為啥是System.out
之類的之後會了解,現在知道大概的格式即可
3.Java區分大小寫...
4.名詞的簡單學習:註釋,關鍵字...
JDK、JRE、JVM區別聯絡:https://blog.csdn.net/ancientear/article/details/79483592
關於一個Java檔案怎麼跑的,這裡其實學完基礎去看Java虛擬機器,這裡淺寫一下,a.java
檔案是我們寫的,我們用javac
編譯它生成a.class
檔案,裡面是位元組碼,給java虛擬機器用的,然後可以用java
去執行a.class
java位元組碼可以在不同的作業系統跑
第2章 基本程式設計
首先由於整體看過一遍,所以整本書特別喜歡用圓形這個栗子...
學會操作:基本的格式(public class xxx psvm...),瞭解+
從控制檯獲取輸入,這裡我們想下我們怎麼輸出來著,System.out.println("hello");
,System.out
是標準輸出折本,而System.in
就是輸入裝置了,我們用Scaaner類建立物件,讀取System.in
的輸入
import java.util.Scanner//不考慮太多可以萬用字元java.util.*
public class Hello {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double radius = input.nextdouble();
}
}
同理還有nextByte()
nextInt()
nextFloat()
等讀取數值的方法
學會識別符號的命名規範(阿里手冊裡應該更為詳細),學會變數宣告,賦值...
常量定義:
final double PI = 3.14;
//final datatype NAME = value;
數值型別(儲存大小範圍不同):byte
,short
,int
,long
,float
,double
,具體情況使用適合的型別
數學方法的使用類似Math.pow(a,b)
求a的b次方,這些方法定義在Java API的Math類裡
瞭解運算順序問題,各類運算子(時間有多可以理解下位運算)
第3章 選擇
boolean
資料型別,值為true
或者false
if-else if-else
以及巢狀...的學習
switch
的學習
形如y=(x>0)?1:-1
條件表示式的學習(因為三個運算元,所以是三元操作符,Java中唯一的三元)
第4章 數學函式、字元和字串
數學函式
做做學校題/演算法題的話,數學函式確實經常用用,要用了習慣/搜一下就好了(三角函式類,指數函式類,取整,最值,絕對值,隨機...)
Math.random()獲取隨機數
字元
char
字元資料型別,單個字元
char letter='A'
字串直接量在雙引號中,字元直接量單引號,“a”是字串,'a'是字元
字元的學習內容:
Unicode和ASCII碼
轉義字元
字元轉數值型資料(Unicode碼)
字元通過Unicode比大小
字元常用方法(判斷數字,字母,大小寫,返回大/小寫)
字串
String
先知道,不是基本型別,是引用型別
String message = "Hello"
簡單方法:length()
返字元數,charAt(index)
返回指定位置的字元,concat(s1)
本字串連線s1,trim()
去兩邊空格...
注意,從控制檯獲取字串用Scanner物件的next()
方法
字串的比較不可用> >= < <=,用==是判斷是否為同一個物件,比較主要用對應方法
字串取子串/單個字元有對應方法
數值型字串可以轉化為數字型別...
第5章 迴圈
幾種格式:
//while迴圈
while(迴圈條件) {
語句;
}
//do-while迴圈
do {
語句;
} while(迴圈條件)
//for迴圈
for (初始; 迴圈繼續條件; 迭代後操作) {
語句;
}
第6章 方法
方法定義可重用的程式碼從而簡化程式碼長度
像System.out.println()
,Math.random
都是Java庫定義好的,我們現在是要自定義方法,並學習相關知識
定義方法
關於void方法,不需要return,但是可以放
return;
終止
public static int max(int num1, int num2) {
int res;
if (num1 > num2)
res = num1;
else
res = num2;
return res;
}
/*
修飾符 返回值型別 方法名(引數列表) {
方法體
}
這裡的修飾就是public static,具體的面向物件的時候深入分析修飾
返回int
...
*/
方法頭裡的是形式引數
方法名和引數列表一起成為方法簽名
呼叫方法
依舊是剛才的max
int z = max(5,3);//這裡5和3是實際引數
我們注意到,一個Java程式會有一個main方法,main方法是由Java虛擬機器呼叫的
main的方法頭恆定的
public static void main(String[] args)
關於呼叫深入理解就是去理解呼叫堆疊,下次一定
引數傳遞
學習時常見的是引數順序匹配
呼叫帶引數的方法時,實參的值傳給形參整個過程是按值傳遞,如果實參是變數而不是直接量,則傳值,變數不受影響
過載方法
同名不同方法,簽名不同
上面講過,方法名和引數列表一起成為方法簽名
經典栗子就是剛才那個max(int num1, int num2)
,我們可以做一個也是max,然後裡面是double的過載方法
不同的引數列表而不能基於不同修飾符或者返回型別
區域性變數作用域
區域性作用域:宣告之始,知道包含該變數的塊結束為止
第7章 一維陣列
首先,Java陣列和C、C++的陣列有所區別(工作原理)
初始化
這裡的陣列一旦建立,大小固定,然後區分下宣告,建立等的差別還有一些會報錯的點
double[] mylist;//宣告
double[] mylist2 = new double[10];//宣告且建立
mylist2[0] = 5.6;//賦值
double[] mylist3 = {1,2,3.475,5};//初始化一個4大小的double陣列,且賦初值,注意沒有new
foreach
for (double e:mylist3) {
System.out.println(e);
}//遍歷整個陣列,大概翻譯為對mylist3的每個元素e進行{}內的操作
陣列複製
int[] list1 = {1,2,3};
int[] list2 = {4,5,6};
list1 = list2;
以上程式碼是把list2的引用值給了list1,即list1和list2都指向了{4,5,6},然後list1原來的{1,2,3}就成為垃圾給回收了
正確的“複製”:
迴圈語句逐個複製元素
System類中的arraycopy方法
clone方法
陣列傳遞給方法
我們知道,基本資料型別引數傳遞實參的值
而作為引用型別,會像一種“共享”,改變方法內的陣列,方法外的陣列也變化了
public class Test {
public static void main(String[] args) {
int x = 1;
int[] y = new int[10];
m(x, y);
System.out.println(x);
System.out.println(y[0]);
}
public static void m(int num, int[] nums) {
num = 100;
nums[0] = 22;
}
}
//輸出1和22,即陣列內容改變了
方法返回陣列
栗子:陣列反轉(效率另說)
public static int[] reverse(int[] list) {
int[] res = new int[list.length];
for(int i = 0, j = res.length - 1; i < list.length; ++i, --j) {
res[j] = list[i];
}
return res;
}
/*
使用如下:
int[] list1 = {1,2,3};
int[] list2 = reverse(list1);
*/
可變長引數列表
public static void printMax(double... numbers){
}
Java會建立一個數組然後把引數傳給他
查詢與排序
左轉演算法(其實就是懶
Arrays類
java.util.Arrays
裡面包含常用的陣列操作
java.util.Arrays.sort(array);//排序
java.util.Arrays.binarySearch(array, number);//二分查詢
java.util.Arrays.equals(list1, list2);//內容等
java.util.Arrays.toString(array);//返回字串,字串代表陣列所有元素
關於main(String[] args)
命令列引數
第8章 多維陣列
想要提高陣列的維數,只要在宣告陣列時將索引與中括號再加一組即可,所以三維陣列的宣告為int name[][][]
,而四維陣列為 int name[][][][]
,以此類推...
通常也將二維陣列看作是多維陣列
以三維為例,三維陣列有三個層次,可以將三維陣列理解為一個一維陣列,其內容的每個元素都是二維陣列。依此類推,可以獲取任意維數的陣列
多維陣列的宣告、初始化和使用都與二維陣列相似,因此這裡不再進行具體說明
舉個栗子
public static void main(String[] args) {
String[][][] namelist = { { { "張陽", "李風", "陳飛" }, { "樂樂", "飛飛", "小曼" } },
{ { "Jack", "Kimi" }, { "Lucy", "Lily", "Rose" } }, { { "徐璐璐", "陳海" }, { "李麗麗", "陳海清" } } };
for (int i = 0; i < namelist.length; i++) {
for (int j = 0; j < namelist[i].length; j++) {
for (int k = 0; k < namelist[i][j].length; k++) {
System.out.println("namelist[" + i + "][" + j + "][" + k + "]=" + namelist[i][j][k]);
}
}
}
}
/*
namelist[0][0][0]=張陽
namelist[0][0][1]=李風
namelist[0][0][2]=陳飛
namelist[0][1][0]=樂樂
namelist[0][1][1]=飛飛
namelist[0][1][2]=小曼
namelist[1][0][0]=Jack
namelist[1][0][1]=Kimi
namelist[1][1][0]=Lucy
namelist[1][1][1]=Lily
namelist[1][1][2]=Rose
namelist[2][0][0]=徐璐璐
namelist[2][0][1]=陳海
namelist[2][1][0]=李麗麗
namelist[2][1][1]=陳海清
*/