Java核心技術筆記 語言基礎

《Java核心技術 卷Ⅰ》 第3章 Java 的基本程序設計結構前端

一些規則

  • 類命名:CamelCase 駝峯命名法,以及必須是字母開頭,後面跟字母和數字的任意組合;
  • 源代碼文件名:必須與公共類的名字相同(包括大小寫);
  • Java中的函數:都是屬於某個類的方法(而不是稱爲成員函數);
  • Java通用語法:object.method(parameters)
  • Java使用雙引號分隔字符串;
  • println輸出後會換行,而print輸出後不換行;
  • 註釋方法:
    • 單行:code; //comment
    • 多行:/* comment */,不可嵌套使用;
    • 文檔:使用方式以下
    /** * This is a document comment * @from Core Java Chapter 3 */
    複製代碼

數據類型

  • 8種基本類型(primitive type):
    • 4種整形:byte,short,int,long
    • 2種浮點型:float,double
    • Unicode編碼字符單元:char
    • 真值:boolean
    • Java沒有無符號類型。
  • 若是須要數值計算不含任何偏差,應使用BigDecimalBigInteger類;
  • NaN不能用 == 來判斷。

變量

  • 聲明變量:type name;
  • 變量名規則:字母開頭,由字母或數字構成的序列,Java中的字母包括'A'~'Z'、'a'~'z'、'_'、'$'或者某種語言中表明字母的任何Unicode字符,數字包括'0'~'9'或者某種語言中表明數字的任何Unicode字符。
  • 變量名大小寫敏感,長度沒有限制;
  • 能夠在一行聲明多個變量,但不提倡;
  • 變量聲明儘量靠近變量第一次使用的地方;
  • final關鍵字指示常量,表示只能被賦值一次,常量經常使用全大寫;
  • static final關鍵字指示類常量,一個類中的多個方法使用,const雖然是保留字,可是目前並無使用;

運算符

  • 基礎運算符:+-*/%;
  • 整數被0除會產生異常,浮點數被0除會獲得無窮大或NaN結果;
  • 自增自減:++--,注意在其餘表達式中前綴和後綴的區別,簡易單獨使用,以避免產生困惑和問題;
  • 關係(比較)運算符以及邏輯運算符:沒有什麼特殊的,略;
  • 三元操做符: condition ? exp1(true) : exp2(false);
  • 位運算符:處理整數,與(&)、或(|)、非(~)、異或(^)、左移(<<)、右移(>>),在位模式下工做, >>>邏輯右移用0填充高位,>>>算數右移用符號位填充高位。其中須要注意的是,移位操做右邊的操做數,也就是移位位數值在運算前須要進行模數據位數的計算,int類型 1 << 351 << 3 的結果相同;
  • 數學函數:Math.method(x).

數值類型的轉換

  • 合法轉換基本原則:從低字節類型向高字節類型轉換;
  • 特殊狀況:int(4字節)、long(8字節)轉float(8字節)仍有可能有精度損失,long(8字節)轉double(16字節)也可能有精度損失,但int轉double沒有精度損失;
  • 以上是自動完成的類型轉換;
  • 強制類型轉換(cast):(type) var,注意轉換若是超出範圍則會截斷產生另外一個合法的值;
  • 舍入運算:Math.ground(x),注意返回的是long;

運算符優先級

暫時只記錄一些經常使用的,如下優先級遞減。java

除特殊說明,結合性(即在遇到相同優先級運算符時計算的順序)默認從左向右。git

  • 方法調用
  • 一元運算符:!,~(位非),++,--,+(正),-(負),強轉,new,從右到左
  • 乘、除、求餘數
  • 加、減
  • 移位
  • 大於(等於)、小於(等於)
  • 相等、不等
  • 位與
  • 位異或
  • 位或
  • 邏輯與
  • 邏輯或
  • 三元運算符,從右到左
  • 帶有賦值(=)操做的操做符,好比+=,-=,...,從右到左

當本身寫代碼時拿不許優先級的時候,省事點加括號就完事了。github

枚舉類型

enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };
Size s = Size.MEDIUM; //賦值爲null則表示沒有設置任何值
複製代碼

字符串

Java沒有內置的字符串類型,而是在標準Java類庫中提供了一個預約義類String,每一個用雙引號括起來的字符串都是String類的一個實例。算法

String emptyString = "";
String greeting = "Hello";
複製代碼

子串

String s = greeting.substring(0, 3);
複製代碼

substring方法的兩個參數是:數組

  1. 想要複製的第一個位置(從0開始)
  2. 不想複製的第一個位置(從0開始)

兩個參數相減就是子串的長度。安全

拼接

String name = "FirstName" + "LastName";
String age = 24 + "years old";
String person = String.join(",", name, age[, ...]);
// person is "FirstName LastName,24 years old[, ...]"
複製代碼

一個字符串與一個非字符串拼接時,後者轉換成字符串(任何一個Java對象均可以轉換成字符串,可能指的是Class.toString())。bash

不可變字符串

String類沒有提供修改字符的方法,編譯器可讓字符串共享以提升效率。多線程

字符串相等

"Hello".equals(greeting) //區分大小寫
"Hello".equalsIgnoreCase("hello") //不區分大小寫
複製代碼

必定不要使用==來解決這個問題,它只能肯定字符串是否在同一位置,而不是他們具備相同的字符內容app

若是虛擬機始終將相同字符串共享,那就可使用==,但實際上只有字符串常量是共享的,+substring等操做產生的結果並非共享的。

空串與Null串

""是長度爲0的字符串,若是要檢查字符串是否爲空串:

str.length() == 0
str.equals("")
複製代碼

Null串指的是String變量存放null,表示目前沒有任何對象與該變量關聯:

str == null
複製代碼

檢查字符串既不是null串也不是空串:

str != null && str.length() != 0
複製代碼

String API

只列出通常經常使用到的

  • int compareTo(String other):按照字典順序,字符串在other以前就返回負數,位於other以後則爲正數,相等返回0。
  • new String(int[] codePoints, int offset, int count:僅瞭解,用數組中從offset開始的count個碼點構造字符串。
  • boolean equals(Object other)
  • boolean equalsIgnoreCase(String other)
  • boolean startsWith(String prefix):若是以prefix爲開頭,返回true。
  • boolean endsWith(String suffix):若是以suffix爲結尾,返回true。
  • int indexOf(String str):返回與字符串str匹配的第一個子串的開始位置,若是不存在則返回-1。
  • int length()
  • String replace(CharSequence oldString, CharSequence newString):用newString代替原始字符串中全部oldString,可用String或StringBuilder做爲參數。
  • String substring(int beginlndex, int endlndex)
  • String toLowerCase()
  • String toUpperCase()
  • String trim():刪除原始字符串頭部和尾部空格。
  • String join(CharSequence delimiter, CharSequence... elements)

CharSequence類型的參數,這是一種接口類型,全部字符串都屬於這個接口。

構建字符串

當須要用許多較短字符串構成字符串時,使用String的拼接方式效率會比較低,每次鏈接都會產生一個新的String對象,耗時也浪費空間,使用StringBuilder類能夠避免這個問題。

StringBuilder builder = new StringBuilder();
builder.append(ch);
builder.append(str);
String string = builder.toString();
複製代碼

StringBuilder類的前身是StringBuffer,效率稍低可是容許多線程方式添加或刪除字符,若是隻是在單線程中編輯,則應該用StringBuilder替代它,兩個類的API相同。

  • int length()
  • StringBuilder appencl(String str or char c)
  • void setCharAt(int i, char c):將第i個代碼單元設置爲c。
  • StringBuilder insert(int offset,String str or char c):在offset位置插入一個串或單元並返回this。
  • StringBuilder delete(lnt startindex,int endlndex):刪除偏移量從startIndex到endIndex-1的代碼單元並返回this。
  • String toString():返回內容相同的字符串。

輸入輸出

讀取輸入

首先在程序的最開始添上:

import java.util.*
複製代碼

Scanner類定義在java.util包中,當使用的類不是定義在基本java.lang包中時,必定要import指示將相應包加載。

Scanner in = new Scanner(System.in);
System.out.print("Qusetion:");
String answer = in.nextLine();
複製代碼

nextLine方法獲取的是一個輸入行,只想讀取一個單詞(以空白符做爲分隔符),機會調用:

String answer = in.next();
複製代碼

讀取一個數:

int number = in.nextInt();
double weight = in.nextDouble();
複製代碼
  • boolean hasNext():檢查輸入中是否還有其餘單詞。
  • boolean hasNextInt()
  • boolean hasNextDouble()

若是想讀取一個輸入不可見的密碼,使用Console類:

Console cons = System.console();
String username = cons.readLine("User name:");
char[] password = cons.readPassword("Password:");
複製代碼

安全起見,在完成密碼處理再也不使用password後,應使用填充值覆蓋數組元素。

格式化輸出

double x = 10000.0/3.0;
System.out.print(x);
// 3333.3333333333335
System.out.printf("%8.2f", x);
// 8個字符寬度和小數點後兩個字符的精度打印x,也就是打印一個空格和7個字符
// 3333.33
System.out.printf("Hello %s, you are %d.", name, age);
複製代碼
  • d:十進制整數
  • x:十六進制整數
  • f:定點浮點數
  • e:指數浮點數
  • s:字符串
  • c:字符
  • b:布爾
  • %:百分號

使用靜態的String.format方法建立一個格式化字符串,而不打印輸出:

String str = Stirng.format("Hello %s, you are %d.", name, age);
複製代碼

文件輸入輸出

文件讀取:

Scanner in = new Scanner(Paths.get("myfile.txt"), "UTF-8");
// Scanner(File f)
// static Path get(String pathname):根據給定路徑名構造一個Path
// 而後使用前面介紹的Scanner的方法進行文件讀取
複製代碼

若是文件名(包括其路徑,好比C:\dir\),中有反斜槓,則要在每一個反斜槓前再加一個額外的反斜槓(由於反斜槓\是做爲轉義字符的存在,在字符串中要表示\則必須用\\)。

這裏指定了UTF-8字符編碼,要讀取一個文本時要知道它的字符編碼,若是省略字符編碼將會使用運行這個Java程序的機器的「默認編碼」,不一樣機器可能會有不一樣的「默認編碼」。

文件寫入:

PrintWriter out = new PrintWriter("myfile.txt", "UTF-8");
// PrintWriter(String fileName)
複製代碼

若是文件不存在,將建立該文件,使用print,printf,println等方法寫入數據。

注意,若是直接給Scanner一個字符串參數,Scanner會把字符串解釋爲數據而不是文件名。

Scanner in = new Scanner("myfile.txt");
// Scanner會包含10個字符的數據,而不是文件數據
複製代碼

另外,若是使用一個不存在的文件構造Scanner或者用一個不能被建立的文件名構造一個PrintWriter將會發生異常,Java編譯器認爲這些異常比「被0除」異常更嚴重。

控制流程

Java的控制流程結構與C和C++的同樣,只有不多的例外,Java沒有goto語句,但break語句能夠帶標籤,能夠實現從內層循環跳出的目的。另外還有一種變形的for循環,相似C#的foreach循環。

塊(block)做用域

塊,即複合語句,一對大括號括起來的若干Java語句,塊肯定了變量的做用域。

{ // block 1
  int i;
  {
    // block 2 這是一個嵌套塊
    int j;
  }
}
複製代碼

但不能在嵌套的兩個塊中聲明同名變量:

{ // block 1
  int i;
  {
    // block 2
    int i; // Error
  }
}
複製代碼

雖然C++中,容許這樣作,內層定義的變量會覆蓋外層定義的變量,有可能致使程序設計出錯,因此Java中不容許這樣作。

條件語句

if(condition1) { statement1 }
else if(condition2) { statement2 }
else { statement3 }
複製代碼

循環

while(condition) { statement }
複製代碼

若是但願循環體至少被執行一次,則使用:

do { statement }
while(condition);
複製代碼

肯定循環

for(declare; condition; refresh) { statement }
// for語句內部聲明的變量沒法在循環體外部使用
複製代碼

多重選擇

switch(condition)
{
  case 1:
    ...
    break;
  case 2:
    ...
    break;
  ...
  default:
    // no case match
    ...
    break;
}
複製代碼

case標籤能夠是:

  • 類型爲char、byte、short或int的常量表達式;
    switch(grade)
    {
      ...
      case 100:
      ...
    }
    複製代碼
  • 枚舉常量(當使用枚舉常量時,沒必要在標籤中指明枚舉名);
    Size size = ....;
    switch(size)
    {
      ...
      case SMALL: //no need to use Size.SMALL
      ...
    }
    複製代碼
  • JAVA SE 7 開始能夠用字符串字面量。
    switch(str)
    {
      ...
      case "yes":
      ...
    }
    複製代碼

中斷控制流程

break,使用在while和for循環中,用於提早中斷循環。

Java提供一個種帶標籤的break語句,用於跳出多重嵌套的循環語句。

tag:
while(...)
{
  ...
  for(...)
  {
    ...
    if(...)
    {
      break tag;
    }
  }
}
// 在break後會跳出綁定tag的循環體(在這裏也就是while)
// 而不是像普通break只是跳出for
複製代碼

continue,用於跳過本次循環,進行下一次循環體的執行。

大數值

基本的整數和浮點數精度不可以知足需求,可使用java.math包中的兩個頗有用的類:

  • BigInteger:任意精度的整數運算
  • BigDecimal:任意精度的浮點數運算

使用valueOf方法能夠將普通的數值轉換爲大數值:

BigInteger a = BigInteger.valueOf(100);
複製代碼

算術運算符是addsubtractdividemultiply,BigInteger還有mod運算:

BigInteger c = a.add(b);
// c = a + b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));
// d = c * (b + 2)
複製代碼

以及兩個大數的比較compareTo,相等返回0,小於返回負,大於返回正。

數組

聲明數組變量:

int[] a;
int[] b = new int[100];
複製代碼

固然Java中也能夠int a[]的聲明方式,看我的喜愛吧。

數組建立時的初始化:

  • int數組:全部元素初始化爲0
  • boolean數組:全部元素初始化爲alse
  • 對象數組:全部元素初始化爲null

獲取數組中的元素個數使用array.length

for each 循環

for each 循環語句的循環變量將會遍歷數組中的每一個元素,而不須要使用下標值。

for(variable:collection) { statement }

  • variable:用於暫存集合中的每個元素,並執行相應塊
  • collection:必須是一個數組或者實現了Iterable接口的類對象(好比ArrayList)。
for(int element : a)
{
  System.out.println(element);
}
複製代碼

數組初始化以及匿名數組

Java中,能夠建立數組對象的同時賦予初始值的寫法:

// 不須要調用new
int[] a = { 2, 3, 5, 7, 11, 13 };
// 初始化一個匿名的數組
a = new int[] { 17, 19, 23, 31, 37 };
// 這是如下語句的簡寫方式
int[] anonymous = { 17, 19, 23, 31, 37 };
a = anonymous;
複製代碼

Java中容許數組長度爲0,但這與null不一樣。

數組拷貝

數組變量拷貝:

int[] b = a;
b[0] = 1;
複製代碼

此時a中的第一個元素a[0]的值也會被修改成1。

數組值拷貝:

int[] c = Arrays.copyOf(a, a.length);
// 第2個參數是新數組長度,一般用於增長數組大小
int[] c = Arrays.copyOf(c, c.length * 2);
// 若是長度小於原始數組,則只拷貝前面的數據元素
複製代碼

命令行參數

若是使用下面這種形式運行一個Java程序:

java Message -g cruel world
複製代碼

則程序中獲取命令行參數的方法是:

public class Message {
  public static void main(String[] args) {
    // args就是參數數組
    System.out.printlf(Arrays.toString(args));
    // [-g, cruel, world]
  }
}
複製代碼

數組排序

int[] a = new int[1000];
...
Arrays.sort(a);
複製代碼

sort方法使用了優化的快速排序算法。

插播一個生成0到n-1之間隨機數的辦法:

int r = (int) (Math.random() * n);
// Math.random返回一個0-1(不包括1)的隨機浮點數
複製代碼

java.util.Arrays

  • static String toString(type[] a):a爲基本數據類型數組(不包括字符串數組),返回字符串,元素放在中括號內,並用逗號分隔。
  • static type copyOf(type[] a, int length)
  • static type copyOfRange(type[] a, int start, int end)
    • 返回與a類型相同的一個數組,長度爲length或end-start
    • start:起始下標(包含這個值)
    • end:終止下標(不包含這個值)
  • static int binarySearch(type[] a, type v)
  • static int binarySearch(type[] a, int start, int end, type v)
    • 採用二分法查找值v,查找成功則返回相應下標值,不然返回一個負數值r,-r-1是保持a有序的v應該插入的位置。
  • static void fi11(type[] a, type v):將數組的全部元素設置爲v。
  • static boolean equals(type[] a, type[] b):數組大小相同,而且全部對應下標的元素都相等,則返回true。

多維數組

int[][] magicSquare = 
{
  { 16, 3, 2, 13 },
  { 5, 10, 11, 8 },
  { 9, 6, 7, 12 },
  { 4, 15, 14, 1 }
};
// 訪問元素使用 magicSquare[i][j]
複製代碼

Java語言基礎總結

  • 基本命名規則:駝峯法
  • 三種註釋方式
  • 8種基本數據類型
  • 變量聲明以及命名規則
  • 基本運算符
  • 數值類型的自動與強制轉換
  • 各運算符優先級
  • 枚舉類型
  • String API
  • StringBuilder
  • 命令行輸入輸出
  • 文件輸入輸出
  • 控制流程
  • 中斷控制流程
  • 大數值
  • 數組以及相關操做

我的靜態博客:

相關文章
相關標籤/搜索