`
qianshangding
  • 浏览: 128535 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Integer.toString性能影响

    博客分类:
  • Java
阅读更多

最近研究netty源码,有一段代码,引起我对Integer.toString性能的关注:

先上netty源码片段:

private static final String[] INTEGERS = {
        "0",  "1",  "2",  "3",  "4",  "5",  "6",  "7",  "8",  "9",
        "10", "11", "12", "13", "14", "15",
    };

    public static String toString(int value) {
        if (value >= 0 && value < INTEGERS.length) {
            return INTEGERS[value];
        } else {
            return Integer.toString(value);
        }
    }

 这个toString方法是netty将handler对象放到Map中,在获取Map的key时调用的。作者定义了16个下标,超过16则调用Integer.toString方法获取下标。

 

这就有一个问题了,Integer.toString到底比直接去取定义在数组的字符串慢多少呢,看下面的测试代码:

final String[] str = { new String("1"), new String("2"), new String("3"), new String("4"), new String("5"),
				new String("6"), new String("7"), new String("8"), new String("9"), new String("10"), new String("11") };
		Date start = new Date();
		long startTime = start.getTime();
		for (int i = 0; i < 1000000; i++) {
			for (int j = 0; j < 11; j++) {
				String test = str[j];
			}
		}
		Date end = new Date();
		long endTime = end.getTime();
		System.out.println("数组所需时间:" + (endTime - startTime));

		Date start1 = new Date();
		long startTime1 = start1.getTime();
		for (int i = 0; i < 1000000; i++) {
			for (int j = 0; j < 11; j++) {
				String test = Integer.toString(j);
			}
		}
		Date end1 = new Date();
		long endTime1 = end1.getTime();
		System.out.println("ToString所需时间:" + (endTime1 - startTime1));
 
数组所需时间:16ms
ToString所需时间:328ms

 测试结果很明显了,到数组里面取比调用Integer.toString方法要快很多。

为啥快呢?

个人认为:1,由于拆箱装箱的原理,获取字符串的内存区域不同。

                     2,可以看看Integer.toString源码:

public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(0, size, buf);
    }
 

 

当然,在很多系统,这么点时间根本就算不了什么。但是如果碰到netty这种使用场景,可以做一些优化。哈哈.

 

可能有没有想到的地方,希望大家补充。

分享到:
评论

相关推荐

    java 类型转换 大全

    2. **使用 `Integer.toString()` 方法** ```java int i = 123; String s = Integer.toString(i); ``` 该方法同样可以实现转换功能,且性能略优于第一种方法。 3. **使用字符串连接操作** ```java int i = ...

    String与int相互转换

    源码分析可以帮助我们理解这些转换过程的底层逻辑和性能影响。 4. 工具支持: 开发者工具如IDEA、Eclipse等提供了很多便捷的功能,比如自动转换和格式化,使得在实际编码过程中进行String和int的转换更加轻松。 5...

    十进制到十六进制转换的Java程序.docx

    Java 提供了一个内置函数 `Integer.toString(int a, int base)`,可以方便地将整数转换为特定基数的字符串表示。这个方法适用于任何基数,但最常用的是转换为16(十六进制)。 ```java // To convert Decimal to ...

    JAVA数据转换类型

    这三种方法都可以将整数转换为字符串,但需要注意的是,使用字符串拼接的方式可能会影响程序的性能。 浮点数转换为字符串 在 Java 中,浮点数可以通过两种方式转换为字符串: 1. 使用 `Float.toString()` 方法:`...

    java编写的数制转换器

    2. `Integer.toString(int i, int radix)`:相反,这个方法将整数转换成指定基数的字符串形式。例如,`Integer.toString(10, 16)`会将十进制的10转换为十六进制的"A"。 3. `Integer.toBinaryString(int i)` 和 `...

    src02 Integer

    5. **Integer.toString(int i)**: 如果没有指定基数,则默认使用`toString(int i)`,它将`int`值`i`转换为十进制的字符串。 6. **Integer.stringSize(int x)**: 这个方法返回表示整数`x`所需的字符数。它用于计算在...

    JAVA类型转换[文].pdf

    - **数字到字符串**:可以使用`Integer.toString()`或`Double.toString()`等方法。例如: ```java int num = 123; String strNum = Integer.toString(num); ``` 4. **包装类转换** - **基本类型到包装类**:...

    Java面向对象(高级)- 包装类(wrapper)的使用

    - `toString()` 方法:`String str = num.toString();` - `String.valueOf()` 方法:`String str = String.valueOf(num);` - `String`类型 -&gt; 基本数据类型、包装类: - `parseInt()`、`parseDouble()` 等方法:...

    进制转换工具类

    例如,`Integer.parseInt()`和`Integer.toString()`可以用来进行十进制与其他进制间的转换。`Integer.parseInt()`用于将字符串转换为整数,而`Integer.toString()`则将整数转换为字符串形式。如果需要处理的数值超出...

    OJ_simple_10.08.txt

    String s = Integer.toString(i); ``` - **字符串拼接方式** ```java String s = "" + i; ``` 这种方式简单易懂,但在性能密集型的应用中可能不如前两种方式高效。 ### 二、计算单词的平均长度 接下来我们来...

    HBASE-comparator.zip

    此外,自定义Comparator还需要考虑性能优化,因为它直接影响到HBase的查询性能。 "HBASE-comparator.zip"文件可能包含了更多关于如何编写、配置和测试自定义Comparator的详细步骤,以及可能遇到的问题和解决策略。...

    Java整数和字符串相互转化实例详解

    这是一种简单的转换方式,但需要注意的是,这种方法会创建临时字符串对象,影响性能。 2. 使用Integer.toString()方法,例如: String s = Integer.toString(i); 这是一种更好的转换方式,因为它不会创建临时字符...

    Java程序将二进制转换为八进制.docx

    2. **十进制转八进制**:使用`Integer.toString(int, int radix)`方法,其中第一个参数是我们要转换的十进制数,第二个参数是目标基数(这里是8)。这个方法会返回一个表示给定十进制数的指定基数的字符串。 在Java...

    java数据类型转换

    String str = Integer.toString(i); // 使用toString // 或者 String str = String.valueOf(i); // 使用valueOf ``` - `toString`:将int类型转换为字符串。 - `valueOf`:创建一个包含整数值的String对象。 #####...

    JAVA-int和Integer的区别

    此外,`Integer`类还提供了一些实用方法,比如`parseInt()`用于将字符串转换为整数,`toString()`用于将整数转换为字符串,以及`compareTo()`用于比较两个`Integer`对象的大小。 总的来说,`int`适合于需要高性能...

    Java程序设计 6 标准类库.pptx

    例如,`Integer.toString(int i)`将整数转换为字符串,而`Integer.parseInt(String s)`则是将字符串转换回整数。包装器类还提供了其他有用的方法,如`valueOf()`,以及自动装箱和拆箱功能。 6. **包装器类与字符串...

    Android开发者们一定会喜欢的 RxJava

    .map(integer -&gt; integer.toString()) .subscribe(System.out::println); ``` 总之,RxJava通过这些丰富的概念和工具,极大地方便了Android开发者在处理异步操作、事件和数据流时的编程工作,不仅提高了代码的...

    JavaSE选择题第一套(含答案).doc

    1. 在Java中,字符串是不可变对象,因此当你尝试将一个数值与字符串相加时,会自动调用`Integer.toString(int)`将其转换为字符串,然后进行拼接。所以代码`str += 42;`等价于`str = str + Integer.toString(42);`,...

    JAVA面试题最全集[定义].pdf

    - 数据类型转换:例如,`Integer.parseInt()`和`Double.parseDouble()`用于字符转数字,`Integer.toString()`和`Double.toString()`用于数字转字符。取小数点前两位并四舍五入可以使用`Math.round()`。 2. **日期...

    Java对List对象进行排序_.docx

    Integer value1 = (int) (v1.toString().charAt(0)); Integer value2 = (int) (v2.toString().charAt(0)); return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1); } else if (/*...其他类型...

Global site tag (gtag.js) - Google Analytics