Tăng giá trị int của Integer?


81

Làm cách nào để tăng giá trị của Số nguyên trong Java? Tôi biết tôi có thể nhận giá trị bằng intValue và tôi có thể đặt nó bằng Số nguyên mới (int i).

playerID.intValue()++;

dường như không hoạt động.

Lưu ý: PlayerID là một Số nguyên đã được tạo bằng:

Integer playerID = new Integer(1);

7
Tại sao bạn sử dụng số nguyên thay vì số nguyên?
amara

5
@naiad Đối với tôi, thường là do bạn không thể sử dụng các kiểu nguyên thủy làm đối số chung trong Java.
Steve Blackwell

Câu trả lời:


100

Integercác đối tượng là bất biến, vì vậy bạn không thể sửa đổi giá trị khi chúng đã được tạo. Bạn sẽ cần tạo một cái mới Integervà thay thế cái hiện có.

playerID = new Integer(playerID.intValue() + 1);

4
Nếu bạn phải sử dụng int không phải nguyên thủy và bạn muốn có thể thay đổi, bạn có thể thử dùng commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
Joel

cảm ơn, nhưng vì một số lý do nó vẫn không tăng lên. Có thể đó là lỗi trong mã của tôi ...
William

1
@William: Như tôi biết, nó sẽ chỉ được tăng lên trong phương thức tăng dần nó.
Stan Kurilin

13
Không sử dụng hàm tạo của Integer.
ColinD

2
@Grodriguez: Có lẽ, ngay cả khi tôi đề nghị Integer.valueOf(int)... Tôi không thích ý tưởng sử dụng các phương pháp sai trong câu trả lời, nó có thể dẫn đến việc mọi người nghĩ rằng họ có thể làm. Tôi cũng nghĩ rằng nó rất hữu ích cho các OP để nhận ra rằng ông có thể sử dụng các hoạt động, ông muốn sử dụng với một intvới một Integertrong các cách tương tự.
ColinD

49

Như Grodriguez nói, Integercác đối tượng là bất biến. Vấn đề ở đây là bạn đang cố gắng tăng intgiá trị của ID người chơi thay vì chính ID đó. Trong Java 5+, bạn chỉ có thể viết playerID++.

Lưu ý thêm, đừng bao giờ gọi hàm tạo Integercủa. Tận dụng tính năng tự động đóng hộp bằng cách chỉ định trực tiếp s intcho Integers, chẳng hạn như Integer foo = 5. Điều này sẽ sử dụng Integer.valueOf(int)trong suốt, điều này tốt hơn so với hàm tạo vì nó không phải lúc nào cũng phải tạo một đối tượng mới.


13

Java 7 và 8. Tăng dần KHÔNG thay đổi tham chiếu, vì vậy nó tham chiếu đến một đối tượng Integer khác. Nhìn:

@Test
public void incInteger()
{
    Integer i = 5;
    Integer iOrig = i;
    ++i; // Same as i = i + 1;
    Assert.assertEquals(6, i.intValue());
    Assert.assertNotEquals(iOrig, i);
}

Số nguyên tự nó vẫn là bất biến.


Đây là câu trả lời tốt nhất cho IMHO vì nó thể hiện ++ihàm (trên biến i; lưu ý rằng bạn cũng có thể viết i++) và Integertính bất biến của lớp (trên biến iOrig). Hầu hết các câu trả lời khác chỉ chứng minh một trong hai khái niệm.
Julien Kronegg

13

AtomicInteger

Có lẽ điều này cũng đáng giá: có một lớp Java được gọi AtomicInteger.

Lớp này có một số phương thức hữu ích như addAndGet(int delta)hoặc incrementAndGet()(và các đối tác của chúng) cho phép bạn tăng / giảm giá trị của cùng một trường hợp. Mặc dù lớp được thiết kế để sử dụng trong bối cảnh đồng thời , nó cũng khá hữu ích trong các trường hợp khác và có thể phù hợp với nhu cầu của bạn.

final AtomicInteger count = new AtomicInteger( 0 ) ;
…
count.incrementAndGet();  // Ignoring the return value. 

7

Các đối tượng số nguyên là bất biến. Bạn không thể thay đổi giá trị của số nguyên do chính đối tượng nắm giữ, nhưng bạn chỉ có thể tạo một đối tượng Integer mới để giữ kết quả:

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;

6

Đối với Java 7, toán tử tăng '++' hoạt động trên Số nguyên. Dưới đây là một ví dụ đã thử nghiệm

    Integer i = new Integer( 12 );
    System.out.println(i); //12
    i = i++;
    System.out.println(i); //13

2
Nhưng lưu ý rằng tài liệu tham khảo khác để i = new Integer(12)vẫn sẽ tham khảo 12, không 13... dễ dàng để vấp lên trên này
vikingsteve

1
vâng thats tại sao bạn phải gán giá trị cho các đối tượng số nguyên: i = i ++
samsamara

2
i = i++không giống như i++. Về mặt kỹ thuật, ++nó không thực sự hoạt động trên các số nguyên vì bạn không thể sử dụng nó một mình mà không gán kết quả cho một cái gì đó.
Simon Forsberg

1
bạn không cần phải chỉ định lại! nhìn: Số nguyên foo = 5; Thanh số nguyên = foo; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); kết quả đầu ra: foo: 6 bar: 5
clemep

4

Có thể bạn có thể thử:

final AtomicInteger i = new AtomicInteger(0);
i.set(1);
i.get();

3

Bạn có thể sử dụng IntHolder làm thay thế có thể thay đổi cho Số nguyên. Nhưng nó có giá trị không?


1

Tất cả các đối tượng bao bọc nguyên thủy là bất biến.

Tôi có thể trễ câu hỏi nhưng tôi muốn nói thêm và làm rõ rằng khi bạn làm vậy playerID++, điều thực sự xảy ra là như thế này:

playerID = Integer.valueOf( playerID.intValue() + 1);

Integer.valueOf (int) sẽ luôn lưu vào bộ nhớ cache các giá trị trong phạm vi -128 đến 127, bao gồm và có thể lưu vào bộ nhớ cache các giá trị khác ngoài phạm vi này.


1
playerID = Integer.valueOf (playerID.intValue () + 1); Một đối tượng Integer mới không phải lúc nào cũng được tạo. Thông số kỹ thuật tự động đóng hộp : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 đóng hộp Nếu giá trị p được đóng hộp là true, false, byte hoặc char trong dải ô \ u0000 đến \ u007f hoặc một số int hoặc số ngắn trong khoảng -128 đến 127 (bao gồm cả), sau đó đặt r1 và r2 là kết quả của hai chuyển đổi quyền anh bất kỳ của p. Nó luôn luôn là trường hợp r1 == r2. Kể từ Java 7, docs.oracle.com/javase/specs/jls/se7/html/… cũng áp dụng cho toán tử ++
gary

OK, đã chỉnh sửa câu trả lời. Việc tăng đối tượng Integer playerID++dẫn đến kết quả giống như playerID = Integer.valueOf( playerID.intValue() + 1)và theo tài liệu của phương pháp: Phương thức này sẽ luôn lưu trữ các giá trị trong phạm vi -128 đến 127, bao gồm cả.
Hamza Belmellouki
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.