<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 1. Java的基本數據類型和引用類型,自動裝箱和拆箱 - 4 類 8 種基本數據類型。4 整數型,2 浮點型,1 布爾型,1 字符型 | 類型 | 存儲 | 取值范圍 | 默認值 | 包裝類 | | ---------- | ---- | ------------------------------------------------------------ | --------------- | --------- | | **整數型** | | | | | | byte | 8 | 最大存儲數據量是 255,最小 -2<sup>7</sup>,最大 2<sup>7</sup>-1,<br />[-128~127] | (byte) 0 | Byte | | short | 16 | 最大數據存儲量是 65536,[-2<sup>15</sup>,2<sup>15</sup>-1],<br />[-32768,32767],±3萬 | (short) 0 | Short | | int | 32 | 最大數據存儲容量是 2<sup>31</sup>-1,<br />[-2<sup>31</sup>,2<sup>31</sup>-1],±21億,[ -2147483648, 2147483647] | 0 | Integer | | long | 64 | 最大數據存儲容量是 2<sup>64</sup>-1,<br />[-2<sup>63</sup>,2<sup>63</sup>-1], ±922億億(±(922+16個零)) | 0L | Long | | **浮點型** | | | | | | float | 32 | 數據范圍在 3.4e-45~1.4e38,直接賦值時必須在數字后加上 f 或 F | 0.0f | Float | | double | 64 | 數據范圍在 4.9e-324~1.8e308,賦值時可以加 d 或 D 也可以不加 | 0.0d | Double | | **布爾型** | | | | | | boolean | 1 | true / flase | false | Boolean | | **字符型** | | | | | | char | 16 | 存儲 Unicode 碼,用單引號賦值 | '\u0000' (null) | Character | - 引用數據類型 - 類(class)、接口(interface)、數組 - 自動裝箱和拆箱 - 基本數據類型和它對應的封裝類型之間可以相互轉換。自動拆裝箱是 `jdk5.0` 提供的新特特性,它可以自動實現類型的轉換 - **裝箱**:從**基本數據類型**到**封裝類型**叫做裝箱 - **拆箱**:從**封裝類型**到**基本數據類型**叫拆箱 ```java // jdk 1.5 public class TestDemo { public static void main(String[] args) { Integer m =10; int i = m; } } ```   上面的代碼在 jdk1.4 以后的版本都不會報錯,它實現了自動拆裝箱的功能,如果是 jdk1.4,就得這樣寫了 ```java // jdk 1.4 public class TestDemo { public static void main(String[] args) { Integer b = new Integer(210); int c = b.intValue(); } } ``` ## 2. ValueOf緩存池   new Integer(123) 與 Integer.valueOf(123) 的區別在于,new Integer(123) 每次都會新建一個對象,而 Integer.valueOf(123) 可能會使用緩存對象,因此多次使用 Integer.valueOf(123) 會取得同一個對象的引用。 ```java Integer x = new Integer(123); Integer y = new Integer(123); System.out.println(x == y); // false Integer z = Integer.valueOf(123); Integer k = Integer.valueOf(123); System.out.println(z == k); // true ```   編譯器會在自動裝箱過程調用 valueOf() 方法,因此多個 Integer 實例使用自動裝箱來創建并且值相同,那么就會引用相同的對象。 ```java Integer m = 123; Integer n = 123; System.out.println(m == n); // true ``` valueOf() 方法的實現比較簡單,就是先判斷值是否在緩存池中,如果在的話就直接使用緩存池的內容。 ```java // valueOf 源碼實現 public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` 在 Java 8 中,Integer 緩存池的大小默認為 -128\~127。 ```java static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } ``` Java 還將一些其它基本類型的值放在緩沖池中,包含以下這些: - boolean values true and false - all byte values - short values between -128 and 127 - int values between -128 and 127 - char in the range \u0000 to \u007F 因此在使用這些基本類型對應的包裝類型時,就可以直接使用緩沖池中的對象。 參考資料: - [StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123](https://stackoverflow.com/questions/9030817/differences-between-new-integer123-integer-valueof123-and-just-123) ## 3. i++和++i有什么區別 ### i++ i++ 是在程序執行完畢后進行自增,而 ++i 是在程序開始執行前進行自增。 **i++ 的操作分三步** 1. 棧中取出 i 2. i 自增 1 3. 將 i 存到棧 三個階段:內存到寄存器,寄存器自增,寫回內存(這三個階段中間都可以被中斷分離開) 所以 i++ 不是原子操作,上面的三個步驟中任何一個步驟同時操作,都可能導致 i 的值不正確自增 ### ++i 在多核的機器上,CPU 在讀取內存 i 時也會可能發生同時讀取到同一值,這就導致兩次自增,實際只增加了一次。 i++ 和 ++i 都不是原子操作 **原子性**:指的是一個操作是不可中斷的。即使是在多個線程一起執行的時候,一個操作一旦開始,就不會被其他線程打斷。 JMM 三大特性:原子性,可見性,有序性。詳情請閱讀 Github 倉庫:[Java 并發編程](03%20Java%20并發編程.md) 一文。 ## 4. 位運算符 Java 定義了位運算符,應用于整數類型 (int),長整型 (long),短整型 (short),字符型 (char),和字節型 (byte)等類型。 下表列出了位運算符的基本運算,假設整數變量A的值為60和變量B的值為13 A(60):0011 1100 B(13):0000 1101 | 操作符 | 名稱 | 描述 | 例子 | | ------ | ---------- | ------------------------------------------------------------ | ----------------------------- | | & | 與 | 如果相對應位都是 1,則結果為 1,否則為 0 | (A&B)得到 12,即 0000 1100 | | \| | 或 | 如果相對應位都是 0,則結果為 0,否則為 1 | (A\|B)得到 61,即 0011 1101 | | ^ | 異或 | 如果相對應位值相同,則結果為 0,否則為 1 | (A^B)得到49,即 0011 0001 | | ? | 非 | 按位取反運算符翻轉操作數的每一位,即 0 變成 1,1 變成 0 | (?A)得到-61,即1100 0011 | | << | 左移 | (左移一位乘2)按位左移運算符。左操作數按位左移右操作數指定的位數。左移 n 位表示原來的值乘 2<sup>n</sup> | A << 2得到240,即 1111 0000 | | >> | | (右移一位除2)有符號右移,按位右移運算符。左操作數按位右移右操作數指定的位數 | A >> 2得到15即 1111 | | >>> | 無符號右移 | 無符號右移,按位右移補零操作符。左操作數的值按右操作數指定的位數右移,移動得到的空位以零填充 | A>>>2得到15即0000 1111 | ## 5. 原碼、補碼、反碼是什么 ### 機器數   一個數在計算機中的二進制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號,正數為 0,負數為 1。   比如,十進制中的數 +3 ,計算機字長為 8 位,轉換成二進制就是 00000011。如果是 -3 ,就是 10000011 。那么,這里的 00000011 和 10000011 就是機器數。 ### 真值   因為第一位是符號位,所以機器數的形式值就不等于真正的數值。例如上面的有符號數 10000011,其最高位 1 代表負,其真正數值是 -3 而不是形式值 131(10000011 轉換成十進制等于 131)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。 例:0000 0001 的真值 = +000 0001 = +1,1000 0001 的真值 = –000 0001 = –1 ### 原碼   原碼就是符號位加上真值的絕對值,即用第一位表示符號,其余位表示值。比如如果是 8 位二進制:   [+1]<sub>原</sub> = 0000 0001   [-1]<sub>原</sub> = 1000 0001   第一位是符號位。因為第一位是符號位,所以 8 位二進制數的取值范圍就是:[1111 1111 , 0111 1111],即:[-127 , 127]   原碼是人腦最容易理解和計算的表示方式 ### 反碼 反碼的表示方法是: - **正數**的反碼是其本身; - **負數**的反碼是在其原碼的基礎上,**符號位不變,其余各個位取反**。 [+1] = [00000001]<sub>原</sub> = [00000001]<sub>反</sub> [-1] = [10000001]<sub>原</sub>= [11111110]<sub>反</sub> 可見如果一個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算。 ### 補碼 補碼的表示方法是: - **正數**的補碼就是其本身; - **負數**的補碼是在其原碼的基礎上,符號位不變,其余各位取反, 最后+1。(**反碼的基礎上 +1**) [+1] = [0000 0001]<sub>原</sub> = [0000 0001]<sub>反</sub> = [0000 0001]<sub>補</sub> [-1] = [1000 0001]<sub>原</sub> = [1111 1110]<sub>反</sub> = [1111 1111]<sub>補</sub> 對于負數,補碼表示方式也是人腦無法直觀看出其數值的。 通常也需要轉換成原碼在計算其數值。 參考資料: - [原碼, 反碼, 補碼 詳解 - ziqiu.zhang - 博客園](http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html) ## 6. 不用額外變量交換兩個整數的值 如果給定整數 a 和 b,用以下三行代碼即可交換 a 和b 的值 ```java a = a ^ b; b = a ^ b; a = a ^ b; ``` - 假設 a 異或 b 的結果記為 c,**c 就是 a 整數位信息和 b 整數位信息的所有不同信息**。 - 比如:a = 4 = 100,b = 3 = 011,a^b = c = 111 - a 異或 c 的結果就是 b,比如:a = 4 = 100,c = 111,a^c = 011 = 3 = b - b 異或c 的結果就是 a,比如:b = 3 = 011,c = 111,b^c = 100 = 4 = a 說明:位運算的題目基本上都帶有靠經驗積累才會做的特征,也就是準備階段需要做足夠多的題,面試時才會有良好的感覺。 ## 7. 不使用運算符進行a+b操作 - a^b; 得到不含進位之和 - (a & b)<<1; 進位 - 只要進位不為零,則迭代;否則返回 ```java #include <stdio.h> int add(int a, int b) { int c = a & b; int r = a ^ b; if(c == 0){ return r; } else{ return add(r, c << 1); } } int main(int argn, char *argv[]) { printf("sum = %d\n", add(-10000, 56789)); return 0; } ``` ## 8. &和&& 、|和||的區別 (1)&& 和 & 都是表示與,區別是 && 只要第一個條件不滿足,后面條件就不再判斷。而 & 要對所有的條件都進行判斷。 ```java // 例如: public static void main(String[] args) { if((23!=23) && (100/0==0)){ System.out.println("運算沒有問題。"); }else{ System.out.println("沒有報錯"); } } // 輸出的是“沒有報錯”。而將 && 改為 & 就會如下錯誤: // Exception in thread "main" java.lang.ArithmeticException: / by zero ``` - 原因: - &&時判斷第一個條件為 false,后面的 100/0==0 這個條件就沒有進行判斷。 - & 時要對所有的條件進行判斷,所以會對后面的條件進行判斷,所以會報錯。 (2)|| 和 | 都是表示 “或”,區別是 || 只要滿足第一個條件,后面的條件就不再判斷,而 | 要對所有的條件進行判斷。 看下面的程序: ```java public static void main(String[] args) { if((23==23)||(100/0==0)){ System.out.println("運算沒有問題。"); }else{ System.out.println("沒有報錯"); } } // 此時輸出“運算沒有問題”。若將||改為|則會報錯。 ``` - 原因 - || 判斷第一個條件為 true,后面的條件就沒有進行判斷就執行了括號中的代碼 - 而 | 要對所有的條件進行判斷,所以會報錯
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看