Integer

IntegerCache

Autoboxing的实现:

Integer中有一个static方法valueOf),当使用Integer a = 1的时候会进行调用。所有常用的数字[-128,127]中的new Integer()会被放入final Integer cache[]的一个数组中,使用时查表,所以相同的数字会指向同一个地址。而其他数字的会创建不同地址的new Integer()

List<Integer> res = new ArrayList<>();
for (int i = 0; i < 1; i++) {
    res.add(i);
}
for (int i = 0; i < 1; i++) {
    res.add(i);
}
System.out.println(res.get(0) == res.get(1)); // true
res.clear();

for (int i = 1000; i < 1001; i++) {
    res.add(i);
}
for (int i = 1000; i < 1001; i++) {
    res.add(i);
}
System.out.println(res.get(0) == res.get(1)); // false

注意区分, 通常不使用new Integer(1)是因为它没有调用valueOf,没有IntegerCache缓存,影响效率。下面几种方法中,cdf指向同一个地址,eg则是两个不同的对象。

Integer c = Integer.parseInt("1"); // call Integer.valueOf() at last
Integer d = Integer.valueOf("1"); // use parseInt internal
Integer f = 1;
Integer e = new Integer("1"); // call parseInt(), deprecated constructor
Integer g = new Integer(1);

Unboxing 和 autoboxing

Integer a = 1;
int[] arr = new int[1];
arr[0] = a; // use Integer.intValue() unboxing

int b = 1;
Integer[] nums = new Integer[1];
nums[0] = b; // use Integer.valueOf() autoboxing

sout(a == b); // "==, <, >, +, -, *" use unboxing.. output true

其他一些方法

leetocde升级版

public static int parseInt​(String s, int radix) throws NumberFormatException
public static String toString​(int i)

还有不知道是啥区别的...coder, latin1和utf16,剩下的一些bit manipulation随缘8,看不懂哇

results matching ""

    No results matching ""