讀書筆記《寫給大忙人的JavaSE 9 核心技術》
第一章 基本的編程結構
關於Java用途的定義
Java 不是用來快速完成幾個命令的腳本語言,它明確定位爲可以從組織有序的類和包以及模塊中獲益的大型程序的編程語言
JShell
Java 9中引入的運行Java語句的交互式命令窗口,和Python Node差不多。
基本類型
8種基本類型
有符號整型
類型 | 存儲需求 |
---|---|
byte | 1個字節 ( -128–127) |
short | 2個字節 (-32768–32767) |
int | 4個字節 (約20億) |
long | 8個字節 (約9千億億) 2的63次方 |
如果long類型還不夠用,可以使用BigInteger類
-
0x 是16進制前綴
-
0b是2進制前綴
tips:爲了方便閱讀,可以在數字中間加上下劃線,1_000_0000,編譯時會自動刪除掉。
浮點類型
類型 | 存儲需求 |
---|---|
float | 4個字節 (6-7位有效小數) |
double | 8個字節 (15位有效小數) |
對於float來說,4個字節,32位,0-22位表示尾數,23-30(8位)表示指數,31位表示符號位。
對於double來說,8個字節,64位,0-51表示尾數,52-62(11位)表示指數,63位最高位表示符號位。
浮點數不適合做金融計算
java
2.0-1.1 = 0.89999999999
二進制表示浮點數有些數字是沒辦法精確表示的。
如果要精準無誤的表示應使用 BigDecimal
char 類型
JAVA中,char佔2字節,16位。可在存放漢字
- char a='a'; //任意單個字符,加單引號。
- char a='中'; //任意單箇中文字,加單引號。
- char a=111; //整數。0~65535。十進制、八進制、十六進制均可。輸出字符編碼表中對應的字符。
注:只能放單個字符。
布爾類型
true false
關於字符集、字符編碼
Unicode
Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。
Unicode通常用兩個字節表示一個字符,原有的英文編碼從單字節變成雙字節,只需要把高字節全部填爲0就可以。
ASCII
一個字節能表示的最大的整數就是255(二進制11111111=十進制255),0 - 255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
GB2312
如果要表示中文,顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼衝突,所以,中國製定了GB2312編碼,用來把中文編進去。
參考資料:
- https://www.cnblogs.com/tsingke/p/10853936.html
- https://baike.baidu.com/item/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81
strictfp
關鍵字strictfp是strict float point的縮寫,指的是精確浮點,它是用來確保浮點數運算的準確性,JVM在執行浮點數運算時,如果沒有指定strictfp關鍵字,此時計算結果可能會不精確,而且計算結果在不同平臺或廠商的虛擬機上會有不同的結果,導致意想不到的錯誤。
而一旦使用了strictfp來聲明一個類、接口或者方法,那麼在所聲明的範圍內,Java編譯器以及運行環境會完全依照IEEE二進制浮點數算術標準來執行,在這個關鍵字聲明的範圍內所有浮點數的計算都是精確的。
需要注意的是,當一個類被strictfp修飾時,所有方法都會自動被strictfp修飾。
因此,strictfp可以保證浮點數運算的精確性,而且在不同的硬件平臺會有一致的運行結果。
public strictfp class Test {
int a = 1;
public static void testStrictfp(){
float f = 0.12365f;
double d = 0.03496421d;
double sum = f + d;
System.out.println(sum);
}
public static void main(String[] args) {
testStrictfp();
}
}
運行結果:0.15861420949932098
字符串
字符串不是基本類型,字符串是對象!
字符串連接
將幾個字符以分隔符連接起來,可以使用join()方法,
String names = String.join("-","Peter","Paul","Mary")
在操作大量字符串時,使用StringBuilder 效率更高
字符串截取
String w = "Hellow,World";
w.substring(7,12);// 開始位置,結束位置(不包含)
字符串比較相等
w.equals("World")
//是比較在內存中是否是一個對象,而不是字面量
w == "World"
// 不考慮大小寫比較字符串
w.equalsIgnoreCase("World")
數字轉字符串
Integer.toString(number,n)// number要轉換的數字,n:基數,就是幾進制,不傳默認十進制
//最簡便的方法 數字加空串
number+""
字符串轉數字
Integer.parseInt()
Double.parseDouble()
讀取輸入
System.in對象只能讀取單個字節的方法,要讀取字符串和數字,需要構造一個依附到System.in的Scanner
Scanner in = new Scanner(System.in)
String s = in.nextLine()
if(in.hasNextInt()){
int age = in.nextInt()
}
//讀取密碼是可以只用Console類
Console terminal = System.console()
String s = terminal.readLine("user name");
char[] pasw = terminal.readPassword("Password");
shell 重定向
輸入輸出到文件
java mypackage.MainClass<input.txt> output.txt
此時System.in從input.txt中讀取,System.out將會輸出到output.txt
循環
break 跳出整個循環
continue 跳出此次循環
數組和數組列表
數組定長不可變
String[] myStringArr = nwe String[100]
構造數組時Java會默認填充數組,
- 數字類型、char類型 用0填充
- boolean 用 false 填充
- 對象數組用null填充
數組列表較爲靈活
ArrlyList對象在內部管理數組。數組不夠用時會自動創建另外一個內部數組,並且將元素移動到該數組。這個過程對程序員透明。
數組列表是泛型類,泛型類不能使用基本類型作爲類型參數,要用基本類型的包裝類。
ArrayList<int> //錯誤
ArrayList<Integer>//正確
- Integer
- Byte
- Short
- Long
- Character
- Float
- Double
- Boolean
增強型for循環
int[] numbers = new int[10]
for(int n : numbers){
sum += n
}
此時的循環變量不是索引值,而是索引對應的值。
數組與數組列表的複製
int[] numbers = new int[10]
int[] myNums = numbers
此時numbers,myNums這兩個變量引用同一個數組對象,也就是這兩個變量共享一個數組,利用numbers進行操作,myNums也會變。JavaScript中也是這樣!
int copys = Arrays.copyof(numbers,numbers.length)
//friends爲已有的數組列表
ArrayList<String> copys = new ArrayList<>(friends)
命令行參數
java test.java -name merry -p 3306
-name merry -p 3306 這四個字符串會封裝成一個字符串數組傳遞給main函數
public static main(String[] args)