<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            java語言

            Java面試實例int和Integer有什么區別?

            時間:2025-05-27 01:27:15 java語言 我要投稿
            • 相關推薦

            Java面試實例int和Integer有什么區別?

              引導語:越是貌似簡單的面試題其中的玄機就越多,需要面試者有相當深厚的功力。以下是百分網小編分享給大家的Java面試實例int和Integer有什么區別?歡迎閱讀學習!

            Java面試實例int和Integer有什么區別?

              int和Integer有什么區別?

              答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入了基本數據類型,但是為了能夠將這些基本數據類型當成對象操作,Java為每一個基本數據類型都引入了對應的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

              Java 為每個原始類型提供了包裝類型:

              - 原始類型: boolean,char,byte,short,int,long,float,double

              - 包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            class AutoUnboxingTest {
             
                public static void main(String[] args) {
                    Integer a = new Integer(3);
                    Integer b = 3;                  // 將3自動裝箱成Integer類型
                    int c = 3;
                    System.out.println(a == b);     // false 兩個引用沒有引用同一對象
                    System.out.println(a == c);     // true a自動拆箱成int類型再和c比較
                }
            }

              最近還遇到一個面試題,也是和自動裝箱和拆箱有點關系的,代碼如下所示:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            public class Test03 {
             
                public static void main(String[] args) {
                    Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
             
                    System.out.println(f1 == f2);
                    System.out.println(f3 == f4);
                }
            }

              如果不明就里很容易認為兩個輸出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四個變量都是Integer對象引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什么呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOf,如果看看valueOf的源代碼就知道發生了什么。

            1
            2
            3
            4
            5
            public static Integer valueOf(int i) {
                if (i >= IntegerCache.low && i <= IntegerCache.high)
                    return IntegerCache.cache[i + (-IntegerCache.low)];
                return new Integer(i);
            }

              IntegerCache是Integer的內部類,其代碼如下所示:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            /**
                 * Cache to support the object identity semantics of autoboxing for values between
                 * -128 and 127 (inclusive) as required by JLS.
                 *
                 * The cache is initialized on first usage.  The size of the cache
                 * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
                 * During VM initialization, java.lang.Integer.IntegerCache.high property
                 * may be set and saved in the private system properties in the
                 * sun.misc.VM class.
                 */
             
                private static class IntegerCache {
                    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;
                    }
             
                    private IntegerCache() {}
                }

              簡單的說,如果整型字面量的值在-128到127之間,那么不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1==f2的結果是true,而f3==f4的結果是false。

            【Java面試實例int和Integer有什么區別?】相關文章:

            Java和Python有什么區別02-21

            java SE和EE有什么區別08-01

            java和C++有什么區別03-18

            JAVA中throws和throw有什么區別04-28

            java知識:JDK和JRE有什么區別08-08

            Java中的== 和equals()方法詳解與實例教程08-03

            Java 中靜態變量和實例變量區別03-05

            Java鍵盤輸入實例07-06

            Java for循環語句使用實例01-13

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看