?
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wangyangzhizhou/article/details/77196626
概況
Java的Integer類主要的作用就是對基本類型int進行封裝,提供了一些處理int類型的方法,比如int到String類型的轉換方法或String類型到int類型的轉換方法,當然也包含與其他類型之間的轉換方法。除此之外還有一些位相關的操作。
繼承結構
--java.lang.Object--java.lang.Number--java.lang.Integer
- 1
- 2
- 3
主要屬性
第一部分
public static final int MIN_VALUE = 0x80000000; public static final int MAX_VALUE = 0x7fffffff; public static final int SIZE = 32; public static final int BYTES = SIZE / Byte.SIZE; public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
- 1
- 2
- 3
- 4
- 5
MIN_VALUE
靜態變量表示int能取的最小值,為-2的31次方,被final修飾說明不可變。- 類似的還有
MAX_VALUE
,表示int最大值為2的31次方減1。 SIZE
用來表示二進制補碼形式的int值的比特數,值為32,靜態變量且不可變。BYTES
用來表示二進制補碼形式的int值的字節數,值為SIZE
除于Byte.SIZE
,結果為4。TYPE
的toString的值是int
。?
Class的getPrimitiveClass
是一個native方法,在Class.c
中有個Java_java_lang_Class_getPrimitiveClass
方法與之對應,所以JVM層面會通過JVM_FindPrimitiveClass
函數根據”int”字符串獲得jclass,最終到Java層則為Class<Integer>
。
JNIEXPORT jclass JNICALL
Java_java_lang_Class_getPrimitiveClass(JNIEnv *env,jclass cls,jstring name)
{const char *utfName;jclass result;if (name == NULL) {JNU_ThrowNullPointerException(env, 0);return NULL;}utfName = (*env)->GetStringUTFChars(env, name, 0); if (utfName == 0) return NULL; result = JVM_FindPrimitiveClass(env, utfName); (*env)->ReleaseStringUTFChars(env, name, utfName); return result; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
當TYPE
執行toString時,邏輯如下,則其實是getName
函數決定其值,getName
通過native方法getName0
從JVM層獲取名稱,
public String toString() {return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); }
- 1
- 2
- 3
- 4
getName0
根據一個數組獲得對應的名稱,JVM根據Java層的Class可得到對應類型的數組下標,比如這里下標為10,則名稱為”int”。
const char* type2name_tab[T_CONFLICT+1] = {NULL, NULL, NULL, NULL, "boolean", "char", "float", "double", "byte", "short", "int", "long", "object", "array", "void", "*address*", "*narrowoop*", "*conflict*" };
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
第二部分
final static char [] DigitTens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9', } ; final static char [] DigitOnes = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', } ; final static char[] digits = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' ,