Integer.toString (int i) ve String.valueOf (int i) karşılaştırması


176

Yöntemin neden String.valueOf(int i)var olduğunu merak ediyorum ? Bu yöntemi dönüştürmek intiçin kullanıyorum Stringve Integer.toString(int i)yöntemi keşfettim .

Bu yöntemlerin uygulanmasına baktıktan sonra birincisinin ikincisini çağırdığını gördüm. Sonuç olarak, tüm çağrılarım String.valueOf(int i)doğrudan çağrıdan bir çağrı daha içeriyorInteger.toString(int i)


Yanıtlar:


46

Aynı şeyi yapmanın sadece iki farklı yolu. Tarihsel bir sebep olabilir (birinin diğerinden önce gelip gelmediğini hatırlayamıyorum).


22
Evet, ama bir şey aynı şeyi yapıyorsa, bunun aynı şey olduğu anlamına gelmez.
Damian Leszczyński - Vash

3
String.valueOf (int) sadece Integer.toString (i) 'yi doğrudan çağırır. Integer.toString (int) öğesini çağırmak en iyisidir.
djchapm

171

Dize türünde birkaç yöntem değerine sahibiz

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

Gördüğümüz gibi bu yöntem her türlü sayıyı çözebiliyor

sizin gibi belirli bir yöntemin her uygulaması sunduk: Yani tamsayılar için

Integer.toString(int i)

çift ​​kişilik

Double.toString(double d)

ve bunun gibi

Bence bu bazı tarihsel bir şey değil, ama bir geliştirici için valueOfString sınıfından yöntemi uygun tipten daha kullanmak daha yararlıdır , çünkü bizim için daha az değişikliklere yol açar.

Örnek 1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

Sample2:

public String doStuff(int num) {

 // Do something with num...

 return Integer.toString(num);

 }

Örnek 2'de gördüğümüz gibi, bir örneklemenin aksine iki değişiklik yapmak zorundayız.

Sonuç olarak, valueOfString sınıfından yöntemi kullanmak daha esnektir ve bu yüzden orada mevcuttur.


18
Ve Integer.toString(int i, int radix)bunun 10 dışındaki taban dizelerine dönüşeceğini unutmayın
Stephen P

@Vash Ayrıca, dize String.valueOf ile karşılaştırmak için boş dize kullanma hakkında da açıklar mısınız? örneğin) "" + int i = "i"? Hangisi en iyi ?
Kanagavelu Sugumar

1
İnt'yi dize olarak biçimlendirmek için "" + i kullanmamalısınız. Başın üzerinde büyük yok ama genellikle zarif olmadığı için. Kullanmak yerine, daha fazla okumak String.valueOf(int)için kullanabilirsiniz String.format("%d",i);bu web sitesini ziyaret edin docs.oracle.com/javase/6/docs/api/java/util/Formatter.html
Damian Leszczyński - Vash

Keşke otomatik boks daha akıllı ve sadece derleme ya da bir şey üzerinde dönüşüm ekledi.
Rob Grant

1
@RobertGrant Burada otomatik boks söz konusu değil. Ancak endişelerinizi yanıtlamak için bunu yapmak zekidir int i = new Integer("1");ve bunun tersi de geçerlidir.
Damian Leszczyński - Vash

52

Büyük bir fark, toString()bir null nesneyi çağırırsanız , bir süre elde edersiniz NullPointerException, bunu kullanarak String.valueOf()null olup olmadığını kontrol etmeyebilirsiniz.


46
Soru Integer.toString(int i), bir staticyöntem. nullMümkün olan nesne yok .
Petr Janeček

14
Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception
manish_s

10
@Manis Kumar: Örneğiniz String.valueOf(int i)yöntemi değil String.valueOf(Object obj). Her neyse, soru, mümkün olmayan ilkel intdeğerler ile ilgilidir null.
hleinone

1
@manish_s, kimsenin Object type Integer hakkında konuşmadığı örneğinden oldukça açıktı. Sadece ilkellerden bahsediyoruz.
Daniel Ochoa

2
@manish_s: OP söylemedi Integer.toString()ama Integer.toString(int i). Bu statik bir yöntemdir ( docs.oracle.com/javase/7/docs/api/java/lang/… ).
LarsH

13

String sınıfı, tüm ilkel türler ve Nesne türü için valueOf yöntemleri sağlar, böylece hepsinin bir sınıf üzerinden erişilebilen kolaylık yöntemleri olduğunu varsayarım.

NB Profil oluşturma sonuçları

Ortalama intToString = 5368ms, Ortalama stringValueOf = 5689ms (100.000.000 işlem için)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

7
Profil oluşturma işleminizin gerçekten bir "ısınma" dönemi olmalıdır, aksi takdirde sonuçlar JIT tarafından bir şeylerle uğraşmaktan kaçınabilir. Bununla birlikte, 10 ^ 8 operasyonlar üzerinde 300 ms'lik bir fark, tamamen ihmal edilebilir olacak kadar küçüktür.
Cameron Skinner

1
@Kingo Test durumunuzun doğru olduğunu düşünmüyorum. Çünkü değeri atarsınız String jama asla kullanmazsınız. Temel derleyici bunu optimize etmiş olabilir. Farklı bir yöntemle j nesnesini geçmek ve kukla bir işlem yapmak daha iyidir.
Rakesh

1
Gerçekten evde yetiştirilen mikro kriterleri bu şekilde yazmamalısınız. Eğer kullanırsanız JMH . Isınma, zaman ölçümü, birden fazla bağımsız deneme (Java çatalları) ile ilgilenir ve kodu küçükleştirir , (farklı yöntemler ve değerler için sonuçlar dahil - çalışma süresi 7 dakika): gist.github.com/ecki/ 399136f4fd59c1d110c1 (spoiler: "" + n kazandı).
eckes

5
Teşekkürler dostum, ama cevabım 5 yıl önceydi!
JMH

9

Java kaynaklarından:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

Böylece tam olarak aynı sonucu verirler ve aslında biri diğerini çağırır. String.valueOf, türü daha sonra değiştirebiliyorsanız daha esnektir.


8

StringSınıfın kaynak koduna bakarsanız, aslında aradığınızda Integer.toString()arar valueOf().

Bununla birlikte Integer.toString(), yöntem çağrıları derleme zamanında optimize edilmezse (muhtemelen büyük olasılıkla) biraz daha hızlı olabilir.


Evet ve "" + n daha da hızlı. Bkz. Gist.github.com/ecki/399136f4fd59c1d110c1
eckes


2

OP sorusunu cevaplamak için, diğer çağrıya sahip olmak sadece yardımcı bir sarıcıdır ve stil seçimine gelir ve işte budur. Sanırım burada çok fazla yanlış bilgi var ve bir Java geliştiricisinin yapabileceği en iyi şey her yöntem için uygulamaya bakmak, herhangi bir IDE'de bir veya iki tıklama uzakta. Açıkça göreceksinString.valueOf(int) , sadeceInteger.toString(int) sizi .

Bu nedenle, kesinlikle bir sıfır farkı vardır, çünkü her ikisi de bir char tamponu oluşturur, sayıdaki rakamlardan geçer, sonra bunu yeni bir String'e kopyalar ve döndürür (bu nedenle her biri bir String nesnesi oluşturur). Tek fark, derleyicinin tek bir çağrıyı yine de ortadan kaldırdığı ekstra bir çağrıdır.

Yani kod tutarlılığı dışında, aradığınız şey değil. Sıfırlarla ilgili yorumlara gelince, ilkel bir şey alır, bu nedenle boş olamaz! Geçilen int'i başlatmazsanız, derleme zamanı hatası alırsınız. Dolayısıyla, bu durumda var olmadıkları için null'ları işleme biçiminde bir fark yoktur.


Lütfen metninizi bazı bloklara ayırabilir misiniz? Okumak çok zor.
Magnilex

Bu OP'de birçok yanlış bilgilendirilmiş şey var. Yayının benim için en iyi cevap! Thank you
aksappy

1

Verimlilik sorunlarına mal olan bu ekstra çağrı hakkında endişelenmemelisiniz. Herhangi bir maliyet varsa, minimum olacaktır ve şeylerin büyük resminde ihmal edilebilir olmalıdır.

Belki de her ikisinin de var olmasının nedeni okunabilirlik sunmaktır. Birçok türün dönüştürülmesi bağlamında, Stringçeşitli çağrılar çeşitli çağrılardan String.valueOf(SomeType)daha okunabilir olabilir SomeType.toString.


1
Aslında, bu tür tek hatlı çağrılar oldukça hızlı bir şekilde satır içine alınır.
Tassos Bassoukos

Hatta bir 000 000 zaman çağıran bir döngüde String.valueof () ??
Manuel Selva

@Manuel: Profil yaptınız mı? Burada performans probleminiz olduğunu belirlediniz mi? Zamanından önce optimizasyon yapmadığınızdan emin misiniz? @Tassos: evet, bu da çok olası, ancak profilleme bu özel çağrıda bir sorun olduğunu söylemediği sürece her iki şekilde de endişelenmeyeceğim.
polygenelubricants

Aslında Manuel, bir döngüden 1000000 kat daha fazla satır çizilmesini beklerdim. Yine de, kaç kere dönerse sürsün, zamanın küçük bir kısmı olacaktır.
corsiKa

Hayır ama uygulamamda şişe boynu olmadığından eminim. Ben sadece bunu soruyorum çünkü burada herhangi bir okunabilirlik endişesi göremiyorum ve bu yüzden kazanç 0 olsa bile daha optimum kodu kullanmak zorunda düşünüyorum.
Manuel Selva

1

benim açılım, temsili için her zaman tostring () olarak adlandırılan valueof () 'dir ve bu nedenle ilkel tip valueeof'in sunumu için genelleştirilir. object .here Integer.toString (int i) yalnızca tamsayı için dönüşüm sağlayan bir sınır oluşturur.


1

Integer.toString (5) ve String.valueOf (5) arasında fark yoktur;

çünkü String.valueOf şunu döndürür:

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

vb..


0

Veriler hakkında endişelenmenize gerek kalmayan String.valueOf () yöntemini kullanarak (int, long, char, char [], boolean, Object olsun), şunları çağırabilirsiniz:

  • static String valueOf ()

Bir parametre olarak ilettiğiniz her şeyi String.valueOf () kullanarak yalnızca sözdizimini kullanarak String dönüştürülür ve döndürülür ..

Aksi takdirde, Integer.toString (), Float.toString () vb. (Örn. SomeType.toString ()) kullanırsanız, dizeye dönüştürmek istediğiniz parametrenin veri türünü kontrol etmeniz gerekir. Bu nedenle, bu tür dönüşümler için String.valueOf () öğesini kullanmak daha iyidir.

Integer, Char, Float vb. Gibi farklı değerler içeren bir nesne sınıfı dizisine sahipseniz, String.valueOf () yöntemini kullanarak bu dizinin öğelerini kolayca String formuna dönüştürebilirsiniz. Aksine, eğer SomeType.toString () kullanmak istiyorsanız, o zaman ilk önce onların veri türü sınıflarını (belki "instanceOf" operatörünü kullanarak) bilmeniz gerekir ve sonra sadece bir typecast için devam edebilirsiniz.

String.valueOf () yöntemi, iletilen parametreyle (Integer, Char, Float vb.) Eşleşir ve aşırı yükleme yöntemi kullanılarak, parametresi eşleşen "valueOf ()" yöntemini çağırır ve bu yöntemde karşılık gelen "toString ()" yöntemine doğrudan çağrı ..

Bu nedenle, veri tipini kontrol etme ve ardından karşılık gelen "toString ()" yönteminin çağrılma yükünün nasıl kaldırıldığını görebiliriz. Sadece String'e dönüştürmek istediğimiz şeyi umursamayarak String.valueOf () yöntemini çağırmamız gerekir.

Sonuç: String.valueOf () yönteminin önemi sadece bir çağrı daha pahalıdır.


-3

toString ()

  1. Object sınıfında bulunur, genellikle türetilmiş sınıfta geçersiz kılınır
  2. toString () yöntemini çağırmak için uygun sınıfa typecast gereklidir.

değeri()

  1. String sınıfında aşırı yüklenmiş statik yöntem mevcut.
  2. ilkel türlerin yanı sıra nesne türlerini de ele alır.

    Integer a = null;
    System.out.println(Integer.toString()) ; NUll pointer exception
    System.out.println(String.valueOf() ; give NULL as value

Bu bağlantıyı kontrol edin çok iyi. http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.