Java int to String - Integer.toString (i) vs new Integer (i) .toString ()


428

Đôi khi java đánh đố tôi.
Tôi có một số lượng lớn các khởi tạo int để thực hiện.

Sự khác biệt thực sự là gì?

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

20
Tôi sẽ chỉ sử dụng "" + 42, nhưng hey, đó là tôi. Mẫu số 2 sẽ dẫn đến một đối tượng số nguyên mới (đối với hầu hết các giá trị của i) làm trung gian. Nó cũng gõ nhiều hơn.

16
@pst: nếu đối tượng trung gian là một vấn đề đối với bạn, thì "" + 42không có gì tốt hơn, vì nó yêu cầu một trung gian StringBuildernặng hơn khá nhiều so với Integer.
Joachim Sauer

47
"" + 42 có thể hoạt động, nhưng là một ý tưởng tồi. Những người như tôi sẽ đến xem mã của bạn và cố gắng tìm hiểu xem cái quái gì đã xảy ra với chuỗi rỗng.
Mainguy

3
Tôi không khuyến nghị "" + 42vì trong trường hợp nối thêm các số nguyên, bạn có thể sẽ thêm các giá trị và không nhận ra nó.
BoltzmannBrain

20
Nếu bạn không thích gõ nhiều, thì có lẽ bạn không nên lập trình bằng Java.
Adam Pierce

Câu trả lời:


548

Integer.toStringgọi phương thức tĩnh trong lớp Integer. Nó không cần một ví dụ Integer.

Nếu bạn gọi new Integer(i)bạn tạo một thể hiện của kiểu Integer, đó là một đối tượng Java đầy đủ gói gọn giá trị của int của bạn. Sau đó, bạn gọi toStringphương thức trên nó để yêu cầu nó trả về một chuỗi đại diện của chính nó .

Nếu tất cả những gì bạn muốn là in một cái int, bạn sẽ sử dụng cái đầu tiên vì nó nhẹ hơn, nhanh hơn và không sử dụng thêm bộ nhớ (ngoài chuỗi được trả về).

Nếu bạn muốn một đối tượng đại diện cho một giá trị số nguyên, hãy đặt nó vào trong một bộ sưu tập, ví dụ, bạn sử dụng đối tượng thứ hai, vì nó cung cấp cho bạn một đối tượng chính thức để thực hiện tất cả những việc mà bạn không thể làm với trần int.


96

new Integer(i).toString()đầu tiên tạo một đối tượng trình bao (dự phòng) xung quanh i(chính nó có thể là một đối tượng trình bao bọc Integer).

Integer.toString(i) được ưa thích vì nó không tạo ra bất kỳ đối tượng không cần thiết.


43

Một lựa chọn khác là String.valueOfphương thức tĩnh .

String.valueOf(i)

cảm thấy hơi đúng hơn so Integer.toString(i)với tôi. Khi loại i thay đổi, ví dụ từ intđến double, mã sẽ giữ nguyên.


2
Đúng. Trừ khi bạn phải sử dụng RADIX (trong trường hợp đó, bạn phải sử dụng Integer.toString)
marcolopes

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

    Câu lệnh này tạo đối tượng của Integer và sau đó gọi các phương thức của nó toString(i)để trả về biểu diễn String của giá trị Integer .

  2. Integer.toString(i);

    trả về đối tượng String đại diện cho int (số nguyên) cụ thể , nhưng đây toString(int)là một staticphương thức.

Tóm tắt là trong trường hợp đầu tiên, nó trả về biểu diễn chuỗi đối tượng, trong trường hợp thứ hai, nó trả về biểu diễn chuỗi của số nguyên.


13

Tôi cũng khuyên bạn nên sử dụng

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

Đơn giản và hiệu quả.


38
đây chắc chắn là hình thức xấu, bởi vì cả hai đều dựa vào một phần khá tinh tế của ngôn ngữ Java và kém hiệu quả hơn Integer.toString (i). Xem bài đăng SO này
rickcnagy

Điều này có thể không hiệu quả. Tôi đề nghị sử dụng một số lựa chọn thông thường như Integer.toString hoặc String.valueOf. Kiểm tra tại đây javadevnotes.com/java-integer-to-opes-examples
JavaDev 15/2/2015

Nói chung, đó là một ý tưởng tồi để làm mọi thứ theo cách không trực quan như vậy. Các lựa chọn rõ ràng hơn như Integer.toString()có thể sử dụng một số tổ hợp phím bổ sung, nhưng rõ ràng hơn nhiều, điều này rất quan trọng khi bạn muốn duy trì mã.
Calvin Li

Điều này sẽ không tự động gọi toString()phương thức của số nguyên ?
Ankit Deshpande

11

Mặc dù tôi thích đề xuất của fhucho về

String.valueOf(i)

Điều trớ trêu là phương pháp này thực sự gọi

Integer.toString(i)

Vì vậy, sử dụng String.valueOf(i)nếu bạn thích cách đọc và bạn không cần cơ số, nhưng cũng biết rằng nó kém hiệu quả hơn Integer.toString(i).


4

Về mặt đo lường hiệu suất, nếu bạn đang xem xét hiệu suất thời gian thì Integer.toString (i); là đắt nếu bạn gọi dưới 100 triệu lần. Khác nếu có hơn 100 triệu cuộc gọi thì Integer mới (10) .toString () sẽ hoạt động tốt hơn.

Dưới đây là mã thông qua bạn có thể thử đo hiệu suất,

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));
    }

Về bộ nhớ,

số nguyên mới (i) .toString ();

sẽ chiếm nhiều bộ nhớ hơn vì nó sẽ tạo ra đối tượng mỗi lần, do đó sự phân mảnh bộ nhớ sẽ xảy ra.


2
Tôi đã dán mã này trong IntelliJ IDEA và nhận được cảnh báo: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt

Mã này làm việc cho tôi. Tôi nhận được khoảng 420 mili giây cho Integer.toString (10) và 525 mili giây cho Integer mới (10) .toString ()
Jake Stevens-Haas


Sẽ giúp làm nóng đầu tiên, nếu không kết quả không hợp lệ!
Sixones

Nếu bạn nói cái này đắt trong trường hợp kia, và cái kia tốt hơn trong trường hợp kia, điều đó có nghĩa là cái kia tốt hơn / rẻ hơn trong mọi tình huống.
Sgene9

2

Tốt hơn:

Integer.valueOf(i).toString()

9
Tại sao điều này tốt hơn?
Emile

1
Tôi nghĩ điều này tốt hơn, vì như @Dhiraj đã chỉ ra rằng về mặt bộ nhớ, "Integer mới (i) .toString ();" sẽ chiếm nhiều bộ nhớ hơn vì nó tạo ra một đối tượng mới thay vì chỉ lấy giá trị Integer và chuyển đổi nó thành một chuỗi.
Patricia

4
@Lucy Integer.valueOf (i) trả về một Số nguyên mới, vì vậy không có sự khác biệt
inigoD

Bạn hoàn toàn không cung cấp câu trả lời cho câu hỏi. Câu hỏi là sự khác biệt giữa blah và blah, không phải là sự thay thế tốt hơn cho blah.
ahitt6345

2

Cách đơn giản chỉ là nối ""với số nguyên:

int i = 100;

String s = "" + i;

bây giờ ssẽ có 100giá trị chuỗi.


1

Ở đây Integer.toStringgọi phương thức tĩnh trong lớp Integer. Nó không yêu cầu đối tượng để gọi.

Nếu bạn gọi new Integer(i)bạn trước tiên hãy tạo một thể hiện của kiểu Integer, đó là một đối tượng Java đầy đủ gói gọn giá trị của int i của bạn. Sau đó, bạn gọi toStringphương thức trên nó để yêu cầu nó trả về một chuỗi đại diện của chính nó.


0

1.Integer.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);

2.new 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.