基本類型(primitive type)
- boolean 不同于C語言Java在JVM實作中用整形0 1表示。JVM對整形指令做了優化。
- "位"用0和1來表示 ,true的值在記憶體中就表示1,false在記憶體中就是表示0。
- 不同于int的0和1,一個int型的變量,占用的記憶體空間是4個位元組,4*8 位
- char前256個表示特殊字元; 字元常量為用單引号括起來的單個字元,例如: char c = 'A'; char i=97;
- java字元采用Unicode編碼,可用十六進制編碼形式表示。 char c1 = '\u0061';
- 在字元的操作中還存在着轉義字元。例如:換行符\n,制表符\t,回車符\r,雙引号\",反斜杠\\,單引号\'
- 整數型: byte、short、 int、long Java語言整型常量的四種表示形式: 二進制整數,0b或0B開頭,如:int a=0B110; 十進制整數,預設類型 八進制整數,要求以0開頭,如 int a = 012; 十六進制整數,要求0X或0x開頭,如int b = 0x12;
- byte,short,char → int → long → float → double
- byte,short,char之間不會互相轉換,他們在計算時首先會轉換為int類型。 基本資料類型轉換之——向下轉型
- 容量大的資料類型轉換為容量小的資料類型時,要加上強制轉換符,但可能 造成精度的降低或溢出,使用時要格外注意。
- 有多種類型的資料混合運算時,系統首先自動的将所有資料轉換成容器最 大的資料類型,再計算。
- 浮點數型: float、 double(預設) double和float并不能表示一個精确的數字; 兩種表示方式:
- 十進制形式: 例如:3.14 ,168.0, .618
- 科學計數法形式: 例如:3.14e2, 3.14E2,
- 要聲明一個常量為float型,則需在常 量後加上f 或 F或轉型 float pi3 = (float)3.14;
基本類型的引用類型
簡介
原始類型 | byte | short | int | long | char | float | double | boolean |
引用類型 | Byte | Short | Integer | Long | Character | Float | Double | Boolean |
引用類型說明
- 除了Integer和Character定義的名稱和對應的基本類型差異大,其他六種都是将首字母大寫就可以了。
- Integer,Byte,Float,Double,Short,Long都是Number類的子類。(Number類後面講);
- Character和Boolean都是Object直接子類;
- 8個類都是final修飾的(不可被繼承)。
- 引用類型,内部維護一個對應基本類型資料引用。自動轉換是通過調用自身引用。是以要避免引用類型為null,空對象不能調用自身屬性和方法。儲存引用是需要占記憶體的,這個機器的尋址空間有關。通常java在32/64位作業系統都占4位元組。原因是64為作業系統開啟了指針壓縮。
基本資料類型和包裝類互相轉換
- 把基本資料類型 → 包裝類:
- 通過對應包裝類的構造方法實作
- 除了Character外,其他包裝類都可以傳入一個字元串參數建構包裝類對象。
- 包裝類 → 基本資料類型
- 包裝類的執行個體方法xxxValue(); // xxx表示包裝類對應的基本資料類型
基本類型和String之間的轉換
- String → 基本類型,除了Character外所有的包裝類提供parseXxx(String s)靜态方法,用于把一個特定的字元串轉換成基本類型變量;
- 基本類型 → String,String 類有靜态方法valueOf(),用于将基本類型的變量轉換成String類型。
預設值
引用類型預設值為null,null 作為值可以指派給任意引用類型
原生類型,這裡避免引用類型null指派
在做數學運算時所有的number類型符合數學運算性質,無論是否是同一類型。如:3L==1+2;
優先使用基本類型,除了引用類型占用更多的記憶體外,隐式的拆箱可能會有空指針問題,在性能上引用類型也差很多。在使用基本類型的引用資料類型時,一定要時刻注意引用類型是個對象,方法中含有引用類型參數時,它可能表示一個成員。避免隐式的自動裝箱把一個成員對應的序号轉成成員值。如:删除一個Integer成員,自動拆箱把它翻譯為一個序号,這個删除的是序号對應的另一個成員。
數字判斷
判斷字元串是不是空:
自動裝箱參數的設計問題
引用資料類型
接口、數組、類執行個體都是引用類型。其中數組和類執行個體是對象。null是任何引用類型的預設值,嚴格的說是所有Object類型(類、接口、數組等)的預設值。java中的任何引用變量都将null作為預設值。在使用沒有初始化的局部變量,編譯器會提示初始化。null既不是對象也不是一種類型,它僅是一種特殊的值,你可以将其賦予任何引用類型,你也可以将null轉化成任何類型。
null是Java中一個很重要的概念。null設計初衷是為了表示一些缺失的東西,例如缺失的使用者、資源或其他東西。
你可能知道不能調用非靜态方法來使用一個值為null的引用類型變量。它将會抛出空指針異常,但是你可以用一個值為null的引用類型使用靜态方法。因為每個類東西都隐含指向類class對象,通過class對象調用靜态方法,索引不會抛出空指針異常。這種間接調用類屬方法并不推薦。關于靜态方法你可以參考這篇文章,或者在後面學習。下面是一個例子:
數組
在記憶體中申請一塊連續的位址塊,儲存同一種類型資料的集合,元素個數和每個元素占用記憶體固定。數組裡的每個元素都有下标,編号從0開始;依次遞增。
數組的資料結構非常節省記憶體,引用隻需要儲存記憶體塊的其實位址,根據類型占用記憶體計算可以擷取目标元素,這樣也避免了記憶體尋址,非常快速。
- 效率,數組是一種效率最高的存儲和随機通路對象引用序列的方式。數組就是一個簡單的線性序列,這使得元素通路非常快速。
- 數組辨別符是一個引用指向在堆中的一個對象,儲存指向其他數組成員對象的引用。隻讀成員length表示此數組對象可以存儲多少元素。"[]"文法是通路數組對象的唯一方式。
- 數組與泛型,數組要求元素是确定的,是以不能是參數類型,數組對象用一個标示表示是哪種類型的數組,你可以在參數中使用T[],表示T泛型數組,在傳參數過程其實是确定的。
數組聲明
靜态初始化:初始化數組時已經指定資料集合
上面寫法是一種推薦簡寫,下面是标準寫法。
動态初始化:指定資料類型和長度,在需要是指派。
多元數組
操作數組的工具類-Arrays
常用方法:
static int binarySearch(type[] a, type key) 使用二分搜尋法來搜尋key元素在
static boolean equals(type[] a, type[] a2) 如果兩個數組長度相等和元素一一相等,則傳回 true
static void sort(type[] a) //sort(int[] arr)對指定的數組按數字升序進行排序。
static String toString(type[] a) 傳回指定數組内容的字元串表示形式。多個數組元素之間用英文逗号或空格隔開。
操作數組的工具類-System
使用java.lang.System類public static void arraycopy(Object src,int srcPos,Object dest, int destPos,int length):數組src從第srcPos項元素開始的length個元素拷貝到目标數組dest從destPos開始的length個元素。
- src - 源數組。
- srcPos - 源數組中的起始位置。
- dest - 目标數組。
- destPos - 目标資料中的起始位置。
- length - 要複制的數組元素的數量。
引用類型
String
String 與StringBuffer、StringBuilder:三個字元串對象
這會在字元串常量池中産生3個字元串對象:ja、va、java。
針對這個問題,用StringBuilder、StringBuffer的方法拼接字元串會産生一個對象,StringBuffer是線程安全的。一般建議用StringBuilder
主動引用
引用類初始化的5種條件:
- new 關鍵字執行個體化對象、讀取或設定類的靜态字段、調用類的靜态方法
- 反射調用
- 初始化父類
- Jar 包等類似,main 方法為入口的類
-
動态語言
除此之外都不會觸發類初始化。(類并不是對象)
被動引用
這裡可以看到類隻有在用子類時子類初始化了,其它都沒有觸發初始化。這是jvm的優化。
接口
接口引用不會觸發所有父接口初始化,隻有用到的接口初始化。
反編譯後的結果。(跟這個有關系嗎?)