在打算了解Java的時候,根據C#的經驗,了解一下Java中有哪一些值類型,如何判斷某個類型為值類型還是引用類型是一件值得做的事情.
在C#中,值類型存放在棧中,不需要垃圾回收,引用類型存放在堆中,需要垃圾回收.將一個值類型轉換為引用類型,會引起裝箱(創建一個需要垃圾回收的引用類型),在真正使用時,需要拆箱,在裝箱拆箱時會產生需要垃圾回收的對象,
如果裝箱拆箱太多,對我們程序的性能有較大影響,所以了解哪些是值類型,哪些是引用類型,以方便在開發中注意區分是很有必要的.
看書是一種方式,自己探索也是一種方式.
Java中有哪些值類型呢?在中文版的<Java編程思想>第4版23頁中,列出了Java的基本類型:boolean,char, byte, short,int, long, float,double,void.同時也列出了他們的包裝期.(首字母大寫)<
(java中似乎與C#不同,Java的基本類型應該是都放在棧中的,<Java編程思想>中文第四版25頁:Java對象不具備和基本類型一樣的生命周期)
根據C#的經驗,我希望能找到一個類似與C#中is,as的方式判斷是否值類型就比較好.
C#中,可以如下判斷:
Type t = typeof(T);
t.IsSubclassOf(typeof(ValueType))
在java中有沒有類似的方法呢?
我自己寫了一個:
/** * 是否數據 * @param t * @return */ public static boolean IsNumer(Class<?> t) { if (t == null) { return false; } if (t == Object.class) { return false; } if (t == void.class) { return false; } Class<?> superClass = t.getSuperclass(); if (superClass == null) { return true; } return superClass == Number.class; }
驗證的結果如下:
@Test public void Test_HiTypeHelper_Number() { Assert.assertTrue(HiTypeHelper.IsNumer(int.class)); Assert.assertTrue(HiTypeHelper.IsNumer(BigDecimal.class)); Assert.assertTrue(HiTypeHelper.IsNumer(float.class)); Assert.assertTrue(HiTypeHelper.IsNumer(double.class)); Assert.assertTrue(HiTypeHelper.IsNumer(long.class)); Assert.assertTrue(HiTypeHelper.IsNumer(short.class)); Assert.assertTrue(HiTypeHelper.IsNumer(boolean.class)); Assert.assertTrue(HiTypeHelper.IsNumer(char.class)); Assert.assertTrue(HiTypeHelper.IsNumer(Float.class)); Assert.assertTrue(HiTypeHelper.IsNumer(Double.class)); Assert.assertTrue(HiTypeHelper.IsNumer(Long.class)); Assert.assertTrue(HiTypeHelper.IsNumer(Short.class)); Assert.assertTrue(HiTypeHelper.IsNumer(byte.class)); Assert.assertTrue(HiTypeHelper.IsNumer(Byte.class)); Assert.assertFalse(HiTypeHelper.IsNumer(Boolean.class)); Assert.assertFalse(HiTypeHelper.IsNumer(void.class)); Assert.assertFalse(HiTypeHelper.IsNumer(Void.class)); Assert.assertFalse(HiTypeHelper.IsNumer(EnumTest.class)); Assert.assertFalse(HiTypeHelper.IsNumer(Object.class)); }