La forma más eficiente de convertir String a Integer en java

Hay muchas formas de convertir una cadena en un objeto entero. Cuál es el más eficiente entre los siguientes:

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

Mi caso de uso necesita crear objetos enteros envolventes ... lo que significa que no hay int primitivo ... y los datos convertidos se usan solo para lectura.

Respuesta 1

Si le preocupa la eficiencia, crear un objeto Integer es mucho más costoso que analizarlo. Si tiene que crear un objeto Integer, no me preocuparía demasiado cómo se analiza.

Nota: Java 6u14 le permite aumentar el tamaño de su grupo de enteros con una opción de línea de comandos -Djava.lang.Integer.IntegerCache.high = 1024 por ejemplo.

Nota 2: Si está leyendo datos sin procesar, por ejemplo, bytes de un archivo o red, la conversión de estos bytes a una Cadena también es relativamente costosa. Si va a escribir un analizador personalizado, sugiero omitir el paso de conversar con una cadena y analizar los datos de origen sin procesar.

Nota 3: Si está creando un número entero para que pueda ponerlo en una colección, puede evitarlo utilizando GNU Trove (trove4j) que le permite almacenar primitivas en colecciones, lo que le permite eliminar también la creación de números enteros.

Idealmente, para obtener el mejor rendimiento, debe evitar crear ningún objeto.

Respuesta: 2

Su mejor opción es usar Integer.parseInt. Esto devolverá un int , pero se puede encuadrar automáticamente en un entero. Esto es un poco más rápido que valueOf, ya que cuando sus números están entre -128 y 127 usará el caché Integer y no creará nuevos objetos. El más lento es el método 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
Respuesta: 3

Sé que esto no está entre tus opciones anteriores. IntegerConverter está bien, pero debe crear una instancia de este. Echa un vistazo a NumberUtils en Commons Lang:

Commons Lang NumberUtils

Esto proporciona el método para:

static int toInt(java.lang.String str, int defaultValue) 

que le permite especificar un valor predeterminado en caso de falla.

NumberUtils.toInt("1", 0)  = 1

Esa es la mejor solución que he encontrado hasta ahora.

Respuesta: 4

Si le preocupa la eficiencia, use int: es mucho más rápido que Integer.

De lo contrario, class Integer le ofrece al menos un par de formas claras y limpias:

Integer myInteger = new Integer(someString);
Integer anotherInteger = Integer.valueOf(someOtherString);
Respuesta: 5

Aquí hay un buen artículo que compara el rendimiento de diferentes métodos de análisis de enteros

Y aquí está el código utilizado, con comprobaciones de desbordamiento / subflujo.

public static int parseInt( final String s )
{
    if ( string == null )
        throw new NumberFormatException( "Null string" );

    // Check for a sign.
    int num  = 0;
    int sign = -1;
    final int len  = s.length( );
    final char ch  = s.charAt( 0 );
    if ( ch == '-' )
    {
        if ( len == 1 )
            throw new NumberFormatException( "Missing digits:  " + s );
        sign = 1;
    }
    else
    {
        final int d = ch - '0';
        if ( d < 0 || d > 9 )
            throw new NumberFormatException( "Malformed:  " + s );
        num = -d;
    }

    // Build the number.
    final int max = (sign == -1) ?
        -Integer.MAX_VALUE : Integer.MIN_VALUE;
    final int multmax = max / 10;
    int i = 1;
    while ( i < len )
    {
        int d = s.charAt(i++) - '0';
        if ( d < 0 || d > 9 )
            throw new NumberFormatException( "Malformed:  " + s );
        if ( num < multmax )
            throw new NumberFormatException( "Over/underflow:  " + s );
        num *= 10;
        if ( num < (max+d) )
            throw new NumberFormatException( "Over/underflow:  " + s );
        num -= d;
    }

    return sign * num;
}

E incluso una implementación más rápida, sin controles de desbordamiento / subflujo.

public static int parseInt( final String s )
{
    // Check for a sign.
    int num  = 0;
    int sign = -1;
    final int len  = s.length( );
    final char ch  = s.charAt( 0 );
    if ( ch == '-' )
        sign = 1;
    else
        num = '0' - ch;

    // Build the number.
    int i = 1;
    while ( i < len )
        num = num*10 + '0' - s.charAt( i++ );

    return sign * num;
} 
Respuesta: 6

Intenté una comparación de valueOf, parseInt, Ints.tryParse, NumberUtils.createInteger y NumberUtils.toInt con el programa a continuación. Estaba en jdk 1.8.0

Como se esperaba, los métodos que no necesitaban crear un objeto Integer eran los más rápidos. Mis resultados fueron:

valueOf took: 77
parseInt took: 61
Ints.tryParse took: 117
numberUtils.createInteger took: 169
numberUtils.toInt took: 63 

Entonces el resumen es:

Si puede obtener usando un int, use Integer.parseInt.

Si realmente necesita un número entero, use Integer.valueOf

Si necesita la comodidad de no manejar excepciones cuando analiza, o si no está seguro del formato de la entrada (es decir, es una cadena que no necesita ser un número), use Ints.tryParse

El código que usé fue:

public class HelloWorld {

public static int limit = 1000000;
public static String sint = "9999";

public static void main(String[] args) {

    long start = System.currentTimeMillis();
    for (int i = 0; i < limit; i++) {
       Integer integer = Integer.valueOf(sint);
    }
    long end = System.currentTimeMillis();

    System.out.println("valueOf took: " + (end - start));


    start = System.currentTimeMillis();
    for (int i = 0; i < limit; i++) {
        int integer = Integer.parseInt(sint);
    }
    end = System.currentTimeMillis();

    System.out.println("parseInt took: " + (end - start));


    start = System.currentTimeMillis();
    for (int i = 0; i < limit; i++) {
        int integer = Ints.tryParse(sint);
    }
    end = System.currentTimeMillis();

    System.out.println("Ints.tryParse took: " + (end - start));


    start = System.currentTimeMillis();
    for (int i = 0; i < limit; i++) {
        Integer integer = NumberUtils.createInteger(sint);
    }
    end = System.currentTimeMillis();

    System.out.println("numberUtils.createInteger took: " + (end - start));

    start = System.currentTimeMillis();
    for (int i = 0; i < limit; i++) {
        int integer = NumberUtils.toInt(sint);
    }
    end = System.currentTimeMillis();

    System.out.println("numberUtils.toInt took: " + (end - start));

}
}
Respuesta: 7

ParseInt devuelve un int, no un java.lang.Integer, por lo que si usa el método tat tendría que hacer

new Integer (Integer.parseInt(number));

He escuchado muchas veces que llamar a Integer.valueOf () en lugar de al nuevo Integer () es mejor por razones de memoria (esto viene para pmd)

En JDK 1.5, llamar al nuevo número entero () provoca la asignación de memoria. Integer.valueOf () es más amigable con la memoria.

http://pmd.sourceforge.net/rules/migrating.html

Además de eso, Integer.valueOf permite el almacenamiento en caché, ya que se garantiza que los valores -127 a 128 tienen instancias en caché. (desde java 1.5)

Respuesta: 8

Herro, algo nuevo en Java, así que perdona mi ignorancia.

Estaba buscando una manera de analizar una cadena mixta (letras y números) en un INT (algo así como JavaScript lo hace). No pude encontrar nada en los archivos JAVADOC, así que después de mucho buscar, simplemente escribí una función que lo hace:

// This function takes a string mixed with numbers and letters and returns an INT with
// the first occurrence of a number (INT) in said string, ignoring the rest;
// -- Basically, loop checks if char is a digit, if yes, puts digit back into new array, if no, puts a whitespace in its place
// this creates an array with only digits; By converting it to a string and then trimming whitespaces, it gets parsed into an INT


public static int mixedStringToInt (String str) {

    boolean flag = true;
    boolean isNumber = false;
    final String refNumbers = "0123456789";

    int strlen = str.length();
    char[] numberArray = new char[strlen];
    char[] stringArray = str.toCharArray();

    for (int i = 0; i < strlen;i++){
        if(refNumbers.indexOf(stringArray[i]) > 0 && flag){
            // if current char is a digit
            isNumber = true;
            while (flag){
                numberArray[i] = stringArray[i];
                if(i+1 >= strlen || refNumbers.indexOf(stringArray[i+1]) < 0) flag = false;
                i++;
            }
        } else {
            // if current char is not a digit
            numberArray[i] = ' ';
        }
    }
    if (isNumber){
        return Integer.valueOf(new String(numberArray).trim());
    } else return 0;
}





¿Es esto útil para alguien además de mí? ¿Perdí mi tiempo escribiendo esto porque ya hay un método que hace lo que quería hacer?

Respuesta: 9

clase Cartón {Cuento = 200; CardBoard go (CardBoard cb) {cb = nulo; volver cb; } public static void main (String [] args) {CardBoard c1 = new CardBoard (); Cartón c2 = ...

En un proyecto Java, hay dos archivos java con método principal. Las rutas absolutas para estos dos archivos java son: C: \ Desktop \ project1 \ src \ com \ pre \ moveposition1.java y C: \ Desktop \ project1 \ src \ com \ ...

Necesito enviar un pedido de red corto para un servidor de juegos que estoy escribiendo usando Java. Leí sobre el pedido de red, pero no pude encontrar ningún detalle sobre un corto que se envía antes de los datos. Alguien podria ...

Esta pregunta es doble, pero con suerte no debería ser irrazonablemente larga de responder, a pesar de su propia extensión. Sin embargo, siéntase libre de responder solo una parte, ¡y lo siento por hacerlo tan exhaustivo! Cuales ...