天天看點

Java基本類型與引用類型

基本類型(primitive type)

Java基本類型與引用類型
  • boolean 不同于C語言Java在JVM實作中用整形0 1表示。JVM對整形指令做了優化。
  1. "位"用0和1來表示 ,true的值在記憶體中就表示1,false在記憶體中就是表示0。
  2. 不同于int的0和1,一個int型的變量,占用的記憶體空間是4個位元組,4*8 位
  • char前256個表示特殊字元; 字元常量為用單引号括起來的單個字元,例如: char c = 'A'; char i=97;
  1. java字元采用Unicode編碼,可用十六進制編碼形式表示。 char c1 = '\u0061';
  2. 在字元的操作中還存在着轉義字元。例如:換行符\n,制表符\t,回車符\r,雙引号\",反斜杠\\,單引号\'
  • 整數型: byte、short、 int、long Java語言整型常量的四種表示形式: 二進制整數,0b或0B開頭,如:int a=0B110; 十進制整數,預設類型 八進制整數,要求以0開頭,如 int a = 012; 十六進制整數,要求0X或0x開頭,如int b = 0x12;
  1. byte,short,char → int → long → float → double
  2. byte,short,char之間不會互相轉換,他們在計算時首先會轉換為int類型。 基本資料類型轉換之——向下轉型
  3. 容量大的資料類型轉換為容量小的資料類型時,要加上強制轉換符,但可能 造成精度的降低或溢出,使用時要格外注意。
  4. 有多種類型的資料混合運算時,系統首先自動的将所有資料轉換成容器最 大的資料類型,再計算。
  • 浮點數型: float、 double(預設) double和float并不能表示一個精确的數字; 兩種表示方式:
  1. 十進制形式: 例如:3.14 ,168.0, .618
  2. 科學計數法形式: 例如:3.14e2, 3.14E2,
  3. 要聲明一個常量為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 作為值可以指派給任意引用類型

Java基本類型與引用類型
Java基本類型與引用類型

原生類型,這裡避免引用類型null指派

Java基本類型與引用類型

在做數學運算時所有的number類型符合數學運算性質,無論是否是同一類型。如:3L==1+2;

優先使用基本類型,除了引用類型占用更多的記憶體外,隐式的拆箱可能會有空指針問題,在性能上引用類型也差很多。在使用基本類型的引用資料類型時,一定要時刻注意引用類型是個對象,方法中含有引用類型參數時,它可能表示一個成員。避免隐式的自動裝箱把一個成員對應的序号轉成成員值。如:删除一個Integer成員,自動拆箱把它翻譯為一個序号,這個删除的是序号對應的另一個成員。

數字判斷

Java基本類型與引用類型

判斷字元串是不是空:

Java基本類型與引用類型

自動裝箱參數的設計問題

引用資料類型

接口、數組、類執行個體都是引用類型。其中數組和類執行個體是對象。null是任何引用類型的預設值,嚴格的說是所有Object類型(類、接口、數組等)的預設值。java中的任何引用變量都将null作為預設值。在使用沒有初始化的局部變量,編譯器會提示初始化。null既不是對象也不是一種類型,它僅是一種特殊的值,你可以将其賦予任何引用類型,你也可以将null轉化成任何類型。

null是Java中一個很重要的概念。null設計初衷是為了表示一些缺失的東西,例如缺失的使用者、資源或其他東西。

你可能知道不能調用非靜态方法來使用一個值為null的引用類型變量。它将會抛出空指針異常,但是你可以用一個值為null的引用類型使用靜态方法。因為每個類東西都隐含指向類class對象,通過class對象調用靜态方法,索引不會抛出空指針異常。這種間接調用類屬方法并不推薦。關于靜态方法你可以參考這篇文章,或者在後面學習。下面是一個例子:

Java基本類型與引用類型

數組

在記憶體中申請一塊連續的位址塊,儲存同一種類型資料的集合,元素個數和每個元素占用記憶體固定。數組裡的每個元素都有下标,編号從0開始;依次遞增。

數組的資料結構非常節省記憶體,引用隻需要儲存記憶體塊的其實位址,根據類型占用記憶體計算可以擷取目标元素,這樣也避免了記憶體尋址,非常快速。

  1. 效率,數組是一種效率最高的存儲和随機通路對象引用序列的方式。數組就是一個簡單的線性序列,這使得元素通路非常快速。
  2. 數組辨別符是一個引用指向在堆中的一個對象,儲存指向其他數組成員對象的引用。隻讀成員length表示此數組對象可以存儲多少元素。"[]"文法是通路數組對象的唯一方式。
  3. 數組與泛型,數組要求元素是确定的,是以不能是參數類型,數組對象用一個标示表示是哪種類型的數組,你可以在參數中使用T[],表示T泛型數組,在傳參數過程其實是确定的。

數組聲明

靜态初始化:初始化數組時已經指定資料集合

上面寫法是一種推薦簡寫,下面是标準寫法。

Java基本類型與引用類型

動态初始化:指定資料類型和長度,在需要是指派。

Java基本類型與引用類型

多元數組

Java基本類型與引用類型

操作數組的工具類-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個元素。

  1. src - 源數組。
  2. srcPos - 源數組中的起始位置。
  3. dest - 目标數組。
  4. destPos - 目标資料中的起始位置。
  5. length - 要複制的數組元素的數量。

引用類型

String

Java基本類型與引用類型

String 與StringBuffer、StringBuilder:三個字元串對象

Java基本類型與引用類型

這會在字元串常量池中産生3個字元串對象:ja、va、java。

針對這個問題,用StringBuilder、StringBuffer的方法拼接字元串會産生一個對象,StringBuffer是線程安全的。一般建議用StringBuilder

主動引用

引用類初始化的5種條件:

  1. new 關鍵字執行個體化對象、讀取或設定類的靜态字段、調用類的靜态方法
  2. 反射調用
  3. 初始化父類
  4. Jar 包等類似,main 方法為入口的類
  5. 動态語言

    除此之外都不會觸發類初始化。(類并不是對象)

    被動引用

    Java基本類型與引用類型
    Java基本類型與引用類型
    Java基本類型與引用類型
    Java基本類型與引用類型

    這裡可以看到類隻有在用子類時子類初始化了,其它都沒有觸發初始化。這是jvm的優化。

    接口

    接口引用不會觸發所有父接口初始化,隻有用到的接口初始化。

    Java基本類型與引用類型
    反編譯後的結果。(跟這個有關系嗎?)
    Java基本類型與引用類型
    Java基本類型與引用類型

繼續閱讀