Integer.toString(int i)方法 - Java 8-程序员宅基地

技术标签: # Java  Integer  Java  toString  String  源码  

今天看到一道笔试题:String类中,使用哪个方法可以将int值100转换成字符串?写出具体方法:
挺简单的,学过Java基础应该都知道,String.valueOf(100)就能完成。今天就想着看看里面是啥。

参考(建议直接看链接3):

  1. Integer源码分析 - zxcvbnmzsedr - 简书
  2. java源码中Integer.class中有个getChars方法,里面有个52429是怎么确定的? - 知乎
  3. Java 源码学习系列(三)——Integer 写的真心不错,网站已收藏。

写了个代码测试一下:

public class Test {
    
    public static void main(String[] args) {
    
        System.out.println(String.valueOf(100));
    }
}

进入String.valueOf(int i)方法:

    public static String valueOf(int i) {
    
        return Integer.toString(i);
    }

String有点懒,啥都不干,直接调用Integer.toString(int i)方法。所以重点是Integer.toString(int i)方法,跟String.valueOf(int i)方法半毛钱关系没有。

进入Integer.toString(int i)方法:

    public static String toString(int i) {
    
        // 如果i是-2147483648,stringSize(-i)取反的时候会溢出,正数最大为2147483647,所以单独判断
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        // 获取i的长度。如果i是负数,负号也算一位,所以要加1
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        // 创建相应长度的字符数组,存储i
        char[] buf = new char[size];
        // 将i转换为字符数组,存储在buf中
        getChars(i, size, buf);
        // 调用String类的package构造方法,转为字符串,Integer和String都是java.lang包下的类
        return new String(buf, true);
    }

里面有:stringSize(int x),getChars(int i, int index, char[] buf)和String(char[] value, boolean share)三个方法。

Integer类的stringSize(int x)方法如下:

    final static int [] sizeTable = {
     9, 99, 999, 9999, 99999, 999999, 9999999,
                                      99999999, 999999999, Integer.MAX_VALUE };
                                      
    // package静态方法
    // JDK规定x必须是非负数,取值范围是[0, 2147483647]
    static int stringSize(int x) {
    
        // 获取x的长度
        for (int i=0; ; i++)
            if (x <= sizeTable[i])
                return i+1;
    }

上面的方法没什么好说的,下面看看getChars方法(源码中上面这段代码和下面这段代码是邻居):

    // 将i转成字符数组存储在buf中
    static void getChars(int i, int index, char[] buf) {
    
        int q, r;
        int charPos = index;
        char sign = 0;// 符号

        // 如果是负数,保存负号,并取反
        if (i < 0) {
    
            sign = '-';
            i = -i;
        }

        // 每次迭代生成两位数,减少循环的次数
        while (i >= 65536) {
    
            q = i / 100;// 商
            // 等价于:r = i - (q * 100);
            // 100 = 2^6 + 2^5 + 2^2
            r = i - ((q << 6) + (q << 5) + (q << 2));
            i = q;// 更新i
            buf [--charPos] = DigitOnes[r];// 将个位赋值给数组
            buf [--charPos] = DigitTens[r];// 将十位赋值给数组
        }

        // 下降到快速模式为较小的数字,每次迭代生成一位数
        for (;;) {
    
            // 参考上面的while循环可知,这里应该是q = i / 10,具体分析见http://www.hollischuang.com/archives/1058
            q = (i * 52429) >>> (16+3);
            // 等价于:r = i-(q*10)
            // 10 = 2^3 + 2^1
            r = i - ((q << 3) + (q << 1));
            // 通过映射表(digits数组),将i对应的字符赋给buf数组
            buf [--charPos] = digits [r];
            i = q;// 更新i
            if (i == 0) break;
        }
        if (sign != 0) {
    
            buf [--charPos] = sign;// 负号
        }
    }

分析我不想写了。

关键点:
移位操作比乘法操作快
乘法操作比除法操作快

精确度,溢出等因素

String构造方法

    // String类的package构造方法,直接赋值比使用public的String构造方法(复制数组)快。
    String(char[] value, boolean share) {
    
        // assert share : "unshared not supported";
        this.value = value;
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pfdvnah/article/details/106161048

智能推荐

python加载dll中的c++类_python 调用 c++dll, 包含类以及opencv Mat-程序员宅基地

文章浏览阅读1.3k次。前言由于这个尝试花了一些时间,所以记录下来。由于我是尝试的很多理论地方不大懂,我把我尝试成功的部门记录下来,希望对大家有所帮助。我的环境是windows10 + vs2015创建 vs dll projectpython所有不同的调用方式都需要先建一个dll project。新建一个c++工程,选择DLL、导出符号和空项目(如下图);IMG20180612_131008.pngc++ 默认的解决平..._python dll class

成贤学院计算机组成原理,东南大学成贤学院计算机硬件课程设计报告.doc-程序员宅基地

文章浏览阅读168次。东南大学成贤学院计算机硬件课程设计报告计算机硬件课程设计设计报告学号 姓名:王宇学号 姓名:杜冰2015年10月29日一、课题名称:微程序控制模型计算机的设计二、实验目的:1.运用“计算机组成原理”和“数字电路”等课程的知识,通过对模型机的设计和调试,加深对计算机各部件工作原理的认识。2.进一步掌握运用EDA 技术进行设计和调试的工作方法。三、实验任务:1. 设计一台由微程序控制的模型计算机。2...._1.根据给定的数据格式和指令系统,设计一台微程序控制的模型计算机。2.根据设

一加3t刷机后还卡_一加3T通用刷机教程-程序员宅基地

文章浏览阅读643次。写在开头,本教程为通用教程,适合各种官改包及第三方移植包。不可否认,很多机友已经进阶刷机达人,可还是有部分小白机友,至今搞不懂到底要怎么刷机。下面,用图文的方式为大家解析一下具体的刷机教程,希望对大家有所帮助(第一次做这种教程贴,设备也有限,不足及错误之处请大家见谅并指正)。刷机前准备1.一加3T工具箱http://pan.baidu.com/s/1kVHOPF52.刷机包请自行在社区寻找,这里不..._一加3刷机工具箱v3.0

企业计算机机房存在环境安全隐患,企业计算机机房管理及维护存在问题及对策.doc...-程序员宅基地

文章浏览阅读355次。企业计算机机房管理及维护存在问题及对策企业计算机机房管理及维护存在问题及对策   摘要:随着信息时代的到来,企业对计算机的使用日益频繁,因此很多企业都采用计算机技术进行企业管理,企业建设起计算机机房。计算机机房在管理和维护上存在着很多问题,如何在日常管理中针对这些问题提出相对应的策略已经成为企业机房计算机管理的核心。本文针对企业计算机机房维护存在的问题进行分析,并提出了相应的解决策略以供参考关键词..._机房的计算机的软件环境存在哪些安全隐患

layui单选框verify_layui lay-verify form表单自定义验证规则详解-程序员宅基地

文章浏览阅读1.7k次。虽然layui的官方文档已经是写的比较详细,但是初次使用的时候总会懵一下,这里纪录一下lay-verify自定义验证规则的时候到底放哪。html:提交js:form.verify({//数组的两个值分别代表:[正则匹配、匹配不符时的提示文字],digital: [/^[0-4]*$/,'请填入0-4的分数']});这样写没问题,但是form.verify放置的位置没讲清楚,还是要自己试一下。lay..._form.verify

LSNUOJ 1554 英文金曲大赛_测试数据包括多个实例。 每组数据包括选手的名字,名字的长度不超过30个字符。紧接-程序员宅基地

文章浏览阅读60次。1554 Problem A问题 A: 英文金曲大赛时间限制: 1 Sec 内存限制: 64 MB提交: 120 解决: 70[提交][状态][讨论版]题目描述我们在“渊子数”的题目中已经了解了渊子是个什么样的人了,他在大一的时候参加过外国语学院的“英语聚乐部”。告诉你个秘密,这个俱乐部是个好地方,不但活动精彩而且有MM。 这不,英语俱乐部举办了一个叫做“英文金曲大赛”的节目。这..._测试数据包括多个实例。 每组数据包括选手的名字,名字的长度不超过30个字符。紧接

随便推点

2021-10-12编程从键盘输入若干学生成绩,输入负数时表示输入结束,输出平均成绩和低于平均成绩的成绩。_编程从键盘输入若干个学生的成绩,输入负数时表示输入结束,输出平均成绩和低于平均-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏27次。#include<stdio.h>int main(){ int i=0,n,score=0,sum=0,ave=0,a[100]; printf("请输入学生人数\n"); scanf("%d",&n); while(1) { printf("请输入%d学生成绩\n",i+1); scanf("%d",&a[i]); if(a[i]<0) break; i++; } for(i=0;i<n;i++) { ._编程从键盘输入若干个学生的成绩,输入负数时表示输入结束,输出平均成绩和低于平均

sqlitepython导入数据_python从sqlite读取并显示数据的方法-程序员宅基地

文章浏览阅读137次。这篇文章主要介绍了python从sqlite读取并显示数据的方法,涉及Python操作SQLite数据库的读取及显示相关技巧,需要的朋友可以参考下importcgi,os,sysimportsqlite3asdbconn=db.connect('test.db')cursor=conn.cursor()conn.row_factory=db.Rowcursor.execut..._python sqlite 读取

linux 6.5光驱是什么意思,centos 6.5 把光盘设置为本地yum源-程序员宅基地

文章浏览阅读84次。为了搞学习内核编译,需要安装一些开发工具包,索性把光盘镜像设置成本地yum源,这样更快些!以下是一些基本步骤:1、首先挂载光盘到/mnt/cd下,mount /dev/cdrom /mnt/cd,这个就不多说了;2、 进入/etc/yum.repos.d/目录下,把原来的yum源备份,我给它重新命名了。mv CentOS-Vault.repo CentOS-Vault.repo.bakmv C..._linux6.5搭载本地光盘yun源

消息推送配置url(服务器地址),设置推送url接口-程序员宅基地

文章浏览阅读2.4k次。## 设置推送url接口请求地址:`https://open-api.10ss.net/oauth/setpushurl`请求方式:POST### 所需参数|名 称|类 型|描 述||----|----|----||client_id|string|开发者的应用ID,在[开放平台](https://dev.10ss.net)创建应用时获得||access_token|string|授权的token..._怎么向某个地址推送信息

quickpcb添加pcb库_南京阿勒勾电子 quickpcb2005详细步骤教程-程序员宅基地

文章浏览阅读655次。南京阿勒勾电子quickpcb2005详细步骤教程(2013-10-20 12:22:27)标签:quickpcb2005详细教程阿勒勾电子it南京阿勒勾电子 quickpcb2005详细步骤教程 有什么不懂,可以直接留言抄板比设计难度低得多,抄板,其实就是依葫芦画瓢。抄板步骤的简单说明:1.扫描电路板图片2.运行Quickpcb2005程序3.在文件菜单中调入扫描的电路板图片4.这个软件提供了..._pcb抄板软件quickpcb2005 教程支持win7+增封装库

vsftpd服务器userlist_enable和userlist_deny配置项的应用-程序员宅基地

文章浏览阅读1.5w次。https://blog.csdn.net/chengqiuming/article/details/70139671访问分为,A虚拟用户B系统用户C匿名用户(https://blog.csdn.net/Michaelwubo/article/details/82528830) B:如下是系统用户local_enable=YESwrite_enable=YES(wri..._userlist_enable

推荐文章

热门文章

相关标签