2010-08-06 31 views
102

Vì vậy, tôi tuyên bố và khởi tạo một mảng int:Khởi tạo mặc định của một mảng trong Java là gì?

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

... 0 sẽ in tiêu chuẩn ra. 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); 

... true sẽ in thành tiêu chuẩn. Vì vậy, làm thế nào là Java khởi tạo mảng của tôi theo mặc định? Có an toàn để giả định rằng khởi tạo mặc định là thiết lập các chỉ mục mảng thành 0, điều đó có nghĩa là tôi không phải lặp qua mảng và khởi tạo nó không?

Cảm ơn.

+3

Chỉ cần đọc tài liệu;) http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 – Benj

Trả lời

215

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

  • Để tham chiếu (mọi thứ chứa đối tượng) là null.
  • Đối với int/short/byte/long là 0.
  • Đối với nổi/đôi là 0.0
  • Đối với các phép toán là false.
  • Đối với char có ký tự null '\u0000' (có số thập phân tương đương là 0).

Khi bạn tạo một mảng nội dung nào đó, tất cả các mục nhập cũng được đánh số không. Vì vậy, mảng của bạn có năm số không ngay sau khi nó được tạo bởi new. Lưu ý (dựa trên ý kiến): Máy ảo Java không yêu cầu không có bộ nhớ cơ bản khi phân bổ biến cục bộ (điều này cho phép 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 khởi tạo.

+0

Nhận xét không để thảo luận mở rộng; cuộc hội thoại này đã được [chuyển sang trò chuyện] (http://chat.stackoverflow.com/rooms/158333/discussion-on-answer-by-thorbjorn-ravn-andersen-what-is-the-default-initializati). –

48

Từ Java Language Specification:

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

    • Đối với byte loại, giá trị mặc định bằng 0, nghĩa là giá trị của (byte)0.
    • Đối với loại ngắn, giá trị mặc định bằng 0, nghĩa là giá trị của (short)0.
    • Đối với loại int, giá trị mặc định bằng 0, nghĩa là, 0.
    • Đối với loại dài, giá trị mặc định bằng 0, nghĩa là, 0L.
    • Đối với loại phao, giá trị mặc định là số không dương, nghĩa là, 0.0f.
    • Đối với loại gấp đôi, giá trị mặc định là số không dương, nghĩa là, 0.0d.
    • Đối với loại char, giá trị mặc định là ký tự rỗng, nghĩa là, '\u0000'.
    • Đối với loại 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

Và những gì về mảng của Long s và Integer s? –

+1

@GeorgyDobrev. Đó là các loại tham chiếu. Chúng sẽ là null theo đặc tả ở trên. –

+0

Điều gì về một mảng String? – Zac

16

JLS nói rõ

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

và điều này không phụ thuộc vào việc mảng có phải là một biến mẫu hay biến cục bộ hay biến lớp.

giá trị mặc định cho các kiểu dữ liệu: docs

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

+1

Không trả lời câu hỏi. Anh ta hỏi về khởi tạo mặc định. – EJP

2

Theo java,

Data Type - Giá trị mặc định

byte - 0

ngắn - 0

int - 0

dài - 0l

phao - 0.0f

đôi - 0.0d

char - '\ u0000'

String (hoặc bất kỳ đối tượng) - rỗng

boolean - sai

+2

Anh ấy không hỏi về các trường, anh ta hỏi về các thành phần mảng. – EJP

+2

@EJP u có thể vui lòng xây dựng những gì có nghĩa là thành phần mảng ???? nói chung mảng có một số loại dữ liệu (cùng loại) được khởi tạo như trên để u có thể cho tôi biết, có nghĩa là thành phần ??? –

2

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 phương thức size() trả về số phần tử được chèn trong mảng và kể từ thời điểm khởi tạo, nếu bạn chưa chèn bất kỳ phần tử nào vào 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

Mỗi lớp trong Java có hàm tạo (hàm tạo là phương thức được khởi tạo khi các biến lớp) khởi tạo 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 khởi tạo đượ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 kiểu mảng nguyên, tất cả các giá trị trong mảng được khởi tạo bằng 0 (0) trong phương thức hàm tạo. Tương tự đối tượng mảng boolean, tất cả các giá trị được khởi tạo thành false.

Vì vậy, Java được khởi tạo mảng bằng cách chạy nó là phương pháp xây dựng trong khi tạo ra các đối tượng

2

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

Trích dẫn từ spec 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 nó được tạo ra"

Tôi nghĩ rằng cho dù mảng là địa phương hoặc dụ hoặc lớp biến nó sẽ có giá trị mặc định

Các vấn đề liên quan