java學習筆記(一)程式基本結構
Java程式設計的基本結構
1.一個簡單的Java應用程式(要十分注意java的大小寫)
關鍵字class表明Java的全部程式都在類中(這裡有一個對於類的有意思定義:將類看做是載入程式邏輯的容器,程式邏輯定義了應用程式的行為)
********************************************************************
public class FirstSample //這一行是表明了類的型別
{
public static void main(String[] args) //在所有包含主執行緒的程式中都會出現
{
System.out.println("HelloWorld"); //在螢幕上打印出
}
}
在類名以及關鍵字方面的限制:
類名必須以字母開頭,但是在後面的命名就可以隨意的採用數字或者是字母,而且沒有長度的限制。類名最好採用駱駝命名法(這樣顯得專業)
注意:
1>
所謂的駝峰命名法就是以單片語成你的函式名(方法名),變數,但是每個單詞的首字母都要大寫
例如: FirstSample isPrime
2>
System.out.print()這個方法在輸出之後不換行,緊緊地跟隨在最後一個字元的後面
System.out.println()這個方法在列印進行的時候,會進行換行
2.註釋
註釋一共有三種類型:
一。行註釋以//開始,到一行的末尾結束
第二就是塊註釋以/*開頭以*/結尾,同樣的在Java中/**/不能再進行巢狀其他的註釋符
第三就是用來自動的生成文件用法就是/** */
3.資料型別
a.整型
整型一共有四種類型:
標準整型int(範圍是正負二十億)、
短整型short(範圍是正負三萬兩千多)、
長整形long(反正是8個位元組,大的很)、
byte(127)
注意:
1>
長整形的後面有l或L, 16進位制有0x的字首,八進位制有字首0(不過不容易與進位制進行區分)
2>
從Java 7 開始就可以在數字的字面量的前面加上0b/0B,並且在數字中加上下劃線例如1_000_1111,編譯器在後期會把它刪除,不用管。
3>
在Java中沒有無符號型別
b.浮點型別
浮點型別就只有兩類單精度和雙精度(float/double),大部分在工程中的應用都是雙精度的。注意如果要使用單精度的時候(在單精度變數的後面加上F/f字尾,雙精度是預設的)
浮點數值用十六進位制進行表示
注:
在十六進位制表示法中,使用p表示指數而不是e
用於表示出錯情況和溢位的三個特殊的浮點數值:正無窮大、負無窮小、NaN(不是數字)
能不能檢測一個數據是不是非數值的一種方法(NaN的判斷的方法)
//例如正整數除以0就是NaN
if(Double.isNaN(x))
//檢測一個值是不是NaN
c.字元型別(char)
推薦儘量不要使用
d.變數
1>
變數的定義、變數的初始化
int variable = 100; //所有的變數都要進行賦值
double Dvariable = 100.0;
2>
常量的定義 在Java中利用final來指示常量,該變數只能被賦值一次,用大寫
可以使用一個常量類static final 定義的數值可以在一個類中的多個“函式”使用。一般定義於main方法的外部。如果一個常量宣告為public,其他的類的“函式”也可以使用這個常量。
4.運算子
a一般的具體運算子
+ - * / %
b.在Math類中包含各式各樣的數學函式:
計算數值的平方根sqrt() 例如 double y = Math.sqrt(x);
******************************************
具體的可以使用牛頓迭代法實現:
public static double sqrt(double c)
{
if(c < 0) return Double.NaN;
double err = 1e - 15;
double t = c;
while(Math.abs(t - c / t) > err * t) //abs是絕對值的方法
t = (c / t + t) * 2.0;
return t;
}
************************************************
進行冪運算所要用的pow()
例如 double y = Math.pow(x,a); //傳入兩個double引數,而且最後的計算結果也是double
進行取餘運算的floorMod(position+adjustment,12)得到0到11內的數
一些三角函式方法:Math.sin()、Math.cos()、Math.tan()、Math.atan()、Math.atan2()、
指數函式Math.exp、反函式Math.log、以10為底的對數Math.log10、
圓周率Math.PI,e的常量Math.E
注:
(呼叫這些數學方法的方法:在原始檔的頂部加上這些程式碼 import static java.lang.Math.*,就可以使用了)
c.數值型別轉換(略)、強制轉換(略)
注:
進行舍入運算就是找到最為接近的整數,呼叫Math.round方法
double x = 9.997;
int nx = (int)Math.round(x); //保留為最近的整數,仍然得強制轉換為整型
d.結合賦值(強制跟隨被賦值物件的型別)、自增/自減運算子(不要用)、關係運算符(略)、位運算子(P43)、括號/運算子級別(會細講這個問題)
5.字串
a.子串
使用String類的substring方法從一個大的字串中提取一個字串
String greeting = “Hello”;
String s = greeting.substring(0,3); //建立Hel
Substring的第二個引數是不想複製的第一個位置,在String類中字串都是從0開始計算
b.拼接
在Java中可以使用“+”進行連線,在連線的時候單詞與單詞之間的空格不計
進行字串與非字串進行拼接時,將非字串轉換為字串
int age = 13;
String rating = “PG”+age; //結果為PG13
將多個字串連線在一起,使用分界符分割,並且使用靜態的join方法
String all = String.join(“/”,”S”,”M”,”L”,”XL”);//輸出S/M/L/XL
c.不可變字串
在Java的String類中沒有提供可以修改字串的方法,可以先將目標字串提取出來,再進行連線
d.檢查字串是否相等
使用equals方法進行字串,字元的比較
s.equals(t); // 檢測兩個s,t字串是否相等
如果比較兩個字串相等與否(不區分大小寫)
“Hello”.equalsIgnoreCase(“hello”);
不要使用==運算子進行字串是否相等的判斷
e.空串與Null串
空串就是長度為0的字串,可以用來檢測一個字串是不是為空
呼叫方法:
if(str.length()==0) if(str.equals(“”)) //用來判斷字串是不是空
注:
空串是一個java物件,有自己的串長度(0)和內容(空)
不過有一個特殊的值,null,這個變數沒有任何物件與之關聯
檢測方法:
if(srt == null) //檢測一個字串是不是null
if(str != null && str.length() != 0)
//檢測一個字串既不是空字串,也不是null
f.碼點和程式碼單元
1>
length方法返回採用UTF-16編碼方式的程式碼長度(字串所需的程式碼單元的數量)
String greeting = “Hello”;
int n = greeting.length(); //返回5
2>
得到實際的長度就是碼點的數量
int cpCount = greeting.codePointCount(0,greeting.length());
3>
呼叫s.charAt(n)返回位置n的程式碼單元
char first = greeting.charAt(0); //返回Hello的第一個字元H
使用codePoint的方法來遍歷字串
int cp = sentance.codePointAt(i);
if(Charcter.isSupplementaryCodePoint(cp)) i += 2;
else i++;
g.構建字串
連線許多小段字串用StringBuilder類
步驟:
構建一個空的字串構建器
StringBuilder builder = new StringBuilder();
當每次新增一部分內容的時候
builder.append(ch);
builder.append(str);
在需要構建字串的時候呼叫toString類,得到一個String物件
String completedString = builder.toString();
6.輸入輸出
A.
讀取輸入(Scanner定義在java.util.*包中,在使用之前必須將它用import載入進來)
進行標準輸入流System.in,首先構造一個Scanner物件,並與System.in相關聯
Scanner in = new Scanner(System.in);
使用Scanner類的方法進行輸入的操作
****************************************************
nextLine方法輸入一行(在輸入的行中可能存在空格)
System.out.println(“What your name?”);
String name = in.nextLine();
讀取一個整數,呼叫nextInt方法
System.out.println(“How old are you?”);
int age = in.nextInt();
想要讀取下一個浮點數,呼叫nextDouble方法
int num = in.nextDouble();
使用Java中的Console這個類進行密碼的輸入
Console cons = System.console();
String username = cons.readLine(“User name :”);
char[] passwd = cons.readPassword(“Password :”);
注:
返回的密碼是存放在一維陣列中,對密碼進行處理之後吧應該立刻用填充值來覆蓋這個密碼的值
B.格式化的輸出
利用Java SE 中的C語言庫函式中的printf方法
double x = 10000.0/3.0;
System.out.printf(“%8.2f”,x);//可以用8個字元寬度,以及可以小數點後兩位
在printf的方法中可以使用多個引數
System.out.printf(“Hello,%s . Next year ,you will be %d ”,name,age);
System.out.printf(“Hello,”+name+”. Next year ,you will be ”+(age+1));
//對比這兩句話上面的在名字,年齡的地方進行了替換
注:
每一個以%開頭的格式說明符都用相應的引數進行替換,f表示浮點數,d表示整數,s表示字串
System.out.printf(“%,.2f”,10000.0/3.0);//輸出3,333.33
printf方法中時間和日期的表達方法(本來可以直接使用java.time包)
格式包括兩個字母,以t開始以轉換表中的任意一個轉換符為結束System.out.printf(“%tc”,new date());
//打印出當前的日期和時間 Mon Feb 09 18:05:19 PST 2015
System.out.printf(“%tF”,new date()); //列印ISO8601日期
C.檔案輸入與輸出*
想要對檔案進行讀取,就需要用File物件構造一個Scanner物件
Scanner in = new Scanner(Path.get(“myfile.txt”),”UTF-8”);
//指定了採用UTF-8編碼形式的名為myfile的txt檔案,就是生成了一個檔案叫做myfile
如果檔案中包含反斜槓“\”,必須在每個反斜槓之前再加一個額外的反斜槓“\”
“C:\\mydirectory\\myfile.txt”
想要寫入檔案,就需要構造一個PrintWriter物件,在構造器中,只需要提供檔名
PrintWriter out = new Scanner(“myfile.txt”,”UTF-8”);
//如果該檔案不存在,就會建立該檔案,然後就可以正常的使用print,println,printf
注:
如果用一個不存在的檔案構建一個Scanner,或者用一個不能被建立的檔名,系統就會丟擲異常
public static void main(String[] args) throws IOexception
{
Scanner in = new Scanner(Path.get("myfile.txt"),"UTF-8");
}
當發生異常的時候,紅色字型的部分的功能就是丟擲這個異常的原因與形式
//**********************************************
API
* java.util.Scanner
Scanner(File f) //構造從指定檔案中讀取資料的Scanner
Scanner(String data) //構造從給定字串中讀取資料
* java.io.PrintWriter
PrintWriter(String fileName) //將資料寫入檔案中,名字自己起
* java.nio.Paths
static Path get(String pathname) //根據給定的路徑名,構造一個Path,就是指路
//*********************************************************************
7.控制流
A.塊作用域
一對大括號括起來的多條Java語句(在巢狀的塊中不能定義同名的變數---就是括號
套括號的情況下)
B.條件語句(與C++一樣略)
C.迴圈(略與C++一樣)
注:
for迴圈進行浮點數比較的時候,由於舍入否認操作有可能永遠無法繼續進行下面步驟
for(double x = 0;x != 10;x += 0.1;)
在迴圈體內部定義的變數不能再定義到外部
switch語句與C++完全一樣(略)
在Java中switch的標籤case
*可以是char、byte、short、int的常量表達式
*列舉常量
*case標籤還可以是字串字面常量
***********************************
String input;
Switch(input.toLowerCase())
{
case "yes" :
.........
break;
}
D.中斷控制流程語句
break語句
正常的不帶標籤的break語句
while(years <= 100)
{
balance += payment;
double interest = banlance * interestRate / 100;
balance += interest;
if(balance >= goal) break;
years++;
}
使用case的標籤跳轉語句(就是在你想要跳轉的地方放置一個標籤,然後使用break語句+你的標籤)
注:所有的置在外面的標籤的值必須放在最外層迴圈之前,加上冒號
read_data:
while(......)
{ ........
break read_data;
}//作用就是返回上一個放置標籤read_data的地方(最外層)
如果輸入有誤的話,break就會跳轉到帶標籤語句塊的末尾,所以當迴圈中帶有break標籤的時候必須檢測迴圈能不能正常進行
continue語句
將語句控制轉到最內層的迴圈
*******************************************
Scanner in = new Scanner(System.in);
while(sum>goal)
{.........
if(n<0) continue;
statement.....
}//直接跳出當前迴圈的剩餘部分,直接跳到迴圈的首部(在沒有for語句的情況下)
//for語句的話,就是直接跳轉到for語句的“++部分”
還有帶標籤的continue語句,就是跳到帶有標籤的迴圈塊的首部
大數值
使用java.math包中的BigInteger BigDecimal (就是處理超出範圍的數的方法)
呼叫包的格式:
import java .math.*; //使用math這個包
BigInteger實現了對於任意精度的整數進行計算
BigDecimal實現了對於任意精度的浮點數的計算
BigInteger a = BigInteger.valueOf(100);
//將100轉為精度不受限制的大數值
不能繼續使用通常的“+”“*”進行一般的算術運算
BigInteger c = a.add(b); //將大數值a和b進行相加
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); //d=c*(b+2)
BigInteger k = d.divide(b); //k=d/b
在Java中裡面用一個包的方法必須先:包名 變數名 =包名.方法名(引數)
//****************************************************************
API
* java.math.BigInteger
BigInteger a .add(BigInteger b) //a+b
BigInteger a.multiply(BigInteger b) //a*b
BigInteger a.divide(BigInteger b) //a/b
BigInteger a.mod(BigInteger b) //a%b
BigInteger a.subtract(BigInteger b) //a-b
int a.compareTo(BigInteger b) //a,b相等返回0,a<b返回負數,a>b返回正數
BigDecimal (和BigInteger一樣的用法)
//*************************************************************************
9.陣列
A.陣列的基本概念
宣告陣列:
int[] a; //宣告一個變數名為a的整型陣列
對陣列進行初始化操作
int[] a = new a[100]; //建立一個可以儲存100個元素的陣列,並且將陣列初始化為0
對陣列進行迴圈賦值
for(int i= 0;i<100;i++)
a[i] = i; //填充陣列從0到99(fills the array with numbers 0 to 99)
*建立一個數字陣列時,初始化為0
int[] a = new a[100];
*建立一個boolean陣列,初始化為false
*建立一個物件陣列,初始化為null(表示在這些元素中啥也沒有)
String[] names = new String[10];
for(int i=0;i<10;i++)
names[i] = “ ”; //指定元素為空串
想要獲取陣列中字元的個數,使用array.length方法
for(int i=0;i<array.length;i++)
B.for each迴圈
定義一個變數暫時存放集合中的每個元素,並執行相應的語句或是語句塊
for(int element: a)
System.out.println(element); //遍歷a中的每一個元素,執行相應的語句
可以利用Arrays類中的toString方法直接就進行輸出
System.out.println(Arrays.toString(a));
//將a中的所有元素以逗號進行分割,並且放在括號裡打印出來
C.陣列的初始化以及匿名陣列
int[] smallPrimers = {2,3,4,5,6};
//不用呼叫new
new int[] {34,45}; //直接開闢匿名陣列
int[] smallPrimers = new int[] {34,45}
//使用匿名陣列給已知陣列重刷
int[] annoymous = {23,45};
smallPrimer = annoymous; //直接就可以用陣列來初始化陣列(重刷,確保型別一致
注:Java中陣列可以為0長度
D.陣列拷貝
在Java中可以將一個數組變數拷貝給另外的一個數組變數(就是用陣列宣告陣列)
int[] a = smallPrimer;//smallPrimer也是一個數組變數
將整個陣列的所有的值進行拷貝,使用Arrays類的copyOf方法
int[] copiedLuckyNumber = Arrays.copyOf(LuckyNumber,LuckyNumber.length);
//方法中的引數就是陣列名,陣列長度
可以使用這樣的拷貝方法增加陣列的長度
int[] LuckyNumber = Arrays.copyOf(LuckyNumber,2*LuckyNumber.length);
注:
如果陣列時數字型的,多餘的數字就會被置為0
如果陣列時boolean型別,多餘的元素就會被置為false
如果你將要進行拷貝的目標陣列的位寬小,拷貝的陣列就會截斷
E.命令列引數
每一個Java程式都帶有String arg[]引數的main方法,表明main方法接受一個字串陣列
**************************************
public class Massage
{
public static void main(String[] args)
{
if(args.length == 0 || args[0].equals("-h"))
System.out.print("Hello ");
else
if(args[0].equals("-g"))
System.out.print("Goodbye ,");
for(int i = 0;i < args.length;i++)
System.out.print(" "+args[i]);
}
}
如果在命令列介面輸入
java Massage -g cruel world
//這個陣列包含以下的內容
-g
cruel
world
然後執行這個程式
Goodbye,cruel world
***********************
注:
你在同時必須要注意,所謂的java Massage 並不包含在args陣列當中
F.陣列排序
1>
對數值型陣列進行排序用Arrays類中的sort方法
int[] a = new int[100];
Arrays.sort(a);
2>
產生隨機數
呼叫Math.random方法返回一個0到1之間的隨機浮點數
int r = (int)(Math.random() * n);
//用返回的這個浮點數乘以n就可以得到0 到n- 1之間的一個整數了
API
static type copeOf(type[] a,int length) //拷貝陣列,後面的是長度
static type sort(type[] a) //對陣列進行排序
static void fill(type[] a.type v) //將陣列全部置為v,型別隨前面
static boolean equals(type[] a,type[] b)
//陣列a,b大小相同,下標元素相同返回true ***********************************************************
G.多維陣列(和c++完全一致)
二維陣列初始化
int[][] a = {
{1,2,3,4},
{2,3,4,5},