1. Arraysชั้นเรียน

ดังที่เราได้กล่าวไว้ก่อนหน้านี้ อาร์เรย์มีประโยชน์มากและใช้บ่อยในการเขียนโปรแกรม

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

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

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


2.Arrays.toString()

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

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

String str = name.toString();

nameชื่อของตัวแปรอาร์เรย์อยู่ที่ไหน และ strเป็นชื่อของตัวแปรที่จะเก็บการแสดงสตริงของอาร์เรย์

แต่ถ้าคุณพยายามพิมพ์อาร์เรย์ไปที่หน้าจอโดยใช้เมธอด คุณมักจะเห็นสิ่งนี้: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?]"


3.Arrays.deepToString()

แต่ถ้าคุณพยายามแปลงอาร์เรย์สองมิติเป็นusing the Arrays.toString()เมธอดสตริง (เพื่อแสดง) คุณจะเห็นสิ่งที่คุ้นเคย:

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

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

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

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

String str = Arrays.deepToString(name);

วิธีนี้สามารถผ่านอาร์เรย์ที่เป็นสองมิติ หนึ่งมิติ สามมิติ หรือโดยทั่วไป มิติใดก็ได้ และมันจะแสดงองค์ประกอบของอาร์เรย์เสมอ
หมายเหตุ: วิธีการ นี้Arrays.deepToString()ใช้ไม่ได้กับอาร์เรย์แบบหนึ่งมิติ (เช่นint[])

ตัวอย่าง:

Integer[] 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]], [[]]]"


4.Arrays.equals()

เราทราบวิธีแสดงอาร์เรย์บนหน้าจอแล้ว แต่การเปรียบเทียบอาร์เรย์ล่ะ

ในการเปรียบเทียบสตริง เรามีequalsและequalsIgnoreCaseเมธอด แต่อาร์เรย์มีเมธอดอะไรบ้าง

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

ตัวอย่าง:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
boolean b = 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(เนื้อหาของอาร์เรย์จะแตกต่างกัน)

5.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(เนื้อหาเท่ากัน)