1. 程式人生 > >java之資料包裝類和封裝類於開發中的注意事項

java之資料包裝類和封裝類於開發中的注意事項

  最近在開發中的時候,在使用資料比較的時候。總是出現預想之外的結果。排查的時候,很容易忽略 。經過一番深究,總算有點體會了!!

我們都知道在java中資料有8種基本資料型別及其包裝類 

1、基本型別:byte 二進位制位數:8
2、包裝類:java.lang.Byte
3、最小值:Byte.MIN_VALUE=-128
4、最大值:Byte.MAX_VALUE=127
5、
6、基本型別:short 二進位制位數:16
7、包裝類:java.lang.Short
8、最小值:Short.MIN_VALUE=-32768
9、最大值:Short.MAX_VALUE=32767
10、
11、基本型別:int 二進位制位數:32
12、包裝類:java.lang.Integer
13、最小值:Integer.MIN_VALUE=-2147483648
14、最大值:Integer.MAX_VALUE=2147483647
15、
16、基本型別:long 二進位制位數:64
17、包裝類:java.lang.Long
18、最小值:Long.MIN_VALUE=-9223372036854775808
19、最大值:Long.MAX_VALUE=9223372036854775807
20、
21、基本型別:float 二進位制位數:32
22、包裝類:java.lang.Float
23、最小值:Float.MIN_VALUE=1.4E-45
24、最大值:Float.MAX_VALUE=3.4028235E38
25、
26、基本型別:double 二進位制位數:64
27、包裝類:java.lang.Double
28、最小值:Double.MIN_VALUE=4.9E-324
29、最大值:Double.MAX_VALUE=1.7976931348623157E308
30、
31、基本型別:char 二進位制位數:16
32、包裝類:java.lang.Character
33、最小值:Character.MIN_VALUE=0
34、最大值:Character.MAX_VALUE=65535

這裡以int和Integer來做說明。 2者之間最顯著的區別在於Integer可以為null,而int不能。所以在開發中,多使用包裝類作為方法的引數。

這時,如果用 == 比較2個Integer的值。就很容易出現問題了~~~~~~~~~~~~~

 Integer a = 5; Integer b = 5;

a == b  ---------> True

這裡這2個包裝類在使用的使用,因為2個值指向同一個物件。所以比較時是true,而輸出時會自動拆箱,所以System.out.print(a)會 是 5 而不是一個地址(物件)

但是:

 Integer a = 500; Integer b = 500;

a == b  ---------> false

System.out.print(a)會 是一個地址(而不是500)

因為這時沒有拆箱的操作。 在進行裝箱的時候。通過原始碼可知 int型別的裝箱拆箱的範圍必須在[-128,127];

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }
而其中IntegerCache類的實現為:
private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

從這2段程式碼可以看出,在通過valueOf方法建立Integer物件的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的物件的引用;否則建立一個新的Integer物件。

所以,在進行包裝類比較的時候,如果拿不準數值的範圍,最好手動拆箱成基本型別

 Integer a = 500; Integer b = 500;

a.intValue() == b.intValue()  ---------> True

System.out.print(a)會 是一個地址(而不是500)


相關推薦

java資料包裝封裝開發注意事項

  最近在開發中的時候,在使用資料比較的時候。總是出現預想之外的結果。排查的時候,很容易忽略 。經過一番深究,總算有點體會了!! 我們都知道在java中資料有8種基本資料型別及其包裝類  1、基本型別:byte 二進位制位數:8 2、包裝類:java.lang.Byte 3

Javabyte、charString型相互轉換

rac static rgs div body valueof () print byte[] 1 package basictype; 2 3 /** 4 * byte、char和String類型相互轉換 5 */ 6 public class C

抽象封裝

抽象類(abstract class) 基本概念 包含抽象方法的類叫做抽象類。 抽象方法被abstract修飾,類也要由abstract修飾。 抽象類中可以有抽象方法,也可以有非抽象方法。 抽象類不能建立例項物件 不能new抽象類。 抽象類中可以沒有抽象方法

Java學習筆記——ManthString

  (1) Math:常用的數學運算,都是靜態方法 方法摘要  static double abs(double a)           返回 double 值的絕對值。

從一個例子看Java資料初始化載入

一、程式碼鎮帖 package javase.jvm; public class ClassInitTest { private static final String staticCodeBlock = " static code block ";

[C#原始碼]網路資料流讀寫封裝,支援多執行緒下同時讀寫,自動資源管理,字串分隔符\r\n

using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using Syst

Java io學習java.nio.file的PathFiles

1.Path 類 將一個路徑封裝成物件,該路徑可以是相對路徑也可以是絕對路徑。 //定義一個Path物件 Path path= Paths.get("E:\\ja

1.String物件常量池 2.基本資料型別封裝(128以下等不做快取)

序言: 基礎知識: 1.java的基本型別:    字元型別char,布林型別boolean以及數值型別byte、short、int、long、float、double 2.引用型別    Java有 5種引用型別(物件型別):類 介面 陣列 列舉 標註    引用型

Java 載入匿名相互依賴問題

Qestion /** * ClassInitializedOrder for : Java Classload Order Test * * @author <a href="mailto:[email protected]">Isaac.Zhang | 若

JAVA API(一)StringStringBuffer

art com 依次 區別 del 索引 第一個字符 cde 基本 1.String類和StringBuffer類 在程序中經常會用到字符串,所謂的字符串就是指一連串的字符,它是由多個單個字符連接而成的。字符串中可以包含任意字符,這些字符必須包含在一對雙引號""之內,如"a

封裝的概念

border 沒有 程序 val 根據 工作 .cn mar ... 類和封裝的概念 什麽是類? 電腦一般而言是由CPU,內存,主板,鍵盤和硬盤等部件組合而成。 思考:學習電腦組裝需要多少時間?學習電腦組裝是都需要學習顯示器,鍵盤,鼠標,主板等

java抽象普通的區別

java 類實例化 有一種 之前 代碼 普通 bsp 都在 class 1.抽象類不能被實例化。 2.抽象類可以有構造函數,被繼承時子類必須繼承父類一個構造方法,抽象方法不能被聲明為靜態。 3.抽象方法只需申明,而無需實現,抽象類中可以允許普通方法有主體 4.含有抽象方法的

Java實驗項目三——面向對象定義職工日期

gety main 賦值 方法 sys return args 員工 display Program:按照如下要求設計類: (1)設計一個日期類,用於記錄年、月、日,並提供對日期處理的常用方法。 (2)設計一個職工類,該職工類至少具有下面的屬性:職工號,姓名,性別,生日,工

Java的 FileWriter FileReader

執行 使用 tac trace != dwr 輸出 txt 覆蓋 一.FileReader類1,構造方法:FileReader fr = new FileReader(String fileName);//使用帶有指定文件的String參數的構造方法。創建該輸入流對象。並關

python編程設計模式接口抽象

支持 不能 進行 eth bstr 單繼承 += 就會 imp   接口類 """ 接口類 是一種編程設計模式,在python原本沒有接口類 借用Java思想創建的一種規範設計模式 支持多繼承,進行多方面規範 """   例子: fr

Java什麽是實體實體的作用

Java實體類實體類是在JAVA軟件開發中廣泛使用的概念。 但是網上少有講清楚到底是什麽的。本期我來講一講什麽是實體類。 首先,直觀的看:實體類就是一個擁有Set和Get方法的類。實體類通常總是和數據庫之類的(所謂持久層數據)聯系在一起。這種聯系是借由框架(如Hibernate)來建立的。其次說定義(比較生澀

社會網絡分析”組成部分”、小圈子

直接 cli 引入 網絡 網絡圖 其他 社交網絡 個人 直觀 組成部分(Components) “組成部分“這個翻譯有點不太直觀,如果哪位朋友有更好的翻譯方式,請告知我。組成部分是一個在網絡圖中的子圖,該子圖與外界沒有聯系。比如生活在某個太平洋小島上的居民們,他們與外界可能

基本包裝System

自動裝箱和拆箱 遇到 static oid 自動拆箱 system 調用 字符 rgs 基本包裝類 程序界面上用戶輸入的數據都是以字符串類型進行存儲的,要把字符串轉成基本數據類型操作 基本包裝類就是對8種基本數據類型進行包裝:Integer Character 其他的都是首

Java多線程CallableFuture詳解

完成後 使用 str this In ret 類型 all 線程池 public interface Callable<V> 返回結果並且可能拋出異常的任務。實現者定義了一個不帶任何參數的叫做 call 的方法 public inter

java abstract 關鍵字 抽象方法抽象的使用詳解

java abstract 關鍵字 抽象類 抽象方法 的使用詳解 1.關鍵字 2.抽象類 3.抽象方法 4.abstract不能用來修飾屬性、構造器、private、final、static 1.關鍵字