iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java中int转string与string转int的效率有什么不同
  • 568
分享到

java中int转string与string转int的效率有什么不同

2023-06-29 11:06:05 568人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关java中int转string与string转int的效率有什么不同,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。int转string与string转int的效率对比strin

这篇文章将为大家详细讲解有关java中int转string与string转int的效率有什么不同,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    int转string与string转int的效率对比

    string转int,两种方法

    Interger.parseInt(String)Interger.valueOf(String).intValue()

    第二种方法可以去看源码,实现了第一种方法。

    java中int转string与string转int的效率有什么不同

    注释大概就是这样的意思

    在valueOf()里面实现了parseInt()方法。时间对比第二种比第一种要快了很多。

     Integer.parseInt(str) : 21 Integer.valueOf(str).intValue() : 14

    int 转string一般用三种方法

    • 第一种:number + ""

    • 第二种:string.valueOf()

    • 第三种:.toString()

    • 先说第一种,简单粗暴。

    • 第二种方法:底层使用的依旧是.toString()方法

    • 第三种就是toString()

    上代码。

    int num = 888888;         //(1)num + ""        long start = System.currentTimeMillis();//得到开始运行时系统时间        for(int i=0; i<100000; i++){            String str = num + "";        }        long end = System.currentTimeMillis();//得到结束运行时系统时间        System.out.println("num + \"\" : " + (end - start));         //(2)String.valueOf(num)        start = System.currentTimeMillis();        for(int i=0; i<100000; i++){            String str = String.valueOf(num);        }        end = System.currentTimeMillis();        System.out.println("String.valueOf(num) : " + (end - start));         //(3)Integer.toString(num)        start = System.currentTimeMillis();        for(int i=0; i<100000; i++){            String str = Integer.toString(num);        }        end = System.currentTimeMillis();        System.out.println("Integer.toString(num) : " + (end - start));

    结果就是

    num + "" : 82
    String.valueOf(num) : 32
    Integer.toString(num) : 9

    经过多次的反复测试,toString()是最快的,num+""是最慢的,在使用String.valueOf()中源码是这样的。

    public static String valueOf(Object obj) {    return (obj == null) ? "null" : obj.toString();}

    也就是说在使用的时候,不用去判断所传的对象是否为null,但是尤其注意,如果传的为空,返回来的是一个为null的字符串而不是null值,这个地方需要谨记。

    string转int问题分析

    相信很多同学在面试时都遇到过这样一个问题,要求封装一个函数,将String类型转换为int类型。这个看似简单的问题其实隐藏着很多细节,要想真正封装好这个函数并不容易。面试官要考察的其实并不是算法本身的难度,这个问题的算法其实没有什么难度可言,主要要考察的是程序员写代码的仔细程度,考虑问题是否全面,也就是说,我们要尽可能的让代码具有鲁棒性。下面我们一步步的分析这个问题中隐藏的细节。

    分析一波

    首先我们不考虑任何的异常处理,假设函数的调用者传入的数据都是正确的,很容易就可以写出下面的代码:

        public int strToInt(String str) {        int number = 0;        for (int i=0; i<str.length(); i++) {            number *= 10;            number += (str.charAt(i) - '0');        }        return number;    }

    上面的代码将遍历字符串的每一位字符,并将其转换为对应的整数,然后将其一一融入到整形数据number中。

    如果你给面试官提交的是这样一份代码,结果肯定不会满意。因为你没有考虑到程序的鲁棒性,我们封装的函数相当于api接口,是提供给所有开发者调用的,难免其他开发者不会传入一些奇怪的参数,而这段代码对异常参数没有做任何处理,一旦传入异常参数,程序将直接崩溃。下面我们一步步来完善这个函数,提高其鲁棒性。

    1、针对传入的字符串为空对象或者字符串为空的字符串
        public int strToInt(String str) throws NumberFORMatException{        if (str == null || str.contentEquals("")) { // 如果传入的字符串为空对象或者传入的字符串为空字符串,则抛出异常            throw new NumberFormatException("null or empty string"); // 这里直接利用java封装好的异常类,当然我们也可以自己封装异常类,面试官要考察的不是对异常类的封装,而是你要知道要处理异常情况        }        int number = 0;        for (int i=0; i<str.length(); i++) {            number *= 10;            number += (str.charAt(i) - '0');        }        return number;    }

    首先我们字符串是否为空或者是否为空的字符串,如果是,则直接抛出异常,这里我们使用的是Java封装好的异常类NumberFormatException,当然我们也可以自己封装异常类,面试官要考察的不是对异常类的封装,而是你要知道要处理异常情况。

    2、针对符号位的处理

    这个我们最好提前问一下面试官,有没有可能传入的是负数,当为正数时,是否允许带符号位,如果是的话,我们就要针对符号位进行处理,负数的第一个字符是“-”,我们只要判断第一个字符是否为“-”就可以知道传入的是否为负数了,如果正数允许带符号位,那边第一个字符有可能是“+”,我们也要做对应的处理:

        public int strToInt(String str) throws NumberFormatException{        if (str == null || str.contentEquals("")) { // 如果传入的字符串为空对象或者传入的字符串为空字符串,则抛出异常            throw new NumberFormatException("null or empty string"); // 这里直接利用java封装好的异常类,当然我们也可以自己封装异常类,面试官要考察的不是对异常类的封装,而是你要知道要处理异常情况        }        boolean negative = false; // negative为true表示是负数,反之为正数        int pos = 0;        if (str.charAt(0) == '-') { // 如果为负数            negative = true;            pos++; // 调过第一位符号位        } else if (str.charAt(0) == '+') {            pos++; // 调过第一位符号位        }        int number = 0;        while (pos < str.length()) {            number *= 10;            number += (str.charAt(pos) - '0');            pos++;        }         return negative ? -number : number; // 如果为负数则返回对应的负数    }
    3、针对错误字符的处理

    函数的调用者可能会传入一下乱七八糟的字符串,比如“abc23123”,针对这种情况我们也要做对应的处理,应该给调用者抛出一个异常,告知其传入的字符串是非法字符串:

        public int strToInt(String str) throws NumberFormatException{        if (str == null || str.contentEquals("")) { // 如果传入的字符串为空对象或者传入的字符串为空字符串,则抛出异常            throw new NumberFormatException("null or empty string"); // 这里直接利用java封装好的异常类,当然我们也可以自己封装异常类,面试官要考察的不是对异常类的封装,而是你要知道要处理异常情况        }        boolean negative = false; // negative为true表示是负数,反之为正数        int pos = 0;        if (str.charAt(0) == '-') { // 如果为负数            negative = true;            pos++; // 调过第一位符号位        } else if (str.charAt(0) == '+') {            pos++; // 调过第一位符号位        }        int number = 0;        while (pos < str.length()) {            if (str.charAt(pos) >= '0' && str.charAt(pos) <= '9') { // 只有字符在'0'到'9'的范围内,才算正确的字符                number *= 10;                number += (str.charAt(pos) - '0');                pos++;             } else {                throw new NumberFormatException("invalid string"); // 当字符是其他字符时,抛出异常告知调用者传入的字符串错误            }        }         return negative ? -number : number; // 如果为负数则返回对应的负数    }
    4、针对整形数据超出范围的处理

    调用者传入的字符串可能是一个很长的字符串,转换为整数可能超出了整数的存储范围,比如“12345678674324334”,在这种情况下,我们要抛出一个异常告知调用者传入的字符串超出了整形的范围:

        public int strToInt(String str) throws NumberFormatException{        if (str == null || str.contentEquals("")) { // 如果传入的字符串为空对象或者传入的字符串为空字符串,则抛出异常            throw new NumberFormatException("null or empty string"); // 这里直接利用java封装好的异常类,当然我们也可以自己封装异常类,面试官要考察的不是对异常类的封装,而是你要知道要处理异常情况        }        boolean negative = false; // negative为true表示是负数,反之为正数        int pos = 0;        if (str.charAt(0) == '-') { // 如果为负数            negative = true;            pos++; // 调过第一位符号位        } else if (str.charAt(0) == '+') {            pos++; // 调过第一位符号位        }        int limit = negative ? (-Integer.MIN_VALUE) : Integer.MAX_VALUE;        int mult = limit / 10; // 记录最大数/10,让number和这个数比较,如果大于它,则number * 10肯定也就大于最大数        int number = 0;        while (pos < str.length()) {            if (str.charAt(pos) >= '0' && str.charAt(pos) <= '9') { // 只有字符在'0'到'9'的范围内,才算正确的字符                if (number > mult) {// 让number和mult比较,如果大于它,则number * 10肯定也就大于最大数                    throw new NumberFormatException("input string beyond int size");                }                number *= 10;                int digit = str.charAt(pos) - '0';                if (number > limit - digit) { // 这里不能用number + digit > limit来判断,因为number + digit可能超出整数的存储范围,相加后的数可能是一个负数,但是limit - digit肯定不会超出                    throw new NumberFormatException("input string beyond int size");                } else {                    number += digit;                }                pos++;            } else {                throw new NumberFormatException("invalid string"); // 当字符是其他字符时,抛出异常告知调用者传入的字符串错误            }        }         return negative ? -number : number; // 如果为负数则返回对应的负数    }

    上面的代码中,我们判断number是否会超出最大整数时首先是先让其(最大整数/10)的值比较,而不是让其乘以10与最大整数比较,这是因为number * 10如果超出了整数范围,则会造成数据溢出,其得到的值可能是一个负数,而(最大整数/10)的值是不会数据溢出的,这也是一个小细节。可能你以为这样这个函数就完美了,但是现在我要告诉你,上面的写法是错误的。

    为什么呢?这要从整数的范围说起,整数的取值范围是(-2^31)至(2^31 - 1),从绝对值的角度看,最小负数相比于最大正数大1。所以上面代码中(-Integer.MIN_VALUE)会超出整形的范围,造成数据溢出,也就是说上面的代码对负数最小范围的限制的处理是错误的。那么怎么解决这个问题呢?

    我们换个角度思考,最小负数的绝对值比最大正数的绝对值大1,那(-Integer.MAX_VALUE)的值肯定不会超出整数的范围,我们现在的程序是以正数的方式处理,如果反过来已负数的方式处理,问题不就解决了吗?修改代码如下:

        public int strToInt(String str) throws NumberFormatException{        if (str == null || str.contentEquals("")) { // 如果传入的字符串为空对象或者传入的字符串为空字符串,则抛出异常            throw new NumberFormatException("null or empty string"); // 这里直接利用java封装好的异常类,当然我们也可以自己封装异常类,面试官要考察的不是对异常类的封装,而是你要知道要处理异常情况        }        boolean negative = false; // negative为true表示是负数,反之为正数        int pos = 0;        if (str.charAt(0) == '-') { // 如果为负数            negative = true;            pos++; // 调过第一位符号位        } else if (str.charAt(0) == '+') {            pos++; // 调过第一位符号位        }        int limit = negative ? Integer.MIN_VALUE : (-Integer.MAX_VALUE);        int mult = limit / 10;        int number = 0;        while (pos < str.length()) {            if (str.charAt(pos) >= '0' && str.charAt(pos) <= '9') { // 只有字符在'0'到'9'的范围内,才算正确的字符                if (number < mult) {                    throw new NumberFormatException("input string beyond int size");                }                number *= 10;                int digit = str.charAt(pos) - '0';                if (number < limit + digit) {                    throw new NumberFormatException("input string beyond int size");                } else {                    number -= digit;                }                pos++;            } else {                throw new NumberFormatException("invalid string"); // 当字符是其他字符时,抛出异常告知调用者传入的字符串错误            }        }         return negative ? number : -number;    }

    OK,现在我们把能够想到的异常情况处理了。再来考虑一个问题,为什么整形数据的范围是(-2^31)至(2^31 - 1),最小负数的绝对值比最大正数的绝对值要大1呢?

    5、int数据范围的讨论

    我们知道,一个int类型占四个字节,也就是32位,其中第一位是符号位,符号位为0表示正数,为1表示负数,其余31位表示数值。正常来说int类型的数据范围应该是(-2^31-1)到(2^31-1),为什么负数会多一位呢?

    我们首先看一下Java代码中对Integer.MAX_VALUE和Integer.MIN_VALUE的定义:

            public static final int   MIN_VALUE = 0x80000000;         public static final int   MAX_VALUE = 0x7fffffff;
    原码、反码、补码

    我们知道,在计算机中,数据都是以二进制的形式存储的,比如,数字10,其二进制形式就是1010。

    一个字节有8位,每位可以存储一个01字符,byte类型占1个字节,也就是8位,其中,最高位是符号位,用来表示数值是正数还是负数,符号位为0表示正数,符号位为1表示负数。我们先来看一下原码、反码、补码的定义:

    • 原码:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

    • 反码:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

    • 补码:补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)

    正数的原码、反码、补码都是其本身;负数的反码是在其原码的基础上,符号位不变,其余个位取反,负数的补码是其反码的基础上+1。

    举例说明(下面都以byte类型进行举例):

    数据原码反码补码
    10000010100000101000001010
    -10100010101111010111110110

    计算机中,数据都是以补码的形式存储的。为什么要以补码的形式存储呢?有两个原因:

    1、如果数值以补码的形式保存,对一个数进行求补运算,可以得到其相反值

    求补运算:将一个数(包括正数和负数)所有二进制位(包括符号位和数值位)取反,然后在最低位加上1。

    为什么对一个数进行求补运算,可以得到其相反值呢?我们先来分析一下求补运算的定义,现将所有的二进制取反,然后+1,首先一个数和它所有位取反得到的数相加,其结果肯定是11111111,这是因为它们每一位都不一样,然后将结果+1,即11111111 + 1,结果是1 00000000,最高位的1已经溢出,换种方式说,如果以f(n)表示对n进行求补运算,那么对于任意的范围内的数,可以得到:

    n + f(n) = 1 00000000

    f(n) = 1 00000000 - n

    而对于一个正数来说,对其进行求补运算其实得到的就是它的相反数的补码(负数的补码符号位保持不变,其他为全部取反再+1,因为正数和负数的符号位本来就不一样,所以对一个正数进行求补其实得到的就是它的相反数的补码)。

    那么对于一个负数来说呢?对其进行求补运算是否能够得到其对应的正数的补码呢?

    假设n>0,根据上面可知:

    f(n) = 1 00000000 - n

    对f(n)进行求补运算,有:

    f(f(n)) = f(1 00000000 - n) = 1 00000000 - (1 00000000 - n) = n

    其中,1 00000000 - n表示n对应负数的补码,对其进行求补运算得到的就是n,正数的补码就是其原码。

    由上可知:如果数值以补码的形式保存,对一个数进行求补运算,可以得到其相反值,即:f(n) = -n

    2、方便减法运算

    如果数值以补码的方式存储,可以将减法变为加法,省去了减法器,通过上面的推导,如果数据以补码的方式存储,以f(n)表示对n进行求补运算,可以得到:

    f(n) = -n

    那么现在我们需要计算m - n,应该要怎么计算呢?如果以补码的方式存储,那么就有:

    m - n = m + (-n) = m + f(n)

    也就是说,减去一个数只需要加上对其进行求补运算后得到的值即可。

    3、使用补码存储数据,可以对任意的两个数直接进行相加运算,不用考虑符号位

    4、通过补码形式存储,规定10000000对应的负数的最小值,也就是-128。

    由上面可知,如果是byte类型,数据范围应该为[-128,127],最小负数要比最大正数多一位。

    关于“java中int转string与string转int的效率有什么不同”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: java中int转string与string转int的效率有什么不同

    本文链接: https://www.lsjlt.com/news/324578.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • java中int转string与string转int的效率有什么不同
      这篇文章将为大家详细讲解有关java中int转string与string转int的效率有什么不同,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。int转string与string转int的效率对比strin...
      99+
      2023-06-29
    • java中int转string与string转int的效率对比
      目录int转string与string转int的效率对比string转int,两种方法int转string一般用三种方法string转int问题分析分析一波1、针对传入的字符串为空对...
      99+
      2024-04-02
    • java int转string的方法是什么
      Java中将int转换为String的方法有以下几种:1. 使用Integer的toString()方法:可以使用Integer类的...
      99+
      2023-09-15
      java
    • Java String转int的写法是什么
      本篇内容主要讲解“Java String转int的写法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java String转int的写法是什么”吧!在 Java 中,String(字符串)...
      99+
      2023-06-16
    • c++中int怎么转string
      非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
      99+
      2024-05-14
    • Android中String与int相互转换
      目录一、如何将字串 String 转换成整数 int?这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?二、 如何将整数 int 转换成字串 String...
      99+
      2024-04-02
    • c++中 string转int的方法
      在 c++ 中,有两种将 string 转换为 int 的方法:使用 sto i() 函数,直接接收字符串并返回整数。使用 istringstream 类,将字符串解析为输入流,然后提取...
      99+
      2024-05-01
      c++ 字符串解析
    • Java中string与int怎么实现互相转换
      本篇文章为大家展示了Java中string与int怎么实现互相转换,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。int -> String int i=12345;String s="...
      99+
      2023-05-31
      java string int
    • C++中string与int怎么相互转换
      这篇文章主要讲解了“C++中string与int怎么相互转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中string与int怎么相互转换”吧!一、int转string#includ...
      99+
      2023-06-29
    • java中int转化为string怎么实现
      可以使用Integer类的toString()方法将int类型转化为String类型。示例如下: int num = 10; Str...
      99+
      2024-04-02
    • JAVA中int与string相互转化的几种方法
      1.JAVA 中int类型转String类型的三种通常方法: String.valueOf(int i) Integer.toString(int i) i + “”; //i 为 int类型,int+string型就是先将int型的i转为...
      99+
      2023-10-06
      java 算法 c++
    • c++中string转int怎么实现
      在C++中,可以使用std::stoi函数将字符串转换为整数。示例如下: #include <iostream> #in...
      99+
      2024-03-15
      c++
    • Android中String与int如何相互转换
      小编给大家分享一下Android中String与int如何相互转换,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、如何将字串 String 转换成整数 int方法一:int i = Inte...
      99+
      2023-06-22
    • 如何在 Java 中将 String 转换为 int?
      问: 如何将 String 转换为 int? "1234" → 1234 答1: huntsbot.com – 高效赚钱,自由工作 String myString = "1234";int ...
      99+
      2023-10-24
      java 开发语言 jvm rxjava boosting
    • c++中怎么将int转换为string
      在C++中,可以使用`std::to_string()`函数将`int`类型转换为`std::string`类型。下面是一个示例:`...
      99+
      2023-08-19
      c++
    • c++中int转string类型怎么实现
      在 C++ 中,您可以使用以下方法将整数类型 (int) 转换为字符串类型 (string): #include <iostr...
      99+
      2024-04-02
    • 怎么在golang中将Int转换为string
      这期内容当中小编将会给大家带来有关怎么在golang中将Int转换为string,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、并...
      99+
      2023-06-14
    • MySQL中string转int类型怎么实现
      在MySQL中,可以使用CAST或者CONVERT函数将字符串转换为整数类型。 例如,可以使用CAST函数将字符串转换为整数: SE...
      99+
      2024-03-06
      MySQL
    • C++string与int的相互转换(使用C++11)
      目录一、int转string二、string转int一、int转string #include <iostream> #include <string> ...
      99+
      2024-04-02
    • Python如何将list中的string转换为int
      目录如何将list中的string转换为int在Python2中这样操作在Python3中这样操作Python-string,list,int互转记录如何将list中的string转...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作