0

[Java] ລັກສະນະ ແລະ ການເຮັດວຽກຂອງ Array ໃນ Memory

ສະບາຍດີ, ທຸກໆຄົນທີ່ຂຽນໂປແກມຕ້ອງເຄີຍໃຊ້ Array ເກັບຂໍ້ມູນແມ່ນບໍ່ ແຕ່ມີໃຜແດ່ເຂົ້າໃຈວ່າມັນເຮັດວຽກແນວໃດ? ຮູ້ຈັກ concept ຂອງມັນ, ຮູ້ວ່າມັນຖືກຈັດເກັບແນວໃດໃນ Memory ແລະ ຫຼັກການການເອີ້ນໃຊ້ມັນແມ່ນແບບໃດ.
ມື້ນີ້! ແອັດມິນເລີຍຖືໂອກາດມາອະທິບາຍກ່ຽວກັບ Array ມັນມີລັກສະນະ ແລະ ການເຮັດວຽກແນວໃດ ເມື່ອມັນຢູ່ໃນ Memory ຫຼື ໜ່ວຍຄວາມຈຳ ເນາະ.

(ໂດຍໃນບົດຄວາມນີ້ແອັດມິນຈະໃຊ້ພາສາ Java ໃນການ implement ເນາະ)

Array ໃນພາສາ Java ນັ້ນຈະເກັບຂໍ້ມູນ 1 ໃນ 2 ຊະນິດນີ້ ກໍ່ຄື primitive values (int, char, …) ກັບ references ( pointers ທີ່ຢູ່ຂອງ Object ).

ເມື່ອ object ຖືກສ້າງຂຶ້ນມາດ້ວຍຄຳສັ່ງ “new”,  ພື້ນທີ່ຈັດເກັບຈະຖືກຈັດສັນຢູ່ໃນ Heap ແລະ return reference(ຕຳແໜ່ງ) ກັບມາໃຫ້. ເຊິ່ງມັນກໍ່ເຊັ່ນດຽວກັບ Array ເພາະ Array ກໍ່ເປັນ object ປະເພດໜຶ່ງເຊັ່ນດຽວກັນ.

  1. Array 1 ມິຕິ (Single-dimension Array).

    int arr[] = new int[3];

    int arr[] ແມ່ນໂຕອ້າງອີງ(reference) ໄປຫາ Array ທີ່ເກັບ 3 ຄ່າ integer. ຖ້າທ່ານສ້າງ array ທີ່ເກັບຄ່າ integer 10 ຄ່າ, ມັນກໍ່ເຮັດວຽກຄືກັນກໍ່ຄື array ຈະຖືກຈັດສັນໃນ Memory ແລ້ວສົ່ງຕຳແໜ່ງຂອງມັນກັບມາໃຫ້ ເກັບໄວ້ໃນໂຕປ່ຽນ.

  2.  Array 2 – ຫຼາຍ ມິຕິ (Multi-dimension Array).

    ແລ້ວ Array 2 ຫຼື ຫຼາຍມິຕິເດ? ຄວາມຈິງຄື, ເຮົາສາມາດມີໄດ້ພຽງ Array ມິຕິດຽວໃນ Java. Array ຫຼາຍມິຕິເປັນພຽງ Array ຂອງ Array ເທົ່ານັ້ນເອງ.

    int[ ][ ] arr = new int[3][ ];
    arr[0] = new int[3];
    arr[1] = new int[5];
    arr[2] = new int[4];

  3. ພວກມັນຖືກເກັບໄວ້ຢູ່ໃນຂອງ Memory?

    Arrays ກໍ່ເປັນ Object ຊະນິດໜຶ່ງໃນ Java, ສະນັ້ນການຈັດເກັບ,ເຮັດວຽກທຸກຢ່າງຂອງ Array ຈະຄືກັບ object ອື່ນໆທຸກປະການ.

    ດັ່ງທີ່ພວກເຮົາຮູ້ວ່າ JVM runtime data areas ປະກອບມີ heap, JVM stack, ແລະ ອື່ນໆ. ຈາກຕົວຢ່າງທາງລຸ່ມນີ້, ເຮົາມາສັງເກດເບິ່ງວ່າ array ແລະ reference ຂອງມັນຖືກຈັດເກັບໄວ້ຢູ່ໃສ.

    class A {
    	int x;
    	int y;
    }
     
    ...
     
    public void m1() {
    	int i = 0;
    	m2();
    }
     
    public void m2() {
    	A a = new A();
    }
     
    ...

    ຈາກຕົວຢ່າງທາງເທິງ, ເຮົາມາເບິ່ງວ່າເມື່ອ m1() ເລີ່ມເຮັດວຽກຈະເກີດຫຍັງຂຶ້ນ:

    1. ເມື່ອ m1 ເລີ່ມເຮັດວຽກ, frame ໃໝ່ (Frame-1) ຈະຖືກເພີ່ມ(push) ເຂົ້າໄປໃນ stack, ແລະ local variable(ຕົວປ່ຽນລູກທີ່ຢູ່ໃນ function) i ກໍ່ຖືກສ້າງຂຶ້ນໃນ Frame-1.

    2. ຫຼັງຈາກນັ້ນເມື່ອ m2 ເລີ່ມເຮັດວຽກໃນ m1, frame ອັນໃໝ່ (Frame-2) ກໍ່ຖືກ push ເຂົ້າໄປໃນ stack. ໃນ m2, object ຂອງ class A ຖືກສ້າງຂຶ້ນໃນ heap ແລະ ຕົວປ່ຽນທີ່ເກັບ reference(ຕຳແໜ່ງຂອງ object) ກໍ່ຖືກເກັບໄວ້ໃນ Frame-2 ເຫັນວ່າ Frame-2 ເກັບ a ແມ່ນບໍນັ້ນລ່ະ a ຈະເກັບຕຳແໜ່ງຂອງ object ທີ່ຫາກໍ່ສ້າງຂຶ້ນ. ບາດນີ້! ເຮົາມາເບິ່ງວ່າ stack ແລະ heap ຈະເປັນແນວໃດຈາກຮູບທາງລຸ່ມນີ້ເລີຍ.

    ref: http://www.programcreek.com/2013/04/what-does-a-java-array-look-like-in-memory/

Frankkung

Frankkung

FULLSTACK DEVELOPER - PENETRATION TESTER