1. 程式人生 > 其它 >互斥鎖(mutex) python

互斥鎖(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]=陳海清
*/