1 Java標識符數組
在Java語言中,有類、對象、方法、變量、接口和自定義數據類型等等,他們的名字並非肯定的,須要咱們本身命名。而Java標識符就是用來給類、對象、方法、變量、接口和自定義數據類型命名用的。測試
命名規則說明:this
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 總結