小言_互联网的博客

JDK源码(10)-Integer(用处最多,重点讲解)

390人阅读  评论(0)

一、概述

Integer是对基本数据类型int的一个包装,类定义如下:

public final class Integer extends Number implements Comparable<Integer> 

通过属性MAX_VALUEMIN_VALUE定义了范围是:-2^31到2^31 -1.。

二、主要方法

1.toString(int i, int radix)

第二个参数的进制,默认是10进制,进制的范围是2-36进制之间,如果传入的参数超出范围,就设置为10进制。

2.toUnsignedString(int i, int radix)

无符号的字符串,调用了Long的toUnsignedString方法来实现。

3.toHexString、toOctalString、toBinaryString

无符号的2/8/16进制数,如果参数为负,则无符号整数值为参数加2^32。都是调用Integer的私有方法toUnsignedString0和方法formatUnsignedInt来实现的,方法如下:


  
  1. private static String toUnsignedString0(int val, int shift) {
  2. // assert shift > 0 && shift <=5 : "Illegal shift value";
  3. int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
  4. int chars = Math.max(((mag + (shift - 1)) / shift), 1);
  5. char[] buf = new char[chars];
  6. formatUnsignedInt(val, shift, buf, 0, chars);
  7. // Use special constructor which takes over "buf".
  8. return new String(buf, true);
  9. }

4.parseInt(String s, int radix)、parseInt(String s)

将一个字符串转换为int类型,传入正数负数都可以进行转换,radix不传默认是10进制。

5.hashCode:就是本身

6.public static Integer decode(String nm)

String解码为Integer 。 接受以下语法给出的十进制,十六进制和八进制数:

  • DecimalNumeral
  • 0x HexDigits
  • 0X HexDigits
  • # HexDigits
  • 0 OctalDigits
  • -
  • +

  
  1. public static Integer decode(String nm) throws NumberFormatException {
  2. int radix = 10;
  3. int index = 0;
  4. boolean negative = false;
  5. Integer result;
  6. if (nm.length() == 0)
  7. throw new NumberFormatException( "Zero length string");
  8. char firstChar = nm.charAt( 0);
  9. // Handle sign, if present
  10. if (firstChar == '-') {
  11. negative = true;
  12. index++;
  13. } else if (firstChar == '+')
  14. index++;
  15. // Handle radix specifier, if present
  16. if (nm.startsWith( "0x", index) || nm.startsWith( "0X", index)) {
  17. index += 2;
  18. radix = 16;
  19. }
  20. else if (nm.startsWith( "#", index)) {
  21. index ++;
  22. radix = 16;
  23. }
  24. else if (nm.startsWith( "0", index) && nm.length() > 1 + index) {
  25. index ++;
  26. radix = 8;
  27. }
  28. if (nm.startsWith( "-", index) || nm.startsWith( "+", index))
  29. throw new NumberFormatException( "Sign character in wrong position");
  30. try {
  31. result = Integer.valueOf(nm.substring(index), radix);
  32. result = negative ? Integer.valueOf(-result.intValue()) : result;
  33. } catch (NumberFormatException e) {
  34. // If number is Integer.MIN_VALUE, we'll end up here. The next line
  35. // handles this case, and causes any genuine format error to be
  36. // rethrown.
  37. String constant = negative ? ( "-" + nm.substring(index))
  38. : nm.substring(index);
  39. result = Integer.valueOf(constant, radix);
  40. }
  41. return result;
  42. }

7.divideUnsigned、remainderUnsigned

无符号商、无符号余数

8.highestOneBit、lowestOneBit

这个函数调用。使用的第一感觉就是这个函数是干什么用的,通过查看文档得知,这个函数的作用是取 i 这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。

用人话说:返回最高位为1, 其它位为0的数

  • 如果一个数是0, 则返回0;
  • 如果是负数, 则返回 -2147483648:【1000,0000,0000,0000,0000,0000,0000,0000】(二進制表示的數);
  • 如果是正数, 返回的则是跟它最靠近的比它小的2的N次方

比如 17:

二进制是【0000,0000,0000,0000,0000,0000,0001,0001】

highestOneBit(17)返回的是最高位的1个1, 其它全是0 的二进制數:【0000,0000,0000,0000,0000,0000,0001,0000】,其实就是16。

三、特殊之处

1.静态私有类private static class IntegerCache

-128到127之间的会被缓存,高值可以通过JVM参数java.lang.Integer.IntegerCache.high进行设置。


转载:https://blog.csdn.net/m0_37609579/article/details/103558588
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场