การเริ่มต้นเริ่มต้นของอาร์เรย์ใน Java คืออะไร?


144

ดังนั้นฉันประกาศและเริ่มต้นอาร์เรย์ int:

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

พูดว่าฉันทำสิ่งนี้แทน ...

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

... 0จะพิมพ์ออกมาเป็นมาตรฐาน นอกจากนี้ถ้าฉันทำสิ่งนี้:

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

... trueจะพิมพ์ออกมาเป็นมาตรฐาน ดังนั้น Java จะเริ่มต้นอาร์เรย์ของฉันเป็นค่าเริ่มต้นได้อย่างไร มีความปลอดภัยหรือไม่ที่จะสมมติว่าการเริ่มต้นเริ่มต้นคือการตั้งค่าดัชนีอาเรย์0ซึ่งหมายความว่าฉันไม่ต้องวนลูปผ่านอาร์เรย์และเริ่มต้นมันได้หรือไม่

ขอบคุณ


6
เพียงอ่านเอกสาร;) docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
Benj

คำตอบ:


281

ทุกอย่างในโปรแกรม Java ไม่ได้ตั้งค่าอย่างชัดเจนโดยโปรแกรมเมอร์จะเริ่มต้นเป็นค่าศูนย์

  • สำหรับการอ้างอิง (อะไรที่เก็บวัตถุ) nullที่เป็น
  • สำหรับ int / สั้น / ไบต์ / 0มานานแล้วว่าเป็น
  • สำหรับ float / double นั่นคือ 0.0
  • สำหรับ booleans falseว่าเป็น
  • สำหรับถ่านนั่นคือตัวละคร null '\u0000'(ซึ่งเทียบเท่าทศนิยมเป็น 0)

เมื่อคุณสร้างอาร์เรย์ของบางอย่างรายการทั้งหมดจะถูกทำให้เป็นศูนย์ ดังนั้นอาร์เรย์ของคุณมีห้าศูนย์ขวาหลังจากที่มันถูกสร้างขึ้นโดยnew

หมายเหตุ (ขึ้นอยู่กับความคิดเห็น): Java Virtual Machine ไม่จำเป็นต้องเป็นศูนย์ออกหน่วยความจำพื้นฐานเมื่อจัดสรรตัวแปรท้องถิ่น (ซึ่งช่วยให้การดำเนินงานสแต็คที่มีประสิทธิภาพหากจำเป็น) เพื่อหลีกเลี่ยงค่าสุ่มที่ Java Language Specification ต้องการตัวแปรท้องถิ่น


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Brad Larson

ทุกอย่างยกเว้นตัวแปรโลคัลซึ่งไม่ได้กำหนดค่าเริ่มต้นเป็นอะไรเลย
มาร์ควิสแห่งลอร์น

@ user207421 ตามที่ระบุไว้ท้ายคำตอบ
Thorbjørn Ravn Andersen

ซึ่งหมายความว่าประโยคแรกของคำตอบของคุณไม่ถูกต้องและควรแก้ไข และคำถาม 'คุณรู้ได้อย่างไร' ในการแชทนั้นไม่มีความหมาย JLS พูดอย่างนั้นแหละและคอมไพเลอร์บังคับใช้เหมือนกัน
มาร์ควิสแห่งลอร์น

@ user207421 "ไม่ได้กำหนดอย่างชัดเจนโดยโปรแกรมเมอร์" (ซึ่งอาจจำเป็นต้องใช้โดยคอมไพเลอร์)
Thorbjørn Ravn Andersen

60

จากข้อกำหนดภาษา Java :

  • ตัวแปรคลาสแต่ละตัว, ตัวแปรอินสแตนซ์หรือองค์ประกอบอาร์เรย์จะเริ่มต้นได้ด้วยค่าเริ่มต้นเมื่อสร้าง (§15.9, §15.10):

    • (byte)0สำหรับประเภทไบต์ค่าเริ่มต้นเป็นศูนย์ที่มีค่าของ
    • (short)0สำหรับประเภทระยะสั้นค่าเริ่มต้นเป็นศูนย์ที่มีค่าของ
    • สำหรับประเภท int ค่าเริ่มต้นเป็นศูนย์, 0ที่อยู่,
    • สำหรับชนิดยาวค่าเริ่มต้นเป็นศูนย์, 0Lที่อยู่,
    • สำหรับประเภทลอยค่าเริ่มต้นเป็นศูนย์บวก, 0.0fที่อยู่,
    • สำหรับประเภทคู่ค่าเริ่มต้นเป็นศูนย์บวก, 0.0dที่อยู่,
    • สำหรับประเภทถ่านค่าเริ่มต้นเป็นตัวละคร null, '\u0000'ที่อยู่,
    • falseสำหรับประเภทบูลค่าเริ่มต้นคือ
    • เหมาะสำหรับทุกสภาพการอ้างอิง (§4.3) nullค่าเริ่มต้นคือ

2
แล้ว Array of Long s และ Integer ล่ะ?
Georgy Dobrev

1
@GeorgyDobrev นี่เป็นประเภทอ้างอิง พวกเขาจะเป็นโมฆะตามข้อกำหนดข้างต้น
Dave Costa

สิ่งที่เกี่ยวกับอาร์เรย์สตริง
Zac

1
@Zac nullเดียวกับข้างต้นสตริงเป็นวัตถุดังนั้นค่าเริ่มต้นในอาร์เรย์จะเป็น
Dave Costa

18

JLSพูดอย่างชัดเจน

array initializer สร้างอาร์เรย์และให้ค่าเริ่มต้นสำหรับส่วนประกอบทั้งหมด

และสิ่งนี้ไม่คำนึงว่าอาร์เรย์เป็นตัวแปรอินสแตนซ์หรือตัวแปรโลคัลหรือตัวแปรคลาส

ค่าเริ่มต้นสำหรับประเภทดั้งเดิม: เอกสาร

nullสำหรับค่าวัตถุเริ่มต้นคือ


1
ไม่ตอบคำถาม เขากำลังถามเกี่ยวกับการเริ่มต้นเริ่มต้น
มาร์ควิสแห่ง Lorne

3

ตามจาวา

ชนิดข้อมูล - ค่าเริ่มต้น

ไบต์ - 0

สั้น - 0

int - 0

ยาว - 0L

ลอย - 0.0f

สองเท่า - 0.0d

ถ่าน - '\ u0000'

String (หรือวัตถุใด ๆ ) - null

บูลีน - เท็จ


2
เขาไม่ได้ถามเกี่ยวกับเขตข้อมูลเขากำลังถามเกี่ยวกับส่วนประกอบของแถวลำดับ
มาร์ควิสแห่ง Lorne

3
@EJP คุณช่วยกรุณาอธิบายสิ่งที่มีความหมายขององค์ประกอบอาร์เรย์ ???? โดยทั่วไปแล้วอาเรย์จะมีชนิดข้อมูลบางอย่าง (ชนิดเดียวกัน) ซึ่งถูกเตรียมใช้งานตามข้างต้นดังนั้นคุณช่วยบอกหน่อยได้มั้ยว่าส่วนประกอบของ ???
Abhishek Singh เมื่อ

3

Thorbjørn Ravn Andersen ตอบคำถามเกือบทุกประเภท เนื่องจากมีการพูดคุยกันอย่างดุเดือดเกี่ยวกับอาเรย์

การอ้างอิงจากข้อมูลจำเพาะ jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "องค์ประกอบอาร์เรย์จะเริ่มต้นด้วยค่าเริ่มต้นเมื่อสร้าง"

ฉันคิดว่าไม่ว่าอาเรย์จะเป็นแบบโลคอลหรืออินสแตนซ์หรือตัวแปรคลาสที่มันจะมีค่าเริ่มต้น


2

ทุกคลาสใน Java มีคอนสตรัคเตอร์ (คอนสตรัคเตอร์เป็นวิธีการที่เรียกว่าเมื่อมีการสร้างออบเจ็กต์ใหม่ซึ่งจะเริ่มต้นฟิลด์ของตัวแปรคลาส) ดังนั้นเมื่อคุณสร้างอินสแตนซ์ของคลาสเมธอดตัวสร้างจะถูกเรียกในขณะที่สร้างวัตถุและค่าข้อมูลทั้งหมดจะถูกเตรียมใช้งานในเวลานั้น

สำหรับออบเจ็กต์ของอาร์เรย์จำนวนเต็มให้พิมพ์ค่าทั้งหมดในอาเรย์นั้นเป็นค่าเริ่มต้นเป็น 0 (ศูนย์) ในเมธอดตัวสร้าง ในทำนองเดียวกันสำหรับวัตถุของอาร์เรย์บูลีนค่าทั้งหมดจะเริ่มต้นเป็นเท็จ

ดังนั้น Java กำลังเริ่มต้นอาร์เรย์โดยใช้วิธีการสร้างในขณะที่การสร้างวัตถุ


1

Java กล่าวว่าความยาวเริ่มต้นของอาร์เรย์ JAVA ณ เวลาเริ่มต้นจะเท่ากับ 10

private static final int DEFAULT_CAPACITY = 10;

แต่size()วิธีการคืนค่าจำนวนขององค์ประกอบที่แทรกในอาร์เรย์และตั้งแต่เวลาเริ่มต้นถ้าคุณยังไม่ได้ใส่องค์ประกอบใด ๆ ในอาร์เรย์มันจะกลับเป็นศูนย์

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
ดูเหมือนว่า ArrayList ไม่ใช่อาร์เรย์
Thorbjørn Ravn Andersen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.