Khởi tạo mặc định của một mảng trong Java là gì?


144

Vì vậy, tôi đang khai báo và khởi tạo một mảng int:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

Nói rằng tôi làm điều này thay vì ...

int[] arr = new int[5];
System.out.println(arr[0]);

... 0sẽ in ra theo tiêu chuẩn. Ngoài ra, nếu tôi làm điều này:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... truesẽ in ra theo tiêu chuẩn. Vậy mặc định Java khởi tạo mảng của tôi như thế nào? Có an toàn không khi cho rằng việc khởi tạo mặc định đang đặt các chỉ số mảng 0có nghĩa là tôi không phải lặp qua mảng và khởi tạo nó?

Cảm ơn.


Câu trả lời:


281

Mọi thứ trong một chương trình Java không được lập trình viên đặt thành một cái gì đó rõ ràng, được khởi tạo thành một giá trị bằng không.

  • Đối với tài liệu tham khảo (bất cứ điều gì giữ một đối tượng) đó là null.
  • Đối với int / short / byte / long đó là a 0.
  • Đối với float / double đó là một 0.0
  • Đối với booleans đó là a false.
  • Đối với char đó là ký tự null '\u0000'(có số thập phân tương đương bằng 0).

Khi bạn tạo một mảng của một cái gì đó, tất cả các mục cũng bằng không. Vì vậy, mảng của bạn chứa năm số không ngay sau khi nó được tạo bởinew .

Lưu ý (dựa trên các nhận xét): Máy ảo Java không bắt buộc phải loại bỏ bộ nhớ cơ bản khi phân bổ các biến cục bộ (điều này cho phép các hoạt động ngăn xếp hiệu quả nếu cần) để tránh các giá trị ngẫu nhiên, Đặc tả ngôn ngữ Java yêu cầu khởi tạo các biến cục bộ.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Brad Larson

Tất cả mọi thứ trừ các biến cục bộ, không được khởi tạo thành bất cứ thứ gì, vì trình biên dịch sẽ cho bạn biết.
Hầu tước Lorne

@ user207421 như đã đề cập ở cuối câu trả lời.
Thorbjørn Ravn Andersen

Điều đó có nghĩa là câu đầu tiên trong câu trả lời của bạn không đúng và cần được sửa đổi. Và câu hỏi 'làm sao bạn biết' trong cuộc trò chuyện là vô nghĩa. JLS nói như vậy, đó là nó, và trình biên dịch thực thi nó, ditto.
Hầu tước Lorne

@ user207421 "không được lập trình viên đặt thành một cái gì đó rõ ràng" (có thể được trình biên dịch yêu cầu).
Thorbjørn Ravn Andersen

60

Từ Đặc tả ngôn ngữ Java :

  • Mỗi biến lớp, biến thể hiện hoặc thành phần mảng được khởi tạo với giá trị mặc định khi nó được tạo (§15.9, §15.10):

    • Đối với kiểu byte, giá trị mặc định là 0, nghĩa là giá trị của (byte)0.
    • Đối với loại ngắn, giá trị mặc định là 0, nghĩa là giá trị của (short)0.
    • Đối với kiểu int, giá trị mặc định là 0, nghĩa là 0.
    • Đối với loại dài, giá trị mặc định là 0, nghĩa là 0L.
    • Đối với kiểu float, giá trị mặc định là 0 dương, nghĩa là 0.0f.
    • Đối với kiểu double, giá trị mặc định là 0 dương, nghĩa là 0.0d.
    • Đối với kiểu char, giá trị mặc định là ký tự null, nghĩa là '\u0000'.
    • Đối với kiểu boolean, giá trị mặc định là false.
    • Đối với tất cả các loại tham chiếu (§4.3), giá trị mặc định là null.

2
Còn các mảng của Long và Integer thì sao?
Georgy Dobrev

1
@GeorgyDobrev. Đó là những kiểu tham khảo. Họ sẽ là null theo các đặc điểm kỹ thuật ở trên.
Dave Costa

Một mảng String thì sao?
Zac

1
@Zac giống như trên, Chuỗi là một đối tượng, vì vậy giá trị mặc định trong mảng sẽ là null.
Dave Costa

18

JLS nói rõ ràng

Một trình khởi tạo mảng tạo ra một mảng và cung cấp các giá trị ban đầu cho tất cả các thành phần của nó.

và điều này không liên quan đến việc mảng là biến thể hiện hay biến cục bộ hay biến lớp.

Giá trị mặc định cho các kiểu nguyên thủy: docs

Đối với các giá trị mặc định là null.


1
Không trả lời câu hỏi. Ông đang hỏi về khởi tạo mặc định.
Hầu tước Lorne

3

Theo java,

Kiểu dữ liệu - Giá trị mặc định

byte - 0

ngắn - 0

int - 0

dài - 0L

phao - 0,0f

gấp đôi - 0,0đ

char - '\ u0000'

Chuỗi (hoặc bất kỳ đối tượng nào) - null

boolean - sai


2
Anh ấy không hỏi về các lĩnh vực, anh ấy hỏi về các thành phần mảng.
Hầu tước Lorne

3
@EJP bạn có thể vui lòng giải thích ý nghĩa của thành phần mảng không ???? Nói chung mảng có một số kiểu dữ liệu (cùng loại) được khởi tạo như trên vì vậy bạn có thể cho tôi biết, ý nghĩa của thành phần ???
Abhishek Singh

3

Thorbjørn Ravn Andersen đã trả lời cho hầu hết các loại dữ liệu. Vì đã có một cuộc thảo luận sôi nổi về mảng

Trích dẫn từ thông số jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "thành phần mảng được khởi tạo với giá trị mặc định khi được tạo"

Tôi nghĩ bất kể mảng là cục bộ hay biến thể hay biến lớp, nó sẽ có giá trị mặc định


2

Mỗi lớp trong Java có một hàm tạo (hàm tạo là một phương thức được gọi khi một đối tượng mới được tạo, nó khởi tạo các trường của các biến lớp). Vì vậy, khi bạn đang tạo một thể hiện của lớp, phương thức constructor được gọi trong khi tạo đối tượng và tất cả các giá trị dữ liệu được khởi tạo tại thời điểm đó.

Đối với đối tượng của kiểu mảng số nguyên, tất cả các giá trị trong mảng được khởi tạo thành 0 (không) trong phương thức constructor. Tương tự như vậy đối với mảng boolean, tất cả các giá trị được khởi tạo thành false.

Vì vậy, Java đang khởi tạo mảng bằng cách chạy phương thức constructor của nó trong khi tạo đối tượng


1

Java nói rằng độ dài mặc định của một mảng JAVA tại thời điểm khởi tạo sẽ là 10.

private static final int DEFAULT_CAPACITY = 10;

Nhưng size()phương thức trả về số lượng phần tử được chèn trong mảng và vì tại thời điểm khởi tạo, nếu bạn chưa chèn bất kỳ phần tử nào trong mảng, nó sẽ trả về 0.

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}

2
Điều này trông giống như ArrayList, không phải là một mảng.
Thorbjørn Ravn Andersen
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.