"Amigo ฉันหวังว่าตอนนี้คุณคงรู้แล้วว่าอาร์เรย์มีประโยชน์อย่างไรในการเขียนโปรแกรม"

"แน่นอนที่สุด ริชิ! ฉันแก้ไขงานมากกว่าหนึ่งงานแล้ว"

"งานของคุณมีการกระทำซ้ำๆ หรือไม่ ประเภทที่คุณทำซ้ำแล้วซ้ำอีก"

"ถ้าฉันเข้าใจคุณถูกต้อง คุณหมายถึงการกระทำที่คล้ายกันในงานต่างๆ กันใช่ไหม ตัวอย่างเช่น ทุกที่ที่ใช้การวนซ้ำเพื่อแสดงเนื้อหาของอาร์เรย์ — ฉันเหนื่อยมากที่จะทำแบบนั้น!"

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

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

"ผู้สร้างของ Java คิดเรื่องนี้และสร้างArraysคลาสพิเศษ (ชื่อเต็มของมันคือjava.util.Arrays) โดยใส่การกระทำที่เกี่ยวข้องกับอาร์เรย์ที่เป็นที่นิยมที่สุดลงไป"

"อืม... น่าสนใจดี แล้วมันมีอะไรกันแน่?

"มีหลายวิธีสำหรับทุกโอกาส แต่ก่อนอื่นเราจะพิจารณาเพียง 10 วิธีเท่านั้น ซึ่งเป็นวิธีที่ง่ายที่สุดและใช้บ่อยที่สุด

Arrays.toString()

"วิธีแรกที่เราจะดูคือArrays.toString()แต่ก่อนอื่น พื้นหลังเล็กน้อย

"อาร์เรย์แต่ละตัวใน Java มีtoString()เมธอดซึ่งส่งคืน 'การแสดงข้อความของอาร์เรย์' คุณสามารถรับการแสดงข้อความของอาร์เรย์โดยใช้คำสั่งต่อไปนี้:

String str = name.toString();

" nameชื่อของตัวแปรอาร์เรย์อยู่ที่ไหนและstrเป็นชื่อของตัวแปรที่จะเก็บการแสดงสตริงของอาร์เรย์ Amigo คุณได้ลองพิมพ์อาร์เรย์ไปที่หน้าจอโดยใช้เมธอดแล้วหรือยัง?System.out.println(name)

ฉันสารภาพว่ามันเกิดขึ้น ฉันเห็นบางอย่างซึ่งพูดพล่อยๆ ฉันตัดสินใจหลีกเลี่ยงอันตรายและใช้ลูปต่อไป

"เป็นไปได้มากว่าคุณจะเห็นบางอย่างเช่น:

I@37afeb11

"ตัวอักษรตัวแรกIหมายความว่ามันเป็นintอาร์เรย์ และสัญลักษณ์ตามหลัง@คือที่อยู่ของออบเจกต์เดียวในหน่วยความจำ คุณสามารถคิดว่ามันเป็นที่อยู่ของอาร์เรย์ในหน่วยความจำ ในแง่หนึ่ง นี่คือข้อมูลที่จัดเก็บไว้ใน ตัวแปรอาร์เรย์ แต่อีกอัน คุณคาดหวังสิ่งที่แตกต่างออกไป ใช่ไหม"

"แน่นอน! ฉันวางแผนที่จะดูค่าในอาร์เรย์ นี่เป็นสิ่งสุดท้ายที่ฉันคาดไว้"

"และนั่นคือเหตุผลว่าทำไมพวกเขาถึงคิดArrays.toString()วิธีการ - เพื่อแสดงค่าของอาร์เรย์ เราเรียกมันว่า:

String str = Arrays.toString(name);

ตัวอย่าง:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
ตัวแปรstrจะประกอบด้วยสตริง"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
ตัวแปรstrจะประกอบด้วยสตริง"[]"
String[] array = {"Hi", "How's", "life?"};
String str = Arrays.toString(array);
ตัวแปรstrจะประกอบด้วยสตริง"[Hi, How's, life?]"

Arrays.deepToString()

"อย่างไรก็ตามtoString()วิธีการนี้ไม่เพียงพอเมื่อพูดถึงอาร์เรย์สองมิติ กล่าวอีกนัยหนึ่ง ถ้าคุณพยายามเรียกArrays.toString()คุณจะเห็นสิ่งที่คุ้นเคย:

[I@37afeb11, I@37afeb21, I@37afeb31]

"ทั้งหมดนี้เป็นเพราะเซลล์ของอาร์เรย์สองมิติเก็บการอ้างอิงถึงอาร์เรย์หนึ่งมิติ และอาร์เรย์หนึ่งมิติถูกแปลงเป็นสตริงได้อย่างไร ตรงตามที่คุณเห็นด้านบน

"แล้วต้องทำอย่างไร เราจะแสดงอาร์เรย์สองมิติอย่างถูกต้องได้อย่างไร"

"ผู้สร้างของ Java ก็คาดหวังสิ่งนี้เช่นกัน ด้วยเหตุนี้Arraysคลาสจึงมีเมธอดพิเศษอีกวิธีหนึ่ง — deepToString()การเรียกมันมีลักษณะดังนี้:

String str = Arrays.deepToString(name);

"วิธีนี้สามารถส่งผ่านอาร์เรย์ที่เป็นสองมิติ หนึ่งมิติ สามมิติ หรือโดยทั่วไป มิติใดก็ได้ และมันจะแสดงองค์ประกอบของอาร์เรย์เสมอ

ตัวอย่าง:

int[] array = {1, 2, 3};
String str = Arrays.deepToString(array);
ตัวแปรstrจะประกอบด้วยสตริง"[1, 2, 3]"
int[][] array = { {1, 1}, {2, 2}, {3, 3} };
String str = Arrays.deepToString(array);
ตัวแปรstrจะประกอบด้วยสตริง"[[1, 1], [2, 2], [3, 3]]"
int[][][] array = { {{1, 2, 3}, {1}}, {{}} };
String str = Arrays.deepToString(array);
ตัวแปรstrจะประกอบด้วยสตริง"[[[1, 2, 3], [1]], [[]]]"

Arrays.equals()

"เราหาวิธีแสดงอาร์เรย์บนหน้าจอ แล้วการเปรียบเทียบอาร์เรย์ล่ะ คุณจำวิธีที่เราใช้ในการเปรียบเทียบสตริงได้ไหม"

“ฉันมักจะใช้equalsวิธี!

"ใช่equalsและยังequalsIgnoreCase(ซึ่งเปรียบเทียบสตริงโดยไม่คำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก)

"ข่าวดี: คุณสามารถใช้equalsเมธอดสำหรับอาร์เรย์ได้ด้วย ข่าวร้าย: มันไม่เปรียบเทียบเนื้อหาของอาร์เรย์ เมธอดequalsของอาร์เรย์ทำสิ่งเดียวกันกับ==โอเปอเรเตอร์ นั่นคือเปรียบเทียบการอ้างอิง

ตัวอย่าง:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1 == x2;
false(การอ้างอิงไม่เท่ากัน)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
วิธีequalsการarraysเปรียบเทียบการอ้างอิงของอาร์เรย์สองตัว

false(การอ้างอิงไม่เท่ากัน)

"แล้วเราจะทำอย่างไร เราจะเปรียบเทียบอาร์เรย์ตามเนื้อหาได้อย่างไร"

" Arraysชั้นเรียนมาช่วยเราอีกครั้ง โดยเฉพาะอย่างยิ่งArrays.equals()วิธีการของมัน เราเรียกมันว่า:

Arrays.equals(name1, name2)

"เมธอดจะส่งกลับtrueหากอาร์เรย์มีความยาวเท่ากันและองค์ประกอบเท่ากัน มิเช่นนั้นจะส่งfalseกลับ

ตัวอย่าง:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
วิธีequalsการarraysเปรียบเทียบการอ้างอิงของอาร์เรย์สองตัว

false(การอ้างอิงไม่เท่ากัน)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
Arrays.equals(x1, x2);


true(เนื้อหาเท่ากัน)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3, 4};
Arrays.equals(x1, x2);


false(เนื้อหาของอาร์เรย์จะแตกต่างกัน)

Arrays.deepEquals()

"และอย่างที่คุณเดาได้Arrays.equalsวิธีการนี้จะทำงานไม่ถูกต้องสำหรับอาร์เรย์สองมิติ: มันถือว่าอาร์เรย์สองมิติเหมือนกับอาร์เรย์หนึ่งมิติที่มีองค์ประกอบเป็นแอดเดรสของอาร์เรย์หนึ่งมิติ

"ดังนั้น เพื่อเปรียบเทียบอาร์เรย์หลายมิติ ( n = 1, 2, 3,... ) อย่างถูกต้อง พวกเขาจึงคิดArrays.deepEquals()วิธีการขึ้นมา การเรียกมันมีลักษณะดังนี้:

Arrays.deepEquals(name1, name2)

"เมธอดจะส่งกลับtrueหากอาร์เรย์มีความยาวเท่ากันและองค์ประกอบเท่ากัน มิเช่นนั้นจะส่งกลับfalse. หากองค์ประกอบภายในอาร์เรย์เป็นอาร์เรย์ด้วย ก็จะArrays.deepEquals()ใช้วิธีเปรียบเทียบองค์ประกอบเหล่านั้นไปเรื่อยๆ

ตัวอย่าง:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};

x1.equals(x2);
วิธีequalsการarrays เปรียบเทียบการอ้างอิงของอาร์เรย์สองตัว

false(การอ้างอิงไม่เท่ากัน)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};

Arrays.equals(x1, x2);
วิธีArrays.equalsการจะเปรียบเทียบและเป็นอาร์เรย์หนึ่งมิติที่เก็บการอ้างอิง พวกเขามีการอ้างอิงที่แตกต่างกัน (เนื้อหาของอาร์เรย์ไม่เท่ากัน) x1x2
false
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};

Arrays.deepEquals(x1, x2);



true(เนื้อหาเท่ากัน)

"ขอบคุณ Rishi! บทเรียนนี้เป็นเพียงสิ่งที่ฉันต้องการเพื่อทำให้ชีวิตของฉันง่ายขึ้นและมีความสุขมากขึ้นในอนาคต ตอนนี้ฉันจะใช้วิธีการของคลาส Arrays และเขียนโปรแกรมของฉันให้เร็วยิ่งขึ้น

"นั่นคือสิ่งที่ฉันคาดหวังไว้ ฮ่าฮ่า แต่นี่ไม่ใช่วิธีการที่น่าสนใจทั้งหมดในคลาส Arrays ฉันจะบอกคุณเกี่ยวกับวิธีอื่นในครั้งต่อไป"