在java中将字符串转换为整数的最有效方法

2022-09-01 13:34:57

将 String 转换为 Integer 对象的方法有很多种。这是以下最有效的:

Integer.valueOf()
Integer.parseInt()
org.apache.commons.beanutils.converters.IntegerConverter

我的用例需要创建包装器整数对象...意思是没有原始的int...转换后的数据用于只读。


答案 1

如果您关心的是效率,那么创建 Integer 对象比解析它要昂贵得多。如果你必须创建一个 Integer 对象,我不会太担心它是如何解析的。

注意:例如,Java 6u14 允许您使用命令行选项 -Djava.lang.Integer.IntegerCache.high=1024 来增加 Integer 池的大小。

注意2:如果您正在读取原始数据,例如从文件或网络读取字节,则将这些字节转换为字符串也相对昂贵。如果您要编写自定义解析器,我建议绕过与字符串对话的步骤并解析原始源数据。

注意 3:如果您正在创建一个 Integer,以便可以将其放入集合中,则可以通过使用 GNU Trove (trove4j) 来避免这种情况,它允许您将基元存储在集合中,从而允许您删除 Integer 创建。

理想情况下,为了获得最佳性能,您希望避免创建任何对象。


答案 2

最好的办法是使用 Integer.parseInt。这将返回一个整数,但可以自动装箱为整数。这比 valueOf 稍快,因为当您的数字介于 -128 和 127 之间时,它将使用 Integer 缓存,而不会创建新对象。最慢的是Apache方法。

private String data = "99";

public void testParseInt() throws Exception {
    long start = System.currentTimeMillis();
    long count = 0;
    for (int i = 0; i < 100000000; i++) {
        Integer o = Integer.parseInt(data);
        count += o.hashCode();
    }
    long diff = System.currentTimeMillis() - start;
    System.out.println("parseInt completed in " + diff + "ms");
    assert 9900000000L == count;
}

public void testValueOf() throws Exception {
    long start = System.currentTimeMillis();
    long count = 0;
    for (int i = 0; i < 100000000; i++) {
        Integer o = Integer.valueOf(data);
        count += o.hashCode();
    }
    long diff = System.currentTimeMillis() - start;
    System.out.println("valueOf completed in " + diff + "ms");
    assert 9900000000L == count;
}


public void testIntegerConverter() throws Exception {
    long start = System.currentTimeMillis();
    IntegerConverter c = new IntegerConverter();
    long count = 0;
    for (int i = 0; i < 100000000; i++) {
        Integer o = (Integer) c.convert(Integer.class, data);
        count += o.hashCode();
    }
    long diff = System.currentTimeMillis() - start;
    System.out.println("IntegerConverter completed in " + diff + "ms");
    assert 9900000000L == count;
}

parseInt completed in 5906ms
valueOf completed in 7047ms
IntegerConverter completed in 7906ms

推荐