本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(2)

JDK源码之Integer类——stringSize()方法

发布于2021-05-29 22:37     阅读(992)     评论(0)     点赞(17)     收藏(5)


注意,我所使用的JDK版本是1.8,但我发现1.9版本的这个stringSize()方法和1.8版本的stringSize()方法的源码不一样。

1.8版本的stringSize()方法源码及中文注释如下:

  1. final static int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999,
  2. 99999999, 999999999, Integer.MAX_VALUE};
  3. /**
  4. * 统计传入整数的数字位数,比如123是3位数字,4568是4位数字
  5. *
  6. * @param x 正整数,但事实在该方法内并没有判断该数是否是一个正整数
  7. * @return 返回x的位数
  8. */
  9. static int stringSize(int x) {
  10. // i是临时变量,用来统计一个数的位数
  11. for (int i = 0; ; i++)
  12. // 判断传入的参数x是否小于等于sizeTable[i],则返回x的位数
  13. if (x <= sizeTable[i])
  14. return i + 1;// 因为索引是从0开始的,所以要加1
  15. }

该方法的功能是统计传入整数的数字位数,比如123是3位数字,4568是4位数字

但需要注意的是,该方法没有用public修饰,所以无法调用,如果要尝试该功能的话,看如下代码:

  1. public class Test {
  2. final static int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999,
  3. 99999999, 999999999, Integer.MAX_VALUE};
  4. /**
  5. * 统计传入整数的数字位数,比如123是3位数字,4568是4位数字
  6. *
  7. * @param x 正整数,但事实在该方法内并没有判断该数是否是一个正整数
  8. * @return 返回x的位数
  9. */
  10. static int stringSize(int x) {
  11. // i是临时变量,用来统计一个数的位数
  12. for (int i = 0; ; i++)
  13. // 判断传入的参数x是否小于等于sizeTable[i],则返回x的位数
  14. if (x <= sizeTable[i])
  15. return i + 1;// 因为索引是从0开始的,所以要加1
  16. }
  17. public static void main(String[] args) {
  18. // 输出数字123的位数
  19. System.out.println(stringSize(123));// 3
  20. // 输出数字123456的位数
  21. System.out.println(stringSize(123456));// 6
  22. // 但注意,传入的参数如果是负数,那么无论是几位都会返回1
  23. System.out.println(stringSize(-123));// 1
  24. System.out.println(stringSize(-654321));// 1
  25. }
  26. }

我们从上面代码中知道如果传入的参数是负数的话则无效,那么在源码中是如何使用的呢?

在源码中有两处用到:

第一处:如果是正数则直接传入,如果是负数则转换成正数传入。

第二处:如果是正数则直接传入,如果是负数则转换成正数传入。

所以该方法一定会生效,因为传入的参数一定是正数,不需要进行校验。

1.9版本的stringSize()方法的源码发生了变化,如下:

  1. // Left here for compatibility reasons, see JDK-8143900.
  2. static final int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
  3. 99999999, 999999999, Integer.MAX_VALUE };
  4. /**
  5. * Returns the string representation size for a given int value.
  6. *
  7. * @param x int value
  8. * @return string size
  9. *
  10. * @implNote There are other ways to compute this: e.g. binary search,
  11. * but values are biased heavily towards zero, and therefore linear search
  12. * wins. The iteration results are also routinely inlined in the generated
  13. * code after loop unrolling.
  14. */
  15. static int stringSize(int x) {
  16. int d = 1;
  17. if (x >= 0) {
  18. d = 0;
  19. x = -x;
  20. }
  21. int p = -10;
  22. for (int i = 1; i < 10; i++) {
  23. if (x > p)
  24. return i + d;
  25. p = 10 * p;
  26. }
  27. return 10 + d;
  28. }

中文注释下:

  1. public class Test {
  2. // 出于兼容性原因,请留在此处,请参阅JDK-8143900。
  3. // 下面这个数组其实没有被用到过,但JDK1.9却留下了,因为JDK1.8及之前的版本会用到这个数组
  4. static final int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999,
  5. 99999999, 999999999, Integer.MAX_VALUE};
  6. /**
  7. * 返回给定int值的字符串表示大小,即一个数字的位数,如数字123的位数是3位,数字4567的位数是4位
  8. *
  9. * @param x 给定的整数
  10. * @return 返回字符串大小,即位数
  11. */
  12. static int stringSize(int x) {
  13. // 局部变量,计数器
  14. int d = 1;// 如果是负数则d=1,如果是正数则d=0,为什么呢?因为负数会把符号位计算在内,如-123执行的结果是4
  15. // 判断给定的整数x是否是一个正数
  16. if (x >= 0) {
  17. // 并且将d重置为0
  18. d = 0;
  19. // 如果x是一个正数,则转换成一个负数
  20. x = -x;
  21. }
  22. // 局部变量,用于循环
  23. int p = -10;
  24. for (int i = 1; i < 10; i++) {// 为什么是i<10,因为int数据类型的范围最大为2147483647,即10位数字
  25. if (x > p)// 用于确定数字的位数
  26. return i + d;
  27. p = 10 * p;// 循环
  28. }
  29. return 10 + d;
  30. }
  31. public static void main(String[] args) {
  32. // 输出数字123的位数
  33. System.out.println(stringSize(2147483647));// 10
  34. // 输出数字123456的位数
  35. System.out.println(stringSize(123456));// 6
  36. // 但注意,传入的参数如果是负数,那么也会返回负数的位数,但是会包括符号位在内,例如-123返回4
  37. System.out.println(stringSize(-123));// 4
  38. System.out.println(stringSize(-654321));// 7
  39. }
  40. }

看了上面的代码,我们可以引申出一个问题:如何求一个整数的位数?



所属网站分类: 技术文章 > 博客

作者:coding

链接:http://www.javaheidong.com/blog/article/207747/813495c913fb5fb01f18/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)