Java int เป็น String - Integer.toString (i) เทียบกับ Integer (i) .toString ใหม่ ()


428

บางครั้งจาวาปริศนากับฉัน
ฉันมีจำนวนมากของการเริ่มต้นint ที่จะทำให้

อะไรคือจริงแตกต่าง?

  1. Integer.toString(i)
  2. new Integer(i).toString()

20
ฉันจะใช้"" + 42แต่เฮ้นั่นคือฉัน แบบฟอร์ม # 2 จะส่งผลให้วัตถุจำนวนเต็มใหม่ (สำหรับค่าส่วนใหญ่ของ i) เป็นสื่อกลาง นอกจากนี้ยังมีการพิมพ์มากขึ้น

16
@pst: ถ้าวัตถุกลางเป็นปัญหาสำหรับคุณแล้ว"" + 42ไม่ได้ที่ดีกว่าตามที่ต้องการเป็นสื่อกลางซึ่งค่อนข้างมากหนักกว่าStringBuilder Integer
Joachim Sauer

47
"" + 42 อาจใช้งานได้ แต่เป็นความคิดที่ไม่ดี คนอย่างฉันจะมาดูโค้ดของคุณแล้วลองคิดดูว่าเกิดอะไรขึ้นกับสตริงว่าง
Mainguy

3
ฉันจะไม่แนะนำ"" + 42เพราะในกรณีที่ต่อท้ายสตริงของจำนวนเต็มคุณอาจท้ายเพิ่มค่าและไม่ได้ตระหนักถึงมัน
BoltzmannBrain

20
หากคุณไม่ชอบการพิมพ์มากคุณอาจไม่ควรเขียนโปรแกรมใน Java
Adam Pierce

คำตอบ:


548

Integer.toStringIntegerเรียกวิธีการแบบคงที่ในชั้นเรียน Integerมันไม่จำเป็นต้องตัวอย่างของ

หากคุณโทรหาnew Integer(i)คุณสร้างตัวอย่างของประเภทIntegerซึ่งเป็นวัตถุ Java เต็ม encapsulating ค่าของ int ของคุณ จากนั้นคุณเรียกใช้toStringวิธีการที่มันจะถามว่ามันจะกลับมาเป็นตัวแทนสตริงของตัวเอง

หากสิ่งที่คุณต้องการคือการพิมพ์intคุณจะต้องใช้อันแรกเพราะมันเบาลงเร็วขึ้นและไม่ใช้หน่วยความจำเพิ่มเติม (นอกเหนือจากสตริงที่ส่งคืน)

หากคุณต้องการวัตถุที่เป็นตัวแทนของจำนวนเต็มค่าไปใส่ไว้ในคอลเลกชันสำหรับตัวอย่าง you'd intใช้คนที่สองเพราะมันจะช่วยให้คุณเป็นวัตถุที่เต็มเปี่ยมที่จะทำทุกประเภทของสิ่งที่คุณไม่สามารถทำอะไรกับเปลือย


96

new Integer(i).toString()ก่อนสร้างวัตถุห่อหุ้ม (ซ้ำซ้อน) รอบi(ซึ่งตัวเองอาจเป็นวัตถุห่อหุ้มInteger)

Integer.toString(i) เป็นที่ต้องการเนื่องจากไม่ได้สร้างวัตถุที่ไม่จำเป็น


43

ตัวเลือกอื่นคือString.valueOfวิธีการคงที่

String.valueOf(i)

มันรู้สึกเล็กน้อยที่เหมาะสมกว่าInteger.toString(i)ให้ฉัน เมื่อประเภทของฉันมีการเปลี่ยนแปลงเช่นจากintการdoubleรหัสจะอยู่ที่ถูกต้อง


2
ใช่. เว้นแต่คุณจะต้องใช้ RADIX (ในกรณีนั้นคุณต้องใช้ Integer.toString)
marcolopes

14
  1. new Integer(i).toString();

    คำสั่งนี้จะสร้างวัตถุของจำนวนเต็มแล้วโทรวิธีการtoString(i)ที่จะกลับมาเป็นตัวแทนสตริงของมูลค่าของจำนวนเต็ม

  2. Integer.toString(i);

    มันส่งคืนวัตถุ String แสดงถึง int เฉพาะ (จำนวนเต็ม)แต่นี่toString(int)เป็นstaticวิธีการ

สรุปเป็นกรณีแรกที่ส่งคืนการแทนค่าสตริงวัตถุโดยที่ในกรณีที่สองจะส่งคืนการแทนค่าสตริงของจำนวนเต็ม


13

ฉันขอแนะนำให้ใช้

int integer = 42;
String string = integer + "";

ง่ายและมีประสิทธิภาพ


38
นี่เป็นรูปแบบที่ไม่ดีอย่างแน่นอนเพราะทั้งสองอาศัยส่วนที่ค่อนข้างบอบบางของภาษา Java และมีประสิทธิภาพน้อยกว่า Integer.toString (i) ดูโพสต์นี้ดังนั้น
rickcnagy

สิ่งนี้อาจไม่มีประสิทธิภาพ ฉันแนะนำให้ใช้ตัวเลือกทั่วไปบางอย่างเช่น Integer.toString หรือ String.valueOf ตรวจสอบที่นี่javadevnotes.com/java-integer-to-string-examples
JavaDev

โดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะทำสิ่งต่าง ๆ ในลักษณะที่ไม่เข้าใจง่าย ตัวเลือกที่ชัดเจนยิ่งขึ้นเช่นInteger.toString()อาจใช้การกดแป้นพิเศษบางอย่าง แต่ก็ชัดเจนกว่าซึ่งสำคัญมากเมื่อคุณต้องการรักษารหัสไว้
Calvin Li

นี่จะไม่เรียกtoString()เมธอดของจำนวนเต็มโดยอัตโนมัติหรือไม่
Ankit Deshpande

11

แม้ว่าฉันจะชอบคำแนะนำของ fhucho

String.valueOf(i)

ประชดคือวิธีการนี้เรียกจริง

Integer.toString(i)

ดังนั้นการใช้งานString.valueOf(i)ถ้าคุณชอบวิธีการที่จะอ่านและคุณไม่จำเป็นต้อง Radix Integer.toString(i)แต่ยังไม่รู้ว่ามันมีประสิทธิภาพน้อยกว่า


4

ในแง่ของการวัดประสิทธิภาพหากคุณกำลังพิจารณาประสิทธิภาพของเวลาดังนั้นInteger.toString (i); แพงถ้าคุณโทรน้อยกว่า 100 ล้านครั้ง มิฉะนั้นจะเป็นการโทรมากกว่า 100 ล้านครั้งดังนั้นInteger (10) .toString () ใหม่จะทำงานได้ดีขึ้น

ด้านล่างเป็นรหัสผ่านคุณสามารถลองวัดประสิทธิภาพได้

public static void main(String args[]) {
            int MAX_ITERATION = 10000000;
        long starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s = Integer.toString(10);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("diff1: " + (endtime-starttime));

        starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s1 = new Integer(10).toString();
        }
        endtime = System.currentTimeMillis();
        System.out.println("diff2: " + (endtime-starttime));
    }

ในแง่ของความจำ

ใหม่จำนวนเต็ม (i) .toString ();

จะใช้หน่วยความจำมากขึ้นเนื่องจากจะสร้างวัตถุในแต่ละครั้งดังนั้นการกระจายตัวของหน่วยความจำจะเกิดขึ้น


2
ฉันวางรหัสนี้ใน IntelliJ IDEA และได้รับคำเตือน: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt

รหัสนี้ใช้ได้สำหรับฉัน ฉันได้รับประมาณ 420 มิลลิวินาทีสำหรับ Integer.toString (10) และ 525 มิลลิวินาทีสำหรับ Integer ใหม่ (10) .toString ()
Jake Stevens-Haas


จะช่วยให้อุ่นเครื่องก่อนมิฉะนั้นผลลัพธ์จะไม่ถูกต้อง!
sixones

หากคุณพูดว่ากรณีหนึ่งมีราคาแพงในกรณีหนึ่งและอีกกรณีหนึ่งจะดีกว่าในอีกกรณีนั่นหมายความว่าอีกกรณีหนึ่งนั้นจะดีกว่า / ไม่แพงในทุกสถานการณ์
Sgene9

2

ที่ดีกว่า:

Integer.valueOf(i).toString()

9
ทำไมสิ่งนี้ถึงดีกว่า
Emile

1
ฉันคิดว่านี่จะดีกว่าเพราะ @Dhiraj ชี้ให้เห็นว่าในแง่ของหน่วยความจำ "new Integer (i) .toString ();" จะใช้หน่วยความจำมากขึ้นเพราะจะสร้างวัตถุใหม่แทนที่จะได้รับค่าจำนวนเต็มและแปลงเป็นสตริง
Patricia

4
@Lucy Integer.valueOf (i) ส่งคืน Integer ใหม่ดังนั้นจึงไม่มีความแตกต่าง
inigoD

คุณไม่ได้ให้คำตอบสำหรับคำถามเลย คำถามคือความแตกต่างระหว่าง blah และ blah ไม่ใช่สิ่งที่ดีกว่าสำหรับ blah
ahitt6345

2

วิธีง่าย ๆ เพียงแค่เชื่อมต่อ""กับจำนวนเต็ม:

int i = 100;

String s = "" + i;

ตอนนี้sจะมี100ค่าสตริง


1

นี่ Integer.toStringเรียกวิธีการคงที่ในชั้นเรียนจำนวนเต็ม มันไม่ต้องการวัตถุที่จะโทร

หากคุณโทรหาnew Integer(i)คุณให้สร้างอินสแตนซ์ของ Type Integer ก่อนซึ่งเป็นออบเจ็กต์ Java แบบเต็มซึ่งห่อหุ้มคุณค่าของ int i ของคุณ จากนั้นคุณเรียกใช้toStringเมธอดนี้เพื่อขอให้ส่งคืนการแทนค่าสตริงของตัวเอง


0

1Integer.toString(i)

Integer i = new Integer(8);
    // returns a string representation of the specified integer with radix 8
 String retval = i.toString(516, 8);
System.out.println("Value = " + retval);

2new Integer(i).toString()

 int i = 506;

String str = new Integer(i).toString();
System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.