ทำไมโรงเรียนสอนอาร์เรย์มากกว่ารายการ? [ปิด]


36

งานมอบหมายส่วนใหญ่ในโรงเรียนของฉันสำหรับชั้นเรียนการเขียนโปรแกรมเริ่มต้นนั้นทำให้ฉันต้องใช้อาร์เรย์ ฉันทำงานเต็มเวลาแล้วและฉันไม่เคยใช้อาร์เรย์สำหรับโครงการใด ๆ ที่ฉันได้ทำงานมา แม้แต่ในโครงการที่มีอยู่ฉันก็ไม่เคยเห็นการใช้อาร์เรย์ที่ไหนเลย ในความคิดของฉันรายการใช้งานง่ายกว่าและเป็นมาตรฐาน เหตุใดอาจารย์บอกให้นักเรียนใช้อาร์เรย์ในการบ้าน เป็นเพียงเพื่อให้นักเรียนเข้าใจพื้นฐานหรือไม่

เนื่องจากมหาวิทยาลัยส่วนใหญ่สอน Java คำถามนี้เฉพาะกับ Java


7
อาร์เรย์เป็นพื้นฐานมากกว่า
user253751

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

คำตอบ:


120

เพราะอาร์เรย์สอนแนวคิดเช่นการจัดทำดัชนีและขอบเขตสองแนวคิดที่สำคัญพื้นฐานในการเขียนโปรแกรมคอมพิวเตอร์

รายการไม่ใช่ "มาตรฐาน" มีช่องว่างปัญหาที่หลากหลายซึ่งอาร์เรย์นั้นเหมาะสมอย่างสมบูรณ์แบบ


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

48

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

ด้วยเหตุผลเดียวกันชั้นเรียนการเขียนโปรแกรมแรกของฉันที่วิทยาลัยอยู่ใน C และส่วนที่เหลือของชั้นเรียนทั้งหมดใน C ++, Java และภาษาอื่น ๆ ไม่ใช่ว่า C นั้นดีกว่าหรือง่ายกว่านั่นคือ C (และ Array) ซ่อนอะไรจากคุณ


7
รายการทำงานร่วมกับรหัสจริงได้ง่ายขึ้น แต่อาร์เรย์เข้าใจง่ายกว่า (สมบูรณ์) และสำคัญกว่าที่จะเข้าใจเนื่องจากเป็นพื้นฐานและสากลในขณะที่รายการ (Java's) ไม่ใช่ อย่างน้อยนั่นคือความคิดเห็นของฉัน
Ixrec

21
ได้รับมอบหมายในที่ที่คุณจัดเก็บข้อมูลในอาร์เรย์และเข้าถึงได้ภายหลังคือการกำหนดโครงสร้างข้อมูล คุณอาจไม่ได้ตระหนักถึงมัน คุณต้องถามตัวเองว่าอะไรคือสิ่งที่สร้างวิศวกรที่ดีกว่าทำความเข้าใจโมเดลการคำนวณขั้นพื้นฐานหรือเรียนรู้ห้องสมุดมาตรฐานของภาษา ข้อสรุปทั่วไป (และฉันเห็นด้วย fwiw) คือคุณจะไม่เข้าใจเนื้อหาของห้องสมุดจำนวนมากโดยไม่เข้าใจพื้นฐานของการคำนวณ
Kent A.

12
LinkedList, ArrayList, OrderedList ฯลฯ รายการใดที่คุณควรเรียนรู้ก่อน คุณจะขอบคุณสิ่งที่พวกเขาทำเพื่อคุณถ้าคุณไม่เข้าใจว่าทำไมพวกเขาอยู่ในสถานที่แรก?
Kent A.

10
+1 ถึง @KentAnderson โรงเรียนต้องผลิตวิศวกรที่เข้าใจโครงสร้างข้อมูลในระดับต่ำ เป็นการสร้างวิศวกรที่สามารถใช้โครงสร้างพื้นฐานใน C ได้อย่างง่ายดายโปรแกรมอื่น ๆ เป็นเพียง JavaSchool
Christian Willman

2
"พวกเขาอาจต้องการเริ่มต้นด้วยโครงสร้างข้อมูลที่ถูกต้องที่สุดแสดงถึงการทำงานของคอมพิวเตอร์" - แล้วคอมพิวเตอร์ที่มีหน่วยความจำแบบโครงสร้างหรือวัตถุมีโครงสร้างเป็นอย่างไร "ไม่ใช่ว่า C นั้นดีหรือง่ายกว่านั่นคือ C (และ Array) ซ่อนอะไรจากคุณ" - ยกเว้นว่าคอมพิวเตอร์ของคุณไม่มีพอยน์เตอร์เช่น AS / 400 ที่ C ทำงานใน VM และซ่อนทุกอย่างไว้สำหรับคุณ
Jörg W Mittag

21

คำตอบข้างต้นนั้นยอดเยี่ยม แต่ฉันก็มีคำตอบอื่นอยู่ในใจ main()วิธีการของ Java หมายความว่านักเรียนจะได้พบกับอาร์เรย์พื้นฐานเร็วมากซึ่งมักจะเป็นวันแรกของการเรียน ทำไม?

public static void main(String[] args)

มันเป็นสิ่งแรกที่คุณจะต้องจัดการกับการเขียน Hello World และอื่น ๆ (ฉันเคยเห็นบางหลักสูตรใช้การสอน IDEs เช่น BlueJ ในตอนแรกซึ่งช่วยให้คุณสามารถชี้และคลิกเพื่อเรียกใช้วิธีการตามอำเภอใจ แต่เราจะจัดสรรสิ่งเหล่านั้นไว้ ... ) ในขณะที่มันอาจคุ้มค่าที่จะมอบให้ คำหลักเหล่านี้ซักครูไม่ช้าก็เร็วครูส่วนใหญ่จะต้องการอธิบายพวกเขา อันที่จริงคำถามทดสอบระดับเริ่มต้นแบบคลาสสิกคือให้นักเรียนให้ความหมายของคำหลักแต่ละคำในโปรแกรม Hello World พื้นฐาน และสิ่งที่เราพบว่าเป็นส่วนหนึ่งของลายเซ็นวิธีการหลักของเรา? อาเรย์ (เหตุผลส่วนหนึ่งอยู่ที่ประวัติ ArrayList ไม่มีอยู่ใน Java 1.0) อาร์เรย์เป็นส่วนหนึ่งของชุดความรู้พื้นฐาน รายการไม่ได้

ที่กล่าวว่าไม่ใช่เรื่องแปลกสำหรับคลาสที่จะแนะนำ ArrayList ในภายหลังเล็กน้อยโดยเฉพาะอย่างยิ่งเมื่อวัตถุและการใช้งานของพวกเขาได้รับการคุ้มครอง แม้แต่หลักสูตร AP Computer Science สำหรับ Java ยังรวมถึง ArrayList (ฉันรู้ว่ามันเคยใช้และ Google ดูเหมือนจะระบุว่ามันยังคงทำอยู่) แม้ว่ามันจะไม่สนใจความจริงที่ว่า ArrayList ใช้รายชื่อและส่วนที่เหลือของ Collections Framework

ในที่สุดมันก็เป็นประสบการณ์ของฉันที่โปรแกรม CS ของมหาวิทยาลัยใช้ Java เป็นเครื่องมือในการสำรวจ CS และแนวคิดการเขียนโปรแกรมแทนที่จะสอนให้นักเรียนรู้วิธีที่จะเป็นนักพัฒนา Java ที่ดี บางโปรแกรมอาจเน้นไปที่การสร้างนักพัฒนามืออาชีพในขณะที่บางโปรแกรมเน้นทฤษฎีมากกว่า แต่ในทั้งสองกรณีมีหลายอย่างที่ต้องเรียนรู้เกี่ยวกับวิธีการใช้ Java ในงานมืออาชีพจริง ๆ ที่ไม่ได้รับการสอนในหลักสูตรวิทยาลัยส่วนใหญ่ ช่วงนี้มีตั้งแต่รูปแบบการออกแบบและเทคนิคต่างๆเช่นที่อยู่ในEffective Javaไปจนถึงเฟรมเวิร์กเช่น Spring, Hibernate หรือ JUnit หรือสิ่งที่พบได้ทั่วไปเช่น JSP หรือ JDBC ด้วยปรัชญาในใจการเน้นไปที่อาร์เรย์ที่ใช้ ArrayList ที่ใช้กันมากขึ้นจะทำให้เข้าใจได้ง่ายขึ้น


3
@Dupuplicator แน่นอน มันไม่เกี่ยวข้องกับประเด็นของฉันเกี่ยวกับอาร์เรย์ดังนั้นฉันจึงละเว้น ฉันยังไม่ได้รวม System.out.println ("Hello World!"); ทั้ง.
Zach Lipton

+1 สำหรับแนวคิดเทียบกับเทคนิคที่มีประสิทธิภาพสำหรับ "โลกแห่งความจริง" ไม่มีใครสอนการควบคุมเวอร์ชันด้วยอย่างน้อยก็ไม่ใช่ตอนที่ฉันอยู่โรงเรียน - แต่ฉันก็เป็นคนโบราณ :)
เดวิด

ฉันเข้าเรียนระบบปฏิบัติการที่เราต้องใช้หลาย ๆ อย่างเช่นตัวกำหนดตารางเวลา เรามุ่งเน้นหนึ่งชิ้นดังกล่าวในเวลาที่ (เฉพาะ) เพราะที่จุดที่เราไม่สามารถทำเพิ่มเติม แต่การคิดเกี่ยวกับการพยายามทำให้ชิ้นส่วนเหล่านั้นทั้งหมดทำงานในเวลาเดียวกันคือสิ่งที่ทำให้ฉัน (จุดเริ่มต้น) ชื่นชมกับความซับซ้อนของการพัฒนา / การเขียนโปรแกรมใน "โลกแห่งความจริง"
David

14

เหตุผลหนึ่งที่ชั้นเรียนการเขียนโปรแกรมในปีแรกที่ใช้อาร์เรย์นั้นเป็นแบบดั้งเดิมนั่นคือวิธีการที่อาจารย์ได้เรียนรู้มาก่อนที่เราจะเริ่มใช้ไลบรารีมาตรฐานที่มีรายการแบบไดนามิกที่ถูกอบเข้าด้วยกันการใช้ชนิดข้อมูลดั้งเดิม ภาษาภายใต้ดวงอาทิตย์ (และสามารถนำไปใช้ในคำแนะนำการประกอบจำนวนหนึ่ง) เมื่อฉันเรียนรู้การเขียนโปรแกรมครั้งแรกการใช้รายการที่เชื่อมโยงเป็นหนึ่งในการมอบหมาย

มันง่ายกว่ามากที่จะเริ่มจากหลักการแรกแล้วพูดว่า "นั่นคือโครงสร้างพื้นฐานภาษานี้ (หรือไลบรารี) ให้โครงสร้างข้อมูลระดับสูงนี้ซึ่งทำทุกอย่าง แต่ให้ x, y และ z" มากกว่า มันคือการพูดว่า "นั่นคือโครงสร้างข้อมูลระดับสูงตอนนี้นี่คือสิ่งที่อยู่ภายใต้ประทุน" การเรียนรู้ที่จะให้เหตุผลเกี่ยวกับว่าจะใช้ LinkedList กับ ArrayList (หรือ HashSet vs. TreeSet) เป็นหลักสูตรขั้นตอนวิธีที่สองหรือสามปี รายการและแผนที่มีอินเทอร์เฟซเดียวกันและให้ผลลัพธ์เดียวกัน แต่อาจมีพฤติกรรมที่แตกต่างกันอย่างมากในแอปพลิเคชันทุกขนาด และเมื่อคุณออกจากการเขียนโปรแกรม 101 ไม่รับประกันว่าการเขียนโปรแกรม 102 จะใช้ภาษาเดียวกัน ถ้าคุณเริ่มจากแนวคิดของอาเรย์คุณสามารถพูดว่า "

อีกเหตุผลหนึ่งที่ชอบ "อาร์เรย์" เหนือ "รายการ" ในหลักสูตรเบื้องต้นคืออาร์เรย์นั้นเข้าใจง่ายโดยทั่วไป: อาร์เรย์ 20 bytesใช้ 20 ไบต์ (บวกอีกสองคู่เพื่อระบุจุดสิ้นสุดของอาร์เรย์หรือความยาวขึ้นอยู่กับการนำไปใช้) )

"รายการ" เป็นกาต้มน้ำที่แตกต่างไปจากเดิมอย่างสิ้นเชิงและสามารถนำไปใช้ได้หลายวิธี (ArrayList, LinkedList และอาจเป็นคู่ที่ฉันลืมไปแล้ว) โดยมีลักษณะการทำงานที่แตกต่างกันโดยพื้นฐาน โดยไม่เข้าใจความกล้าของสิ่งที่เรียนรายการที่แตกต่างกันกำลังทำคุณไม่สามารถมีการอภิปรายที่มีความหมายเมื่อคุณควรใช้กับList foo = new ArrayList() List foo = new LinkedList()หากคุณพยายามให้นักเรียนใช้การใช้งานรายการใครบางคนจะถามว่าทำไมคุณถึงใช้ ArrayList แทนการใช้งานอย่างใดอย่างหนึ่ง และ "ArrayList" รวมถึงคำว่า "Array" และได้รับการสนับสนุนจากคำสั่งเดียวดังนั้นจริงๆแล้วมันไม่ได้เป็นตรรกะขนาดใหญ่ที่กระโดดจาก "อาร์เรย์" ถึง "ArrayList"

ตรงกันข้ามกับความเชื่อที่นิยมมีสถานการณ์ที่เหมาะสมที่จะใช้อาร์เรย์เหนือรายการโดยเฉพาะเมื่อคุณจัดการกับรายการขนาดคงที่ นี่คือคู่:

  • ค้นหาและซ้ำได้เร็วขึ้นเล็กน้อยเพราะคุณไม่ได้จัดการกับวิธีการอุทธรณ์ค่าใช้จ่าย: foo[n]dereferences และไม่บางเบื้องหลังฉากคำนวณตัวชี้ในขณะที่foo.get(n)มีการ dereference ทำวิธีการภาวนาทำ dereference สองและจากนั้นอาจจะทำเลขคณิตชี้ (ถ้าคุณใช้ ArrayList; LinkedLists อาจต้องวนซ้ำทุกองค์ประกอบของรายการ)
  • การกำหนดค่าเริ่มต้นนั้นสะอาดกว่ามาก: int[] foo = new int[]{1, 2, 3, 4, 5}เทียบกับข้อเสนอแนะในคำถาม StackOverflow อื่น

อีกสถานการณ์หนึ่งเมื่ออาร์เรย์ที่ได้รับชัยชนะจำนวนมากคือเมื่อลำดับที่องค์ประกอบใดพร้อมใช้งานตรงกับลำดับที่ทราบตำแหน่งสุดท้ายของพวกเขา แต่ไม่ตรงกับลำดับสุดท้าย ถ้าpermเป็นสิ่งint[256]ที่มีการเปลี่ยนแปลงใคร ๆ ก็สามารถกลับด้านได้ด้วยอาเรย์: int[] inv = new int[256]; for (int i=0; i<256; i++) inv[perm[i]]=i; ฉันไม่คิดว่าจะมีอะไรที่เขียนได้ด้วยความที่ArrayList<>จะสะอาด
supercat

@supercat ไม่ได้มีปัญหากับอาร์เรย์แบบไดนามิกเพียงแค่การใช้งานเฉพาะ ArrayListอาจได้รับ Constructor ที่สร้างรายการเริ่มต้นที่กำหนดขนาดเริ่มต้นได้อย่างง่ายดาย
Doval

คุณมีแหล่งข้อมูลเพื่อสำรองการอ้างสิทธิ์ว่ารายการอาร์เรย์ต้องจัดการกับค่าใช้จ่ายในการเรียกใช้วิธีการหรือไม่ ในทางทฤษฎีแล้วมันเป็นเช่นนั้น แต่ในทางปฏิบัติฉันจะแปลกใจถ้าgetและsetไม่ได้รับการอินไลน์
Doval

@Doval: ไม่มีเหตุผลที่ภาษา / กรอบการออกแบบที่ดีนั้นไม่ควรจัดหาประเภทอาเรย์แบบไดนามิกซึ่งสามารถเพิ่มรายการต่าง ๆ ได้อย่างสะดวก แต่ Java ไม่ได้ให้บริการประเภทนี้
supercat

@Doval: แม้ว่าgetและsetสามารถอยู่ในเรียงรายสิ่งที่ต้องการจะไม่มีที่ไหนเลยใกล้เป็นที่มีประสิทธิภาพmyList.set(23,myList.get(23)+1) myArray[23]+=1ยิ่งไปกว่านั้นสำหรับประเภทที่ไม่ต้องใช้มวยฉันจะแปลกใจมากถ้า JITter สามารถทำอะไรได้เทียบเท่ากับfor (i=0; i<1000; i++) myList2.set(i+2000,myList2.get(i+3000));สิ่งที่มีประสิทธิภาพอยู่ใกล้ทุกที่System.arrayCopy(myArray1,3000,myArray2,2000,1000); ไม่มีเหตุผลว่าทำไมอาร์เรย์แบบไดนามิกของเฟรมเวิร์กจึงไม่ควรมีการคัดลอกที่รวดเร็ว แต่ Java ไม่ได้
supercat

7

Java อนุญาตให้ตัวแปรประเภทใด ๆ ถูกเก็บไว้ในอาร์เรย์ ในทางตรงกันข้ามArrayListอนุญาตให้เก็บข้อมูลอ้างอิงได้เท่านั้น บางคนอาจไม่พูดคุยอย่างเป็นประโยชน์ArrayListโดยไม่มีการปกปิดก่อนว่า auto-boxing จะแปลง primitives เป็นชนิดอ้างอิงอย่างไรและบางครั้ง auto-unboxing จะแปลงชนิดของการอ้างอิงเป็น primitives:

for (int i=10; i<=10000; i*=10)
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    l.add(i);
    l.add(i);
    l.add(l.get(0));
    System.out.print("i=" + i);
    System.out.print(" #0==i:" + (l.get(0)==i));
    System.out.print(" #1==i:" + (l.get(1)==i));
    System.out.print(" #2==i:" + (l.get(2)==i));
    System.out.print(" #0=#1:" + (l.get(0)==l.get(1)));
    System.out.print(" #1=#2:" + (l.get(1)==l.get(2)));
    System.out.println(" #0=#2:" + (l.get(0)==l.get(2)));
}

หากรหัสได้ใช้int[3]มากกว่าArrayListจะไม่มีความประหลาดใจ ทั้งสามองค์ประกอบจะเปรียบเทียบกันiและระหว่างกัน ArrayListอย่างไรก็ตามการใช้แม้ว่าทั้งสามองค์ประกอบของรายการจะเปรียบเทียบกันเสมอiและรายการที่หนึ่งและสามจะเปรียบเทียบกันเสมอกัน แต่องค์ประกอบสองรายการแรกจะเท่ากันเมื่อi1, 10 หรือ 100 แต่ (ในการใช้งานส่วนใหญ่) ไม่ใช่เมื่อi1,000 หรือ 10,000


คุณช่วยอธิบายได้ไหมว่าทำไม # 0 และ # 1 จะเท่ากันเมื่อพวกเขา 1 หรือ 10 หรือ 100 ฉันติดตามจนถึงจุดนั้น
Matthew อ่าน

2
@MatthewRead: Integerคลาสมีคลาสที่ซ้อนกันIntegerCacheซึ่งเรียกว่าIntegerวัตถุที่ถูกเตรียมใช้งานล่วงหน้าสำหรับช่วงของค่าที่โดยทั่วไปจะขยาย -128..127; มวยนอกค่าที่หลากหลายจะต้องมีการสร้างวัตถุใหม่ IntegerCache.cacheแต่มวยค่าอยู่ในช่วงที่เก็บไว้ก็จะกลับมามีการอ้างอิงถึงหนึ่งของวัตถุก่อนเริ่มต้นที่เก็บไว้ใน โปรแกรมเมอร์ Java ที่ดีต้องทราบว่าIntegerตัวแปรสองชนิดที่ห่อหุ้มค่าเดียวกันอาจหรือไม่อาจเปรียบเทียบกันได้ แต่การแนะนำแนวคิดนั้นเร็วเกินไปอาจทำให้นักเรียนหนีด้วยความหวาดกลัว
supercat

อืมไม่เคยเดาเลยว่ามันเป็นเพราะวัตถุที่ไม่ได้เตรียมไว้ก่อน ขอบคุณสำหรับข้อมูล!
Matthew อ่าน

1
@MatthewRead: ฉันหวังว่า Java ==ได้ไม่ได้รับอนุญาตประเภทหนึ่งของการแปลงโดยปริยายด้วย เมื่อพิจารณาถึงความเป็นไปได้ที่การแกะกล่องอัตโนมัติอาจทำให้ฉันไม่อยากทำเช่นนี้โดยสิ้นเชิง แต่พฤติกรรมของกล่องนั้น==น่ากลัวมาก ==ผู้ประกอบการยังมีพฤติกรรมไม่ดีในกรณีเช่น16777217==16777216f[รายงานจริง] และการแปลงโดยปริยายสำหรับlong v=Math.Round(123456789), w=Math.Round(123456789012345)มีแนวโน้มที่จะเป็นที่ไม่คาดคิด [คุณสามารถคาดเดาสิ่งที่แสดงออกเหล่านั้นจะให้ผลผลิต?]
SuperCat

สำหรับIntegerCacheบางครั้งมันสามารถช่วยให้ประสิทธิภาพการทำงาน แต่มันมักจะทำให้รหัสซึ่งเป็นเพียงแค่ผิดธรรมดาไปทำงาน kinda-sorta ในบางวิธีฉันหวังว่าจะมีโหมดที่การชกมวยกึ่งแบบสุ่มจะส่งคืนวัตถุจากแคชจำนวนเต็มสองค่าและแบบกึ่งสุ่มแทนรายการแคชด้วยรายการใหม่ดังนั้นโค้ดที่ขึ้นอยู่กับพฤติกรรมการชกมวยของค่า -128 ..127 จะเป็น ไม่น่าจะประสบความสำเร็จได้นานมาก
supercat

6

ฉันคิดว่ามันสมเหตุสมผลที่จะสอนวิธีการใช้อาร์เรย์ก่อนเนื่องจากความจริงที่ว่าArrayListใช้อาร์เรย์ภายใน ArrayListชั้นจะมีตัวแปรสมาชิกที่เรียกว่าelementDataซึ่งเป็นObjectอาร์เรย์

จากArrayList ซอร์สโค้ด JDK :

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

เมื่อคุณเพิ่มอัปเดตเรียกคืนหรือลบองค์ประกอบออกจากArrayListมันจะใช้อาร์เรย์ภายในนี้เพื่อดำเนินการดังกล่าว ในฐานะที่เป็นผู้ใช้Ixrecได้ชี้ให้เห็นแล้ว - ArrayListเป็นเพียงนามธรรมในระดับที่สูงขึ้นซึ่งโดยทั่วไปจะใช้งานได้ง่ายขึ้น


แต่อาร์เรย์ใช้ตัวชี้ไปยังบล็อกของหน่วยความจำภายใน ทำไมเริ่มต้นที่ระดับที่เฉพาะเจาะจงของสิ่งที่เป็นนามธรรม

คำถามคือติดแท็กเป็นJava- ArrayListมันถูกถามว่าทำไมอาร์เรย์สอนเมื่อโดยปกติคุณอาจใช้ Java ไม่มีพอยน์เตอร์ ถูกหรือผิดฉันถือความเห็นว่า C / C ++ เป็นภาษาที่ดีกว่าในการเริ่มต้นนักเรียนด้วยจาวา หลายหัวข้อในการเขียนโปรแกรมสามารถเข้าใจได้ดีขึ้นโดยมีความรู้ของ C / C ++
Derek W

3

สมมติว่ารายการนั้นง่ายกว่าที่คุณจะทำงานด้วยอย่างที่คุณพูด - นั่นไม่สำคัญอะไร การเรียนรู้เกี่ยวกับ "พื้นฐานถึงซับซ้อน" มากกว่า "ง่ายไปยาก" หากความรู้พื้นฐานไม่สำคัญวิทยาศาสตร์คอมพิวเตอร์จะไม่ใช่สาขาวิชาการ คุณสามารถเรียนรู้วิธีการคลิกแอพโดยใช้เฟรมเวิร์ก / ไลบรารีที่มีอยู่จากบทแนะนำออนไลน์ (แน่นอนว่ามีบางคนต้องเขียนห้องสมุดเหล่านั้น ... และใครบางคนจะต้องดำเนินการArrayListตั้งแต่แรก .... )


ในหลายกรณีที่การใช้งานArrayListนั้นสามารถจัดการได้ดีขึ้นโดยใช้อาร์เรย์ที่แยกต่างหากและการนับ "liveItems" ยกเว้นว่าไม่มีวิธีที่สะดวกในการทำงานกับอาร์เรย์และนับรวมเข้าด้วยกันยกเว้นการรวมเข้าด้วยกัน
supercat

2

เป็นเพราะสิ่งที่สำคัญที่สุดในการศึกษาเชิงวิชาการคือการสอนให้คุณใช้คำศัพท์ที่ถูกต้องเพื่ออธิบายสิ่งที่คุณทำ

รายการเป็นสิ่งอื่น ๆ ที่อาร์เรย์ และคุณไม่สามารถใช้java.util.Listใน Java ได้เพราะเป็นส่วนต่อประสาน คุณมักจะใช้java.util.ArrayListซึ่งเป็นการใช้งานรายการไม่ใช่รายการ แต่ wrapper วัตถุรอบอาร์เรย์แบบไดนามิก ดังนั้นคุณบอกว่าคุณใช้ 'รายการ' แต่คุณใช้อาร์เรย์

มันสมเหตุสมผลมากที่จะข้ามความสับสนวุ่นวายด้านคำศัพท์และใช้อาร์เรย์เพื่อเรียนรู้ว่านักเรียนคืออะไร ถ้าคุณใช้อาร์เรย์ใน Java อย่างน้อยคุณก็ใช้อาร์เรย์

จริงๆแล้วมันเป็นเหตุผลว่าทำไมการสอนการเขียนโปรแกรมด้วย Java จึงไม่ใช่ความคิดที่ดี เป็นการยากที่จะเรียนรู้แนวคิดพื้นฐานของการเขียนโปรแกรมอย่างถูกต้อง


hashmap เกี่ยวกับอะไร อาร์เรย์เป็นเพียงชนิดของ HashMap ในทาง ..
Thufir

@ พวกเขาสามารถเป็นอาร์เรย์ hashmap ได้อย่างไร? มันเป็นโครงสร้างข้อมูลที่แตกต่างอย่างสิ้นเชิง
Danubian Sailor

คุณสามารถแทนอาร์เรย์ด้วย hashmap ซึ่งเป็น "พื้นฐาน" มากกว่า ฉันขอโต้แย้งว่า hashmap นั้นน่าสนใจยิ่งขึ้น
Thufir

1
@ ไม่พวกคุณไม่สามารถทำได้ คุณสามารถเลียนแบบได้เท่านั้น ภายในแต่ละโครงสร้างข้อมูลจะเป็นอย่างไร สิ่งเหล่านั้นมีพื้นฐานและแนวคิดที่แตกต่าง นี่คือเหตุผลที่เป็นความคิดที่ดีที่จะเริ่มเรียนรู้การเขียนโปรแกรมด้วยภาษาที่เป็นนามธรรมเช่น Java หรือ JavaScript ไม่ชัดเจนว่ามีโครงสร้างข้อมูลอะไร
Danubian Sailor

1

คุณไม่เคยเห็นหรือใช้อาร์เรย์ใด ๆ เลยใช่ไหม? เราใช้พวกเขาตลอดเวลานอกเหนือจากรายการ ปกติแล้วเราจะไม่ใช้ Java แต่เราใช้ภาษาอื่นมากมายที่วาดความคล้ายคลึงกันอย่างชัดเจน

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

และจากมุมมองทางวิชาการมีเหตุผลเพิ่มเติมในการสอนนักเรียนพื้นฐาน อย่างไรก็ตามสิ่งนี้ลึกลงไปอีกเล็กน้อย อาร์เรย์และลิสต์เป็นตัวอย่างที่ดีของประเภทเทเรียร์ซึ่งมักจะถูกสร้างขึ้นจากด้านบนและมักจะพันรอบอินสแตนซ์พื้นฐานของประเภทที่มีน้ำหนักเบากว่า แม้ว่าลิสต์จะไม่มีอาเรย์พื้นฐาน แต่พวกมันก็ทำตัวเหมือนภายนอก ส่วนหนึ่งของการสอนคนว่า List คืออะไรเพื่อสอนพวกเขาว่าอาเรย์คืออะไร

ฉันเห็นว่าสิ่งนี้อาจจะหลุดพ้นจากภาษาเช่น C ++ โดยที่อาร์เรย์โดยทั่วไปจะไม่สามารถแยกย่อยได้มากกว่าในภาษาเหล่านั้น แต่ในภาษาระดับสูงกว่า หากพวกเขาเหมาะสมกับความต้องการของคุณอย่างสมบูรณ์ในสถานการณ์ที่กำหนดทำไมคุณต้องใช้อย่างอื่น?


ฉันจะไม่พูดรายการที่มีฟังก์ชั่น "มากกว่า" มากเท่าที่มีฟังก์ชั่น "แตกต่าง" ใหม่T[]จะพร้อมออกประตูเพื่อรับรายการในลำดับใด ๆ ในขณะที่ArrayList<T>จำเป็นต้องเพิ่มรายการตามลำดับก่อนที่พวกเขาจะสามารถแก้ไขได้ A T[]สามารถคัดลอกช่วงของรายการใดช่วงหนึ่งไปยังอีกขนาดที่T[]ค่อนข้างใกล้เคียงกันได้อย่างรวดเร็วในขณะที่ArrayList<T>จะต้องอ่านรายการทีละรายการจากรายการหนึ่งและเก็บไว้ที่อื่น - ช้ากว่าและสะดวกกว่ามาก
supercat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.