Java基礎(第三章)

K# Java核心技術卷一


  • 逐一聲明每一個變量可以提高程序的可讀性。
  • 在Java中,變量的聲明盡可能地靠近變量第一次使用的地方,這是一種良好的程序編寫風格。
  • 常量名使用全大寫。使用關鍵字static final設置一個類常量。
    public static final double CM_PER_INCH = 2.54;類常量定義位于main方法的外部。
  • 我們建議不要在其他表達式的內部使用++,這樣編寫的代碼很容易令人困惑,并會產生煩人的bug。(一個笑話C++)
  • &&||按照短路的方式求值。&,|運算符應用于布爾值,得到的結果也是布爾值。不按短路方式計算。
  • >>>運算符將用0填充高位;>>運算符用符號位填充高位。沒有<<<運算符。
  • 強制類型轉換
得到最接近的整數 
double x = 9.997;
int nx = (int) Math.round(x);//round返回的結果是long類型
  • &&優先級比||的優先級高。+=右結合運算符。
  • substring方法的第二個參數是不想復制的第一個位置,substring可以計算字符串長度。
  • 當一個字符串和一個非字符串的值進行拼接時,后者被轉換成字符串(任何一個對象都可以轉換成字符串。
  • 在java文檔中將String類對象稱為不可變字符串。java的設計者認為共享帶來的高效率遠遠勝過于提取,拼接字符串帶來的低效率。
  • 檢測字符串是否相等 s.equals(t)s,t可以是字符串變量可以是字符串常量。==判斷字符串是否放在同樣位置上,如果在同樣位置上,它們必然相等。
  • if(str.length() == 0) 或 if(str.equals("")) 是否為空
  • if(str != null && str.length() != 0) 檢查字符串既不是null也不是空串
  • length()方法返回采用UTF-16編碼表示到給定字符串所需要到代碼單元數量.//3.6.6
int cpCount = greeting.codePointCount(0, greeting.length());//得到實際長度,即代碼點得數量.
char first = greeting.chatAt(0);//調用s.char.charAt(n)將返回位置n到代碼單元.
//得到第i個代碼點.
int index = gretting.offsetByCodePoint(0, i);
int cp = gertting.codePintAt(index);//
//遍歷一個字符串,依次查看每一個代碼點
int cp = sentence.codePointAt(i);
if(Chartacter.isSupplementaryCodePoint(cp)) i += 2;
else i++;
//回退操作
i--;
if(Chartacter.isSupplementaryCodePoint(cp)) i--;
int cp = sentence.codePointAt(i);
  • 常用的字符串API
API java.lang.Stirng 1.0
int codePointAt(int index);//返回給定位置開始或結束到代碼點
int offsetByCodePoints(int startIndex, int cpCount);//返回從startIndex代碼點開始,位移cpCount后的代碼點索引
int compareTo(String other);//按照字典順序,如果字符串位于other之前,返回一個負數;如果字符串位于other之后返回一個正數;如果兩個字符串相等,返回0
int indexOf(String str);
int indexOf(Sting str, int fromIndex);
int indexOf(int cp);
int indexOf(int cp, int fromIndex);//返回與字符串str或代碼點cp匹配的第一個子串得開始位置.這個位置從索引0或fromIndex開始計算.如果在原始串中不存在str,返回-1.
int codePointCount(int startIndex, int endIndex);//返回startIndex和endIndex-1 之間的代碼點數量.沒有配成對到代用字符將計入代碼點.
Stirng trim();//返回一個新字符串.這個字符串將刪除年原始字符串頭部和尾部到空格.
  • StringBuilder(JDK5.0引入StringBilder類,前身是StringBuffer)
StringBuilder builder = new StringBuilder();//構造空的字符串構建器
bulider.append(ch);添加內容
String completedString = builder.toStirng();//構建字符串,得到一個String對象,其中包含了構建器中的字符序列。
API java.lang.StringBuilder 5.0
StringBuilder();//構造一個空的字符串構建器
int length();//返回構建器或緩沖器中的代碼單元
StringBuilder append(String str);//追加一個字符串并返回this
StringBuilder append(char c);//追加一個代碼單元并返回this
StringBuilder appendCodePoint(int cp);//追加一個代碼點,并將其轉換為一個或兩個代碼單元并返回this
String toStrinig();//返回一個與構造器或緩沖區內容相同的字符串。
  • 標準輸入流System.in,Scanner
API java.util.Scanner 5.0
Scanner in = new Scanner(System.in);//用給定的輸入流創建一個scanner對象。
System.out.print("What is your name?");
String name = in.nextLine();//輸入一行,包括空格。
String firstName = in.next();//讀取一個單詞,以空格符作為分隔符。
System.out.print("How old are you?");
int age = in.nextInt();//讀取一個整數。nextDouble()讀取下一個浮點數。
  • 當使用的類不是定義在基本java.lang包中時,一定要使用import指定字將相應的包加載進來。
  • Scanner類,輸入是可見的,不適合用于控制臺讀取密碼。Java SE 6引入Console類實現讀取密碼
API java.io.Console 6
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");//Console每次只能讀取一行,沒有讀取一個單詞或者一個數值的方法。
API java.lang.System 1.0
staic Console console() 6 //交互操作
  • 每一個以%字符開始的格式說明符都用相應的參數替換。格式說明符尾部的轉換符將指示被格式化的數值類型。
  • printf方法中日期與時間的格式化選項。以t開始,以表3-7中任意字母結束的兩個字母格式。
System.printf("%tc", new Date());//Mon Feb 09 18:05:19 PST 2004
System.printf("%1$s %2StB %2$te, %2$tY", "Due date", new Date());//Due date: February 9, 2004
System.out.printf("%s %tB %<te, %<tY", "Due date: ", new Dte());//<標志,它指示前面格式說明中的參數將再次被使用。
  • 參數索引值從1開始,而不是從0開始,%1$...對第1個參數格式化。
  • 文件輸入輸出
Scanner in = new Scanner(Paths.get("myfile.txt"));
PrintWriter out = new PrintWriter("myfile.txt");
Scanner in = new Scanner("myfile.txt");//字符串
API java.io.PrintWrier 1.1
PrintWriter(String fileName);//構造一個將數據寫入文件的PrintWriter。文件名由參數決定。
API java.nio.file.Pahts 7
static Path get(String pathname);//根據給定的路徑名構造一個Path。
  • else與最鄰近的if構成一組
if(x <= 0) if(x == 0) sign = 0; else sign = -1;
  • 不成文的規定:for語句中的3個部分應該對同一個計數器變量進行初始化,檢測,更新。
  • 在循環中檢測兩個浮點數是否相等需要格外小心。
for(double x = 0; x != 10; x += 0.1)...//可能永遠不會結束,由于舍入的誤差,最終可能得不到精確值。循環中,因為0.1無法精確地用二進制表示,x將從9.99...98跳到10.09...98
  • 從n個數字中抽取k個數字
    $$\frac{n(n-1)(n-2)...(n-k+1)}{12345*6}$$
int lotterOdds = 1;
for(int i = 1; i <= k; i++) {
    lotterOdds = lotterOdds * (n-i+1) / i;
}
  • switch的case標簽可以是:
  1. 類型為char, byte, short或int(或其包裝類Character, Byte, Short和Integer)的常量表達式.
  2. 枚舉變量
  3. 從Java SE 7 開始,case標簽還可以是字符串字面量.
  • 當在switch語句中使用枚舉常量時,不必在每個標簽中指明枚舉名,可以由switch得表達式值確定.
Size sz = ...;
switch(sz) {
    case SMALL: //no need to use Size.SMALL
        ...
        breakl
    ...
}
  • 帶標簽的break,continue(標簽必須放在希望跳出到最外層循環之前,并且必須緊跟一個冒號.)
  • 大數值BigInteger(實現任意精度的整數運算),BigDecimal(實現任意精度的浮點數運算)
API java.math.BigInteger 1.1
BigInteger add(BigInteger other);//和
BigInteger subtract(BigInteger other);//差
BigInteger multiply(BigInteger other);//積
BigInteger divide(BigInteger other);//商
BigInteger mod(BigInteger other);//余數
//返回一個大整數和另一個大整數other的和,差,積,商以及余數。
static BigInteger valueOf(long x);//返回值等于x的大整數。
BigDecimal add(BigDecimal other);//和
BIgDecimal subtract(BigDecimal other);//差
BigDecimal multiply(BigDecimal other);//積
BigDecimal divide(BigDecimal other RoundingMode mode);//商
//返回這個大實數與另一個大實數other.HALF_UP是在學校學習的四舍五入方式。
static BigDecimal valueOf(long x);
static BigDecimal valueOf(long x, int scale);
//返回值位x或x/10^scale的大實數

$$x/10^{scale}$$

int[] a;//聲明整型數組a
int[] a = new int[100];//初始化一個數組,數組的長度不要求是常量,new int[n]創建一個長度位n的數組。
  • 創建一個數字數組時,所有的元素都會被初始化為0.boolean數組的元素會初始化稱false。對象數組的元素則初始化為一個特殊值null,這表示元素還未存放任何對象。
  • 一旦創建數組就不能再改變它的大小,如果經常需要在運行過程中擴展數組的大小,就應該使用另一種數據結構-數組列表(array list)。
  • 增強for循環的語句格式為:for(variable : collection) statement.定義一個變量用于暫存集合中的每一個元素,并執行相應的語句(或者語句塊)。collection這一集合表達式必須是一個數組或者是一個實現類Iterable接口的類對象(如ArrayList).(for each element in a)
  • 更簡單的方式打印數組中的所有值,Arrays.toString(a),返回一個包含數組元素的字符串,這些元素放在括號內,并用逗號分開,如:"[2, 3, 5, 7, 11, 13]".
int[] smallPrimes = {2, 3, 5, 7, 11, 13};//創建數組并初始化的簡化形式,不需要new
new int[] {17, 19, 23, 29, 31, 37};//初始化一個匿名數組
samllPrimes = new int[] {17, 19, 23, 29, 31, 37};
  • 在java中允許數組的長度為0.
int[] copiedLuckyNumbers = Array.copyOf(luckNumbers, luckNumbers.length);//將一個數組的所有值拷貝到一個新的數組中去。
luckNumbers = Arrays.copyOf(luckNumbers, 2 * luckyNUmbers.length);//這種方法通常用來增加數組的大小。如果數組是數值型,那么多余的元素將被賦值為0;布爾型,將賦值為false;如果長度小于原始數組的長度,則只拷貝最前面的數據元素。
  • java中的[]運算符被預定義為檢查數組邊界,而且沒有指針運算,即不能通過a加1得到數組的下一個元素。
public class Message {
    public static void main(String[] args) {
        if...
    }
}
java Message -g cruel world;//args數組將包含下列內容:args[0]:"-g";args[1]:"cruel";args[2]:"world"
  • 在java運行應用程序的應用程序到main方法中,程序名并沒有存儲在args數組中.例如,當使用下列命令運行程序時.java Message -h world;//args[0]是"-h",而不是"Message"或"java".
  • Arrays.sort(a);//對數值型數組進行排序,使用了優化的快速排序算法.
import java.util.*;
/**
  *3-7
  */
public class LotteryDrawing {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("How many numbers do you need to draw?");
        int k = in.nextInt();
        System.out.print("What is the highest number you can deaw?");
        int n = in.nextInt();
        int[] numbers = new int[n];
        for(int i = 0; i < numbers.length; i++) {
            int r = (int) (Math.random() * n);
            result[i] = number[r];
            numbers[r] = numbers[n - 1];
            n--;
            Arrays.sort(result);
            System.out.println("Bet the following combination.It'll make you rish!");
            for(int r : result)
                System.out.println(r);
        }
    }
}
API java.util.Arrays 1.2
//參數a 類型為int,long,char,byte,boolean,float或double的數組.
//start 包含這個值.
//end 不包含這個值.
//v 同a的數據元素類型相同的值.
static String toString(type[] a);//返回包含a中數據元素的字符串,這些數據元素被放在括號中,并用逗號分隔.
static type copyOf(type[] a, int length);
static type copyOf(type[] a, int start, int end);
static void sort(type[] a);
static int binarySearch(type[] a, type v);
static int binarySearch(type[] a, int start, int end, type v);//采用二分搜索算法查找v.如果查找成功,則返回相應到下標值;否則,返回一個負數值,-r-1是為保持a有序v應插入到位置.
static void fill(type[] a, type v);//將數組的所有數據元素值設置為v.
static boolean equals(type[] a, type[] b);//如果兩個數組大小相同,并且下標相同的元素都對應相等,返回true.
  • 二維數組(3.10.6),要想快速打印二位數組Arrays.deepToString(a);//格式:[[1, 2, 3], [2, 3, 4], [5, 6, 7]]
  • 不規則數組:只能單獨創建行數組.(3.10.7)
public class LotteryArray {
    public static void main(String[] args) {
        final int NMAX = 10;
        int[][] odds = new int[NMAX + 1][];
        for(int n = 0; n <= NMAX; n++)
            odds[n] = new int[n + 1];
        for(int n = 0; n < odds.length; n++) {
            for(int k = 0;k < odds[n].length; k++) {
                int lotteryOdds = 1;
                for(int i = 1; i <= k; i++)
                    lotteryOdds = lotteryOdds * (n - i + 1) / i;
                odds[n][k] = lotteryOdds;
            }
            for(int[] row : odds)
                System.out.printf("%4d", odd);
            System.out.println();
        }
    }
}

表3-3 特殊字符的轉義序列符
圖3-1 數值類型之間的合法轉換
表3-4 運算符優先級
表3-5 用于printf的轉換符
表3-6 用于printf的標志
表3-7 日期和時間的轉換符
圖3-6 格式說明符語法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,714評論 18 399
  • Java經典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,885評論 0 2
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,762評論 0 33
  • 1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什么限制?答:可以有多個類,但只能有一個publ...
    岳小川閱讀 948評論 0 2
  • 老師的幸福是什么? 推進教育全面發展給了我實施素質教育廣闊的天空,我把課堂還給學生,讓課堂充滿生命與活力;我帶領學...
    贛西小城閱讀 570評論 0 1