Java知識點複習
學習Java的一些筆記
注意事項
- Java對大小寫很敏感
- 類名必須以字母開頭,後面可以跟字母和數字,也可以用 _和$ 兩種符號。不能使用Java保留字。(標準類名:以大寫字母開頭,如果類名由多個單片語成,每個單詞首字母應該要大寫
- 原始碼檔名必須與公共類的名字相同
- 為了程式碼能夠你執行,必須包含一個main方法
Java中的三種註釋
- 單行註釋( // )
- 多行註釋( /**/)
- 多行註釋 可以自動生成文件( /***/)
資料型別
型別 | 儲存需求 | 取值範圍 | |
---|---|---|---|
boolean | 1位元組 (8 bit) | true, false | |
char | 2位元組(16 bit) | 0 ~ 216-1 | |
byte | 整型 | 1位元組 (8 bit) | -128 ~ 127 |
short | 整型 | 2位元組 (16 bit) |
-32 768 ~ 32 767 (-215 ~ 215-1) |
int | 整型 | 4位元組 (32 bit) |
-2 147 483 648 ~ 2 147 483 647 (-231 ~ 231-1) |
long | 整型 | 8位元組 (64 bit) |
-9 223 372 036 854 776 808 ~ 9 223 372 036 854 775 807 (-263 ~ 263-1) |
float | 浮點型別 | 4位元組 (32 bit) | 大約±3.402 823 47E + 38F(有效位數為6~7位) |
double | 浮點型別 | 8位元組 (64 bit) | 大約±1.797 693 134 862 315 70E + 308(有效位數為15位) |
- 長整數型有一個字尾L (如4000000000L)
- 十六進位制數值有一個字尾0x (如0xCAFE)
- 八進位制有一個字首 0 (如010)
- 二進位制有一個字首 0b (如0b1001)
- Float型別的數值有一個字尾F (如 3.14F)
final 關鍵字
final關鍵字表示變數只能被賦值一次,一旦被賦值後,就不能被更改。
例如:
Final double CMCC = 2.54
如果希望某個常量可以在一個類中的多個方法中使用,稱這個常量為類常量。可以使用關鍵字static final 設定一個類常量,定義的位置在main方法外部。因此,同一個類的其他方法中也可以使用這個常量。如果一個常量被宣告為public,那麼其他類的方法也可以使用這個常量。
運算子
在java中,算術運算子可以用+ - * / 來代表加減乘除。
當參與除(/)運算的兩個運算元為整數時,表示整數除法,答案為整數。否則,表示浮點除法。
求餘數可以用%
例如 10%3等於1,10%3.0等於1.0
注意:整數除以0將會產生一個異常,而浮點數除以0將會得到無窮大或NaN結果。
i++ 和 ++i 的 區別
- 如果只是看i++和++i,這兩個是等價的,都等同於i=i+1,都是變數自身加1。
-
在一般情況下,它們都是跟賦值聯絡在一起。
比如:
int a; a=i++; //將i的值賦值給a,即a=i;然後再執行i=i+1; 也就是【a=i++;】與【a=i; i=i+1;】等價。 a=++i;//將i+1的值賦給a,即a=i+1;然後再執行i=i+1; 也就是【a=++i;】與【a=i+1;i=i+1;】等價。
總結一下
- 前置++是將自身加1的值賦值給新變數,同時自身也加1;
- 後置++是將自身的值賦給新變數,然後才自身加1.
關係運算符
三元操作符
Condition? expression1: expression2
當Condition為true時,計算或返回第一個表示式expression1,如果為false,則計算第二個表示式expression2.
如 x <y ? x: y
返回x和y中較小的那個值。
數值型別之間的轉換
整型、實型(常量)、字元型資料可以混合運算。運算中,不同型別的資料先轉化為同一型別,然後進行運算。轉換過程中可能導致溢位或損失精度
低----------------------------------------------------------高 byte, short, char—> int —> long—> float —> double
自動型別轉換
必須滿足轉換前的資料型別的位數要低於轉換後的資料型別。
自動轉換由低到高的順序轉換
int n = 123456789; float f = n;//f值為1.234567892E8
當使用上面兩個數值進行二元操作時(例如 n+f, n是整數,f是浮點數),先要將兩個運算元轉換為同一種類型,然後再進行計算。
-
如果兩個運算元中有一個是double型別,另一個運算元就會轉換為double型別;
-
否則,如果其中一個運算元是float型別,另一個運算元將會轉換為float型別;
-
否則,如果其中一個運算元是long型別,另一個運算元將會轉換為long型別。
-
否則,兩個運算元都將被轉換為int型別。
強制型別轉換
高的向低的順序轉換
double x = 3.94; int y = (int) x;
x的結果為3,強制型別轉換通過截斷小數部分將浮點值轉為整型。
如果想要四捨五入,得到最接近的整數。可以使用Math.round方法
double x = 3.14; int y = (int) Math.round(x);
結果為 4,當呼叫round時,仍然需要使用強制型別轉換(int).其原理是因為round方法返回的結果為long型別。由於存在資訊丟失的可能性,所以只有使用顯式的強制型別轉換才能夠將long型別轉換成int型別。
不要在boolean型別與任何型別之間進行強制型別轉換,這樣可以防止發生錯誤。
運算子優先順序
優先順序 | 運算子 | 簡介 | 結合性 |
---|---|---|---|
1 | [ ]、 .、 ( ) | 方法呼叫,屬性獲取 | 從左向右 |
2 | !、~、 ++、 -- | 一元運算子 | 從右向左 |
3 | * 、/ 、% | 乘、除、取模(餘數) | 從左向右 |
4 | + 、 - | 加減法 | 從左向右 |
5 | <<、 >>、 >>> | 左位移、右位移、無符號右移 | 從左向右 |
6 | < 、<= 、>、 >=、 instanceof | 小於、小於等於、大於、大於等於,物件型別判斷是否屬於同類型 | 從左向右 |
7 | == 、!= | 2個值是否相等,2個值是否不等於。 下面有詳細的解釋 | 從左向右 |
8 | & | 按位與 | 從左向右 |
9 | ^ | 按位異或 | 從左向右 |
10 | | | 按位或 | 從左向右 |
11 | && | 短路與 | 從左向右 |
12 | || | 短路或 | 從左向右 |
13 | ?: | 條件運算子 | 從右向左 |
14 | =、 += 、-= 、*= 、/=、 %=、 &=、 |=、 ^=、 <、<= 、>、>= 、>>= | 混合賦值運算子 | 從右向左 |
字串
子串substring
String類的substring方法可以從一個較大的字串提取出一個子串。
substring(a,b)
- a 表示開始的位置(從0開始計數)
- b表示不想複製的第一個位置
例如
String greeting = "hello"; String s = greeting.substring(0,3); // s = hel //從0開始計數,直到3位置,但是不包括3,所以返回 hel
substring的一個優點:容易計運算元串的長度,長度為b-a。
例如 hel的長度為 3-0=3
檢測字串是否相等
可以使用equals來檢測兩個字串是否相等。
s.equals(t)
如何相等,會返回true,否則,返回false. s和t可以是字串變數,也可以是字串常量。
eg: "hello".equals(greeting)
檢測是否相等,而且不區分大小寫,可以使用equalsIgnoreCase方法。
eg: "hello".equalsIgnoreCase("HeLLO)
不能使用==運算子來檢測兩個字串是否相同,這個運算子只能夠確定兩個字串是否放置在同一個位置。
空串和Null串
空串是一個Java物件,有自己的串長度(0)和內容(空)。可以通過呼叫以下程式碼檢查字串是否為空。
if(str.length()==0) 或 if (str.equals(""))
null
表示目前沒有任何物件與該變數關聯。可以通過呼叫以下程式碼檢查字串是否為null
if (str == null) 要檢測一個字串既不是null也不是空串: if (str != null && str.length()!=0)
length() 與 charAt()
length方法會返回採用UTF-16編碼表示的給定字串所需的程式碼單元數量。
想要得到實際的長度,即程式碼點數量,可以呼叫
xxx.codePointCount(0,xxx.length())
呼叫s.chatAt(n)將返回位置n的程式碼單元,n介於0~ s.length()-1 之間。
eg:
String greeting = "Hello" char first = greeting.charAt(0);// first is H char last = greeting.charAt(4);// last is o
想得到i個的程式碼點,可以使用
int index= greeting.offsetByCodePoints(0,i); int cp = greeting.codePonintAt(index);
輸入輸出
讀取輸入
為了能夠讀取使用者在控制檯的輸入,首先需要建立一個Scanner物件,並與“標準輸入流”System.in關聯。
Scanner in = new Scanner (System.in)
-
next()
讀取到輸入有效的字元才會結束輸入,對於輸入有效的字元之前 的空白會自動去掉,輸入有效的字元之後 的空白作為分隔符或者結束符。next() 不能得到帶有空格的字串。 -
nextLine()
以enter為結束符,nextLine()可以得到帶有空格的字串,不會去掉空白,會全盤輸出。 -
nextInt()
得到int型別的資料。nextDouble(),nextFloat()以此類推。 -
boolean hasNext()
檢測輸入中是否有還有其他單詞。
記得要import java.util.*;
import java.util.*; public class Input_and_Output { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); System.out.print("what is your name :"); String name = in.nextLine(); System.out.print("age :"); int age = in.nextInt(); System.out.println("the name is " + name + ",the age is "+age); } //輸入結果: //what is your name :jerry //age :24 //the name is jerry,the age is 24
格式化輸出
System.out.print(X)會將以x對應的資料型別所允許的最大非0數字位數列印輸出x
double x = 10000.0/3.0; System.out.print(x);// x = 3333.3333333333335
為了能夠方便格式輸出結果,可以使用printf()。
double x = 10000.0/3.0; System.out.printf("8.2f",x); // x = 3333.33 使用8個字元的寬度和小數點後兩位字元的精度列印x // 因為小數點後2位,為3333.33。但是指定要8個字元的寬度,所以左邊會補一個空格 // x結果為(1個空格)3333.33
用於printf的轉換符
轉換符 | 型別 | 舉例 |
---|---|---|
%s | 字串型別 | "Hello" |
%c | 字元型別 | 'H' |
%b | 布林型別 | true OR false |
%d | 整數型別(十進位制) | 10 |
%x | 整數型別(十六進位制) | 9f |
%o | 整數型別(八進位制) | 237 |
%f | 浮點型別 | 15.9 |
%a | 十六進位制浮點型別 | 0x1.fccdp3 |
%e | 指數型別 | 6.23e+24 |
%g | 通用浮點型別(f和e型別中較短的) | 42.5000 |
%h | 雜湊碼 | 42628b2 |
%% | 百分比型別 | % |
%n | 換行符 | 相當於"\n"換行作用 |
%tx | 日期與時間型別(x代表不同的日期與時間轉換符) | 見博文下表 |
大數值
如果基本的整數和浮點數精度不夠滿足需求,那麼可以使用java.math包中的兩個很有用的類:BigInteger 和BigDecimal 。這兩個類可以處理包含任意長度數字序列的數值。
- BigInteger 實現任意精度的整數運算
- BigDecimal 實現任意精度的浮點數運算
把普通的數值轉換成大數值,可以使用靜態的function valueOf() { [native code] }方法
BigInteger a = BigInteger.function valueOf() { [native code] }(100)
大數值的運算不能使用常用的算術運算子(如+,*)處理,而是要使用大數值類中的add
和multiply
BigInteger c = a.add(b); // c=a+b BigInteger d = c.multiply(b.add(BigInteger.function valueOf() { [native code] }(2))); // d = c*(b+2)
其他的運算包括有subtract(減)
,divide(除)
和mod(餘數)
陣列
陣列宣告
陣列是一種資料結構,用來儲存同一型別值的集合
陣列宣告方式:
int[] array 或者int array[]
陣列初始化
int[] array = new int[100];
int[] arry = new int[]{1,2,3,4,5}
int[] array = {1,2,3,4,5}
建立一個數字陣列時,所有的元素都初始化為0。
boolean陣列的元素會初始化為false
物件陣列的元素會初始化為一個特殊值null
public class Array { public static void main(String[] args) { int[] test = new int[5]; for(int i =0;i<test.length;i++) { System.out.println(test[i]);} } }
輸出的結果會是: 0 0 0 0 0
重要:
一旦創據陣列,就不能再改變陣列的大小。如果需要在執行中擴充套件陣列的大小,則需要使用另一種資料結構——陣列列表(array list)
for each迴圈
Java有一種很強的迴圈結構,可以用來依次處理陣列中的每個元素而不必為指定下標值而分心。
格式:
for(variable:collection) statement
定義一個變數用於暫存集合中的每一個元素,並執行相應的語句。
collection這一集合表示式必須必須是一個數組或者是一個實現了Iterable介面的類物件(例如Arraylist)。
eg:
for(int element :a) System.out.println(element) //列印陣列a的每一個元素,一個元素佔一行 // for each element in a
陣列拷貝
在java中,允許將一個數組變數拷貝到給另一個數組變數。這時,兩個變數將引用同一個陣列
int[] a = {2,3,5,7,11,12}; int[] b = a; a[5] = 12 // b[2] = 12
如果想將一個數組的所有值拷貝到一個新的陣列去,使用Arrays類的copyTo方法。
int[] copieda = Arrays.copyTo(a,a.length);
第二個引數是新陣列的長度,可以通過這個方法來增加陣列的大小。
eg:Arrays.copyTo(a,2*a.length);
增加到2倍大
如果陣列元素是數字陣列時,多餘的元素都賦值為0。
如果陣列元素是boolean陣列,多餘的元素會賦值為false
如果陣列元素是物件陣列的元素,多餘的元素賦值為特殊值null
如果長度小於原始陣列的長度,則只拷貝前面的資料元素