基礎篇-1.2Java世界的規章制度(上)

1 Java標識符數組

在Java語言中,有類、對象、方法、變量、接口和自定義數據類型等等,他們的名字並非肯定的,須要咱們本身命名。而Java標識符就是用來給類、對象、方法、變量、接口和自定義數據類型命名用的。測試

命名規則說明:this

  • 標識符能夠由字母、數字、下劃線(_)、美圓符($)組成,但不包含@、#、空格等其餘特殊字符,不能以數字開頭。例如:1name 是不合法的。注意:Java標識符是能夠容許中文命名的,由於Java內部使用了Unicode字符集。
  • 標識符不能是Java關鍵字和保留字(Java預留的關鍵字,之後的Java升級版本中可能做爲關鍵字),但能夠包含關鍵字和保留字。例如:不可使用 for 做爲標識符,可是 myfor 是能夠的。
  • 標識符是嚴格區分大小寫的,同時也沒有長度的限制。例如:Myfor 和 myfor 是兩個不一樣的標識符。
  • 標識符的命名也不能隨意而爲,最好是能反映其做用的,作到看其名知其意。

Java語言中具備特殊用途的詞,被稱爲關鍵字。Java中經常使用的關鍵字,以下所示:編碼

abstract extends break byte case catch
char class continue default do double
else if boolean false true public
interface long int float short void
final finally try for static this
null return new import throw throws
switch super while do private protected
package instanceof native implements synchronized volatile

下面這個Java代碼中的標識符,因爲錯誤命名的標識符,致使這個Java文件不能編譯成功,會直接報標識符相關的錯誤。spa

public class MyFirst { /** * 錯誤命名的標識符 */ String 1a = "test"; String u#a = "test"; String u@a = "test"; String void = "test"; String b a = "test"; /** * 正確命名的標識符 */ String _a = "test"; String $a = "test"; String aa = "test"; public static void main(String[] args) { System.out.println("Hello World!"); } }

 

2 Java數據類型線程

Java是一種強類型語言,每個變量都必須聲明其類型。Java的數據類型分有兩大類:基本類型(又稱內置數據類型)和引用類型。指針

 

2.1 基本類型code

Java提供了八種基本類型,其中有六種數字類型(四個整數型,long、short、int和byte,兩個浮點型,float和double),一種字符型,char,還有一種布爾型,boolean。對象

 

2.1.1 整數型blog

byte

byte 數據類型是8位、有符號的,以二進制補碼錶示的整數,默認值是0,在Java中佔用1個字節。

其能夠以8位,即8個0、1表示。8位的第一位是符號位,即0000 0001表示數字1,1000 0000表示-1。因此其最大值是0111 1111,即127(2^7-1);最小值是1111 1111,即-128(-2^7)。從而能夠知道,Java中一個byte字節的範圍是-128~127。

例子:

byte a = 10;

byte b = -10;

注意:其餘的整數型,如short、int和long,也是相似的用法,均可以以位數0、1表示,均有最大值和最小值,區別就是它們的位數不一樣。

 

short

short 數據類型是 16 位、有符號的,以二進制補碼錶示的整數,其默認值是0,在Java中佔用2個字節。

其能夠以16位,即16個0、1表示。最大值是32767(2^15 - 1),最小值是-32768(-2^15)。

例子:

short a = 10000;

short b = -10000;

 

int

int 數據類型是 32 位、有符號的,以二進制補碼錶示的整數,其默認值是0,在Java中佔用4個字節。

其能夠以32位,即32個0、1表示。最大值是2,147,483,647(2^31 - 1),最小值是-2,147,483,648(-2^31)。

例子:

int a = 1000;

int b = -1000;

 

long

long 數據類型是 64 位、有符號的,以二進制補碼錶示的整數,其默認值是0L,在Java中佔用8個字節。

其能夠以64位,即64個0、1表示。最大值是(2^63-1),最小值是(-2^63)。

注意:聲明long類型,最好是後面加上「l」或「L」,例如:

long a = 10000000;//這樣聲明不會出錯,由於在int數據類型的範圍內(21億內)
long b = 100000000000000;//這樣就確定會報錯,由於已經超過了int的範圍,必須改爲100000000000000L纔不會報錯

 

2.1.2 浮點型

float

float 數據類型,又被稱爲單精度類型,是單精度、32位、符合IEEE 754標準的浮點數,尾數能夠精確到7位有效數字,而最後一位第八位是存在舍入偏差不精確的,其默認值是0.0f,在Java中佔用4個字節。

float 數據類型的好處是在儲存大型浮點數組的時候可節省內存空間,可是不能用來表示精確的值,如貨幣。

例子:

float f = 123.3f;

 

double

double 數據類型,又被稱爲雙精度類型,是雙精度、64 位、符合IEEE 754標準的浮點數,精確程度是float的兩倍,便可精確到16位有效數字,而最後一位第17位是存在舍入偏差不精確的,其默認值是0.0d,在Java中佔用8個字節。

例子:

double d = 222.2;

注意:浮點數的默認類型爲double類型,可是double 數據類型一樣不能用來表示精確的值,如貨幣。若是須要精確的數字計算,可使用BigDecimal類。

 

科學計數法

一種計數的方法,一般用來表示比較大的數據,其中的E或e,表示10的幾回方。如,314e2,表示314 * 10^2,即31400;314e-2,表示314 * 10^-2,即3.14。

這種方法在Java中也是適用的。

float f = 314e-2f; // 314 * 10^-2
double d = 3.14e4; // 3.14 * 10^4
System.out.println(f); // 輸出3.14
System.out.println(d); // 輸出31400.0

 

2.1.3 字符型

char

char 類型是單一的16位Unicode字符,佔2個字節,能夠存儲任何字符,最大值是 \uffff(即爲65,535),最小值是 \u0000(即爲0)。

例子:

char a = 'A';

注意:單引號是用來表示字符常量的,例如'A'是一個字符,它與"A"是不一樣的,"A"表示含有一個字符的字符串。

 

char類型是能夠用來計算的,由於char在ASCII等字符編碼表中是有對應的數值的。而在Java中的char類型字符運算時,是直接當作ASCII表對應的整數來對待的。

char a = 'A'; int b = 1; int c = a+b; System.out.println(c); // 輸出66

 

Java語言中還容許使用轉義字符'\'來將其後的字符轉位其餘的含義,例如,char c = '\n';//表示換行符

下面列舉一些比較常見的轉義符。

轉義符 含義 Unicode 值
\n 換行 \u000a
\r 回車 \u000d
\t 製表符(tab鍵) \u0009
\" 雙引號 \u0022
\' 單引號 \u0027
\\ 反斜槓 \u005c

 

2.1.4 布爾型

boolean 類型表示一位信息,注意不是一個字節。其只有兩個值,true和false,默認值是false。

例子:

boolean a = true;

boolean 類型只是用來判斷邏輯條件,通常用於if、while、do while。

 

2.2 引用類型

Java爲每種基本類型都提供了對應的封裝類型(即引用類型):Byte、Short、Integer、Long、Float、Double、Character和Boolean。引用類型就是一種對象類型,它的值是指向內存空間的引用,即相似於c語言中指針指向地址。其實這裏的引用還跟變量、棧和堆是有關係的,可是這不是本節的關鍵,後續會有專門的一節來講明。

Java中的引用類型還分有四種,分別是強引用(StrongReference)、軟引用(SoftReference)、弱引用(WeakReference)和虛引用(PhantomReference)。其中,強引用是咱們使用最廣泛的引用,若是一個對象具備強引用,那垃圾回收器寧願拋出OOM(OutOfMemoryError)也不會回收它。

 

強引用(StrongReference)

這種引用是平時開發中最經常使用的,例如  String strong = new String("Strong Reference") 。當一個實例對象具備強引用時,垃圾回收器不會回收該對象,當內存不足時,寧願拋出OutOfMemeryError異常也不會回收強引用的對象,由於JVM認爲強引用的對象是用戶正在使用的對象,它沒法分辨出到底該回收哪一個,強行回收有可能致使系統嚴重錯誤。

 

軟引用(SoftReference)

若是一個對象只有軟引用,那麼只有當內存不足時,JVM纔會去回收該對象,其餘狀況不會回收。

以下例子,通常狀況下內存充足的話,ss指向的對象是不會被回收,可是若內存不足則會把ss給回收掉。

Book ss = new Book("NONO"); SoftReference<Book> softReference = new SoftReference<>(ss); ss = null; System.gc();
System.out.println("對象是否被回收:"+softReference.get());

軟引用能夠結合ReferenceQueue來使用,當因爲系統內存不足,致使軟引用的對象被回收了,JVM會把這個軟引用加入到與之相關聯的ReferenceQueue中。

以下例子,當系統內存不足時,觸發gc,這個Book就會被回收,但reference 將不會爲null。

ReferenceQueue referenceQueue = new ReferenceQueue(); SoftReference<Book> softReference = new SoftReference<>(new Book(), referenceQueue); Book book = softReference.get(); Reference reference = referenceQueue.poll();

 

弱引用(WeakReference)

只有弱引用的對象,當JVM觸發gc時,就會回收該對象。與軟引用不一樣的是,不論是否內存不足,弱引用都會被回收。弱引用能夠結合ReferenceQueue來使用,當因爲系統觸發gc,致使軟引用的對象被回收了,JVM會把這個弱引用加入到與之相關聯的ReferenceQueue中,不過因爲垃圾收集器線程的優先級很低,因此弱引用不必定會被很快回收。

 

虛引用(PhantomReference)

虛引用是全部類型中最弱的一個。一個持有虛引用的對象,和沒有引用幾乎是同樣的,隨時可能被垃圾回收器回收。當試圖經過虛引用的get()方法取得強引用時,老是會失敗。而且,虛引用必須和引用隊列一塊兒使用,它的做用在於跟蹤垃圾回收過程。

當垃圾回收器準備回收一個對象時,若是發現它還有虛引用,就會在垃圾回收後,銷燬這個對象,將這個虛引用加入引用隊列。程序能夠經過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。若是程序發現某個虛引用已經被加入到引用隊列,那麼就能夠在所引用的對象的內存被回收以前採起必要的行動。

 

2.3 基本數據類型轉換

2.3.1 自動類型轉換

所謂自動類型轉換,總結起來就是一句話,容量小的數據類型能夠自動轉換位容量大的數據類型。

例如,byte類型能夠自動轉換爲其餘容量比它大的數字類型(如int、short、float等等)。下面直接看一個實例,一切就清晰了。

public class MyFirst { public static void main(String[] args) { byte a = 5; short b = 5; int c = 5; long d = 5; float e = 5.0f; double f = 5.0; // 測試自動類型轉換,容量最小的是byte,容量最大的是double,從小容量自動轉換爲大容量且不報錯
        double g = a + b + c + d + e + f; System.out.println(g); } }

若在上面的例子中,把最後的輸出 g 的數據類型改成 float類型 float g = a + b + c + d + e + f; ,則確定會編譯不經過,報錯 cannot convert from double to float 。

 

2.3.2 強制類型轉換

強制類型轉換,又稱爲顯示類型轉換,即在其值符合被強制轉換的類型的狀況下,咱們能夠將其強制轉換爲該類型。下面看個實例便清楚了。

public class MyFirst { public static void main(String[] args) { int a = 5; short b = (short) a;// 此處若沒有(short)強制轉換,則確定會編譯不經過的
 System.out.println(b); } }

咱們再回到2.3.1看下這個例子,把 g 的數據類型改成 float類型 float g = a + b + c + d + e + f; ,其實這裏就只是由於 f 是double類型,若是咱們改爲這樣 float g = a + b + c + d + e + (float)f; ,將 f 的數據類型強制轉換爲float,程序就能夠正常運行了。

其實強制類型轉換,還包括了引用類型的強制轉換,不過這裏不說明,後面在講類的繼承和接口實現的時候會講到。

 

2.4 Java字符串(String)

String是一個特殊的包裝類數據,能夠用 String str = new String("Java"); 的形式來建立,也能夠用 String str = "Java"; 的形式來建立。可是,他們的建立過程是不同的,下面具體說明下他們不同的建立過程。

 String str = "Java"; 的建立過程:首先在常量池中查找是否存在內容爲"Java"的字符串對象;若不存在則會在常量池中建立一個"Java"的字符串對象,並讓str引用該對象;若"Java"的字符串對象已經存在常量池中,則會直接讓str引用該對象。

注意:常量池屬於類信息的一部分,而類信息是存在於JVM內存模型的方法區,即常量池是存在於JVM的方法區的,當類編譯時就會被分配到內存中。

 String str = new String("Java"); 的建立過程:

(1)定義一個str的String類型的引用並存放在棧中;

(2)在字符串常量池中判斷是否存在內容爲"Java"的字符串對象,若不存在的話則在常量池中建立一個,若存在則不須要建立;

(3)執行new操做,在堆中建立一個指定的對象"Java",須要注意的是,這裏堆的對象是字符串常量池中"Java"對象的一個拷貝對象;

(4)讓str指向堆中的"Java"對象,即str存儲的是堆中"Java"對象的地址。

下面舉個例子,讓咱們看得更加通透。

public class MyFirst { public static void main(String[] args) { String a = "Java"; String b = "Java"; String c = new String("Java"); String d = new String("Java"); System.out.println(a==b);        // true 由於均是指向常量池中的同一個對象
        System.out.println(a.equals(b));// true 由於他們的值相同
        System.out.println(c==d);        // false 由於他們在棧中存儲的地址不同,在堆中指向的對象也不同
        System.out.println(c.equals(d));// true 由於他們的值相同
 } }

圖解以下:

 

字符串的經常使用方法

返回類型 方法 說明
String concat(String str)  字符串的鏈接,將str字符串拼接到原來字符串的後面,並返回。
int length()  返回字符串的長度,這裏的長度是指字符串中Unicode字符的數目。
char charAt(int index)  索引特定位置的字符,並返回該字符。
boolean equals(Object anObject)  字符串的比較,比較兩個字符串的值是否相等,若相等則返回true,不然返回false。
int compareTo(String anotherString)  字符串的比較,比較兩個字符串的值大小,若原有值大則返回大於0的整數,若原有值小則返回小於0的整數,若他們相等則返回0。
String

substring(int beginIndex)

substring(int beginIndex, int endIndex)

 從字符串中截取子字符串,從beginIndex位置起,到endIndex位置爲止,但不包括endIndex位置的字符,截取子字符串,返回子字符串。
int

indexOf(int ch)

indexOf(int ch, int fromIndex)

indexOf(String str)

indexOf(String str, int fromIndex)

 從字符串中獲取對應字符第一次出現的位置,若整個字符串都沒有該字符,則返回-1。
String

trim()

去除原字符串的先後空格並返回。

 

下面看下這些經常使用方法對應的例子。

public class MyFirst { public static void main(String[] args) { String a = "I like Java "; String b = "very much!"; System.out.println(a.concat(b));// a和b字符串的拼接,輸出:I like Java very much!
 String c = "abc123"; System.out.println(c.length());// c字符串的長度,輸出:6
        System.out.println(c.charAt(2));// 索引c字符串中的2位置的字符,輸出:c
        System.out.println(c.substring(2));// 截取從2位置開始到結尾的字符串,輸出:c123
        System.out.println(c.indexOf("b"));// 獲取字符爲b的第一次出現的位置,輸出:1
 String d = "Java"; String e = "Java"; String f = "Java1"; System.out.println(d.equals(e));// 比較d和e的值,輸出:true
        System.out.println(d.equals(f));// 比較d和f的值,輸出:false
        System.out.println(d.compareTo(e));// 比較d和e的值,輸出:0
        System.out.println(d.compareTo(f));// 比較d和f的值,輸出:-1
 String g = "   asdfgh  "; System.out.println(g.trim());// 去掉g的先後空格,輸出:asdfgh
 } }

 

3 總結

  • Java標識符的命名,以及Java關鍵字。
  • Java數據類型,分有基本類型和引用類型。
  • 基本類型,有六種數字類型(四個整數型,long、short、int和byte,兩個浮點型,float和double),一種字符型,char,還有一種布爾型,boolean。
  • 引用類型,有強引用、軟引用、弱引用和虛引用,其中咱們日常廣泛用到的就是強引用。
  • 基本數據類型轉換,有自動類型轉換和強制類型轉換。
  • String字符串,一種特殊的包裝類數據。
相關文章
相關標籤/搜索