3基礎知識
Java是一個完整的平臺,擁有龐大的庫。
簡單、面向對象、網絡技能、健壯、安全、可移植、易解釋、高性能、多線程、動態(tài)。
3.3數據類型
.1整型
- int 4字節(jié) +-20億
- short 2字節(jié) -32768~32767
- long 8字節(jié) 好大好大 (后綴L)
- byte 1字節(jié) -128~127
- 二進制前綴(0b) 十六進制前綴(0x)
.2浮點類型
- float 4字節(jié) 6~7位有效數字
- double 8字節(jié) 15位有效數字
- 正負無窮大、NaN 檢測x是否為“非數值”————>Double.isNaN(X)
.3char類型
- 單個字符,通常用來表示字符常量
- Unicode編碼表
- 強烈建議不要使用
.4boolean類型
- false/true
- 和整型不能相互轉換
3.4變量
- 字母開頭,數字字母構成
- 判斷是否為字母:isJavaIdentifierStart/isJavaIdentifierPart
- 大小寫敏感
.1變量初始化
- 變量的聲明盡量靠近變量第一次使用的地方
- java中不區(qū)分變量的聲明和定義
.2常量
- final關鍵字,只能被賦值一次,之后無法更改
- static final,類常量,類中的方法可以使用;聲明為public,則其他類中也可以使用
3.5運算符
- 整數除0出異常,浮點數除0出無窮大/NaN
- 浮點計算的精度問題
.1自增/自減運算符
- ++/--咯
.2關系/boolean
- == < > <= >= && || !
- x==y?x:y
.3位運算符
- | ^ ~ &
.4數學函數和常量
- 三角函數、指數函數/對數函數、PI、E
.5數值類型之間的轉換
- 合法轉換/丟失精度(int到float;long到float/double)
- 兩個數值進行二元操作時,有double/float/long,則另一個也會轉換為對應類型。否則兩個操作數將都被轉換為int
.6強制類型轉換
- 截斷小數部分來取整
- 想要進行舍入運算(得到最接近的整數),需使用Math.round方法
double x=9.97;
int nx = (int)Math.round(x);//round返回long
.7括號和運算符級別

youxianji.jpg
.8枚舉類型
- 變量的取值只在一個有限的集合內
enmu Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE}
Size s = Size.MEDIUM
3.6字符串
- unicode字符序列
- Java沒有內置字符串類型,而是在標準Java類庫中提供一個預定義類,叫做String
- 每個用雙括號括起來的字符串都是String類的一個實例
.1子串
String greeting = "Hello";
String s = greeting.substring(0, 3);//"Hel"
- 第二個參數是不想復制的第一個位置,容易計算子串的長度。
.2拼接
- +號拼接字符串
int age = 13;
String rating = "PG" + age;//"PG13"
.3不可變字符串
- 不能修改其中的任何一個字符
.4檢測是否相等
- .equals()
- .equalsIgnoreCase()//不區(qū)分大小寫
.5空串與null
- 空串“”,長度為0
- if(str != null && str.length() != 0)
.6代碼點與代碼單元
.length(),返回unicode字符數量
想要得到實際長度,即代碼點的數量(從0開始):
int cpCount = greeting.codePointCount(0, greeting.length())得到第i個代碼點:
int index = greeting.offsetBytePoints(0, i);
int cp = greeting.codePointAt(idnex);要遍歷一個字符串:
int cp = sentence.codePoint(i);
if (Character.isSupplementaryCodePoint(cp)) i += 2;
else i++;
.7字符串API
- 好多好多個,熟記才能活用
.8構造字符串
- 傳統(tǒng)方法效率低,浪費空間
- 字符串構造器:
StringBuilder builder = new StringBuilder();
builder.append(ch);//添加單個字符
builder.append(str);//添加字符串
String completedString = builder.toString();
3.7輸入輸出
.1讀取輸入
- 標準輸出流;標準輸入流:
Scanner in = new Scanner(System.in);
System.out.print("What is your name?");
String name = in.nextLine();//in.next(); in.nextInt(); - Scanner是可見的,不適合讀取密碼,密碼用ole類實現(xiàn):
Console cons = System.console();
String userName = cons.readLine("User name:");
char[] passwd = cons.readPassword("Password:");
.2格式化輸出
- System.out.printf();沿用了C語言的語法,定長、定精度(轉換符表P57,標志符表P58)
- 日期和時間轉換符表P58:
System.out.printf(" %1$s %2$tB %2$te, %2$tY", "Due date:", new Date());
Due date: December 25,2016 - 圖3-6 格式說明符語法(O——O 不是很懂啊。 )
.3文件輸入與輸出
- 需要用File對象構造一個Scanner對象:
Scanner in = new Scanner(Paths.get("mufile.txt"));
PrintWriter out = new PrintWriter("myfile.txt"); - 不同編譯環(huán)境(命令行或IDE)下的啟動路徑不同,需要定位。若覺繁瑣,可以使用絕對路徑
- IOException,FileNotFoundException
可以利用重定向將任意文件捆綁到System.in和System.out:
java MyProg<myfile.txt> output.txt
避免FileNotFoundException
3.8控制流程
- 循環(huán)控制和多值檢測
.1塊作用域
- block,可嵌套,不可在兩個塊中聲明同名的變量
.2條件語句
if (condition) statement- 塊語句(block statement)
if (condition) statement1 else statement2if (condition1) statement1 else if (condition2) statement2 else statement3
.3循環(huán)
while (condition) statementdo statement while (condition)
.4確定循環(huán)
for (計數器變量初始化, 檢測, 更新)- 檢測兩個浮點數是否相等要格外小心。由于舍入誤差,最終無法得到精確值,可能會一直處于循環(huán)
.5多重選擇語:switch語句
.6中斷控制流程語句
- goto為保留字,但是并不可以使用
- break跳出當前循環(huán)體,帶標簽的break語句用于跳出多重循環(huán)
- continue語句將控制轉移到最內層循環(huán)的首部
- 可選語句,即使不使用也能表達出相應的邏輯含義
3.9大數值
- 已有變量類型不滿足精度要求,可使用java.math中包含的兩個類:BigInteger和BigDecimal
- BigInteger類實現(xiàn)了任意精度的整數運算,BigDecimal實現(xiàn)了任意精度的浮點數運算
- 使用valueOf方法可以將普通的數值轉換為大數值:
BigInteger a = BigInteger.valueOf(100) - 無法用算術運算符處理大數。使用add和multiply方法:
BigInteger c = a.add(b);//c = a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));//d = c*(b+2) - API要熟記
3.10數組
- 用來存儲同一類型值的集合的數據結構,通過整型下標訪問其中的值
type[] name;- 數字數組初始化為0,boolean數組初始化為false,對象數組初始化為null
- 獲得元素個數,使用array.length
- 一旦被創(chuàng)建,不能改變它的大小
.1for each循環(huán)
for (variable : collection) statement- 會遍歷數組中的每個元素,而不需要使用下標值
- 快速打印一維數組:
Sysytem.out.println(Array.toString(a))
.2數組初始化以及匿名數組
int[] smallPrimes = {2,3,5,7,11,13};
new int[] {17,19,23,29,31,37};//匿名數組
smallPrimes = new int[] {17, 19, 23, 31};
int[] anonymous = {17, 19, 23};
smallPrimes = anonymous;數組長度可以為0,長度為0和null不同
.3數組拷貝
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length)- 多余的數值型將被賦值為0,布爾型將被賦值為false
- 小于原始數組長度,只拷貝最前面的數據元素
.4命令行參數
public static void main(String[] args)- 如果使用:
java Message -g cruel world
運行程序。那么arg數組中將包含以下內容:
args[0]: "-g"
args[1]: "cruel"
args[2]: "world"
.5數組排序
int a = new int[1000];
...
Arrays.sort(a);//快排
.6多維數組
- for each不能自動處理二維數組的每一個元素,它按照行,也就是一維數組處理。想訪問二維數組的所有元素,需要兩個嵌套的循環(huán):
for (double[] row : a)
for (double value : row)
do something with value - 快速打印一個二維數組:
System.out.println(Array.deepToString(a))
.7不規(guī)則數組
- 只存在數組的數組