Mảng java có nghĩa là gì? Mảng Java. Mảng trong Java. Java dành cho người mới bắt đầu. Khai báo một mảng trong Java

  • Hướng dẫn

Tôi nghĩ rằng rất ít người chuẩn bị cho cuộc phỏng vấn đầu tiên khi ứng tuyển vào công việc đầu tiên với tư cách là một lập trình viên cấp dưới sẽ trả lời câu hỏi này theo hướng tiêu cực. Hoặc ít nhất là nghi ngờ câu trả lời tích cực. Tất nhiên, cấu trúc dữ liệu đơn giản như vậy có khả năng truy cập chỉ mục trực tiếp - không cần thủ thuật! Không, trong một số ngôn ngữ như JavaScript hoặc PHP, mảng tất nhiên được triển khai theo một cách rất thú vị và về cơ bản không chỉ là một mảng. Nhưng đây không phải là điều chúng ta đang nói đến mà là về cách triển khai mảng “truyền thống” dưới dạng một “mảnh bộ nhớ liên tục”. Trong trường hợp này, dựa trên các chỉ số và kích thước của một phần tử, địa chỉ được tính toán đơn giản và giá trị tương ứng được truy cập. Có gì khó khăn thế?
Hãy tìm ra nó. Ví dụ: trong Java. Yêu cầu người nộp đơn không nghi ngờ tạo một mảng số nguyên N x N. Người đó tự tin viết một cái gì đó như:
int g = int mới[n][n];
Tuyệt vời. Bây giờ chúng tôi yêu cầu bạn khởi tạo các phần tử mảng bằng một cái gì đó. Ít nhất là theo đơn vị, ít nhất là tổng của các chỉ số. Chúng tôi nhận được:
for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
Họ thậm chí còn viết thường xuyên hơn
for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
đó cũng là lý do để trò chuyện, nhưng bây giờ chúng ta đang nói về một điều khác. Chúng tôi đang cố gắng tìm hiểu những gì một người biết và xem anh ta nghĩ như thế nào. Do đó, chúng tôi thu hút sự chú ý của anh ấy đến thực tế là các giá trị được đặt đối xứng và yêu cầu anh ấy lưu lại các lần lặp vòng lặp. Tất nhiên, tại sao phải đi qua tất cả các giá trị chỉ số khi bạn chỉ có thể đi qua hình tam giác phía dưới? Đối tượng thường dễ dàng đồng ý và làm nổi bật đường chéo chính một cách khôn ngoan, cẩn thận viết những điều như:
for(int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
Thay vì g[i][i] = 2* i; thường được viết g[i][i] = i + i; hoặc g[i][i] = tôi<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Chương trình sẽ chạy nhanh hơn bao nhiêu?. Lý do thông thường như sau: tính toán chỉ số ít hơn gần 2 lần; tính toán giá trị ít hơn gần 2 lần (tổng hợp); số lượng nhiệm vụ như nhau. Điều này có nghĩa là nhanh hơn 30 phần trăm. Nếu một người có nền tảng toán học tốt, thì bạn thậm chí có thể thấy chính xác số lượng thao tác đã lưu và đánh giá hợp lý hơn về hiệu quả của việc tối ưu hóa.
Bây giờ là lúc diễn ra đòn chính. Chúng tôi chạy cả hai phiên bản mã trên một số giá trị đủ lớn N(khoảng vài nghìn), ví dụ như thế này.

Mã kiểm soát thời gian

lớp A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0;< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


Chúng ta thấy gì? Phiên bản tối ưu hóa hoạt động chậm hơn 10-100 lần! Bây giờ là lúc quan sát phản ứng của ứng viên đối với vị trí này. Phản ứng với một tình huống căng thẳng bất thường (chính xác hơn là thông thường trong thực tế của nhà phát triển) sẽ là gì. Nếu khuôn mặt của bị cáo tỏ ra phấn khích và anh ta bắt đầu bấm nút, tạm thời quên mất sự tồn tại của bạn thì đây là một dấu hiệu tốt. Đến một mức độ nhất định. Bạn không muốn thuê một nhà nghiên cứu không quan tâm đến kết quả của dự án, phải không? Vậy thì đừng hỏi anh ấy câu hỏi "Tại sao?" Yêu cầu họ làm lại tùy chọn thứ hai để nó thực sự hoạt động nhanh hơn tùy chọn đầu tiên.
Bây giờ bạn có thể an tâm tiếp tục công việc kinh doanh của mình trong một thời gian. Trong nửa giờ, bạn sẽ có đủ tài liệu để đánh giá những phẩm chất cá nhân và nghề nghiệp cơ bản của người nộp đơn.
Nhân tiện, khi tôi mô tả ngắn gọn vấn đề này trên trang web làm việc của mình, nhận xét phổ biến nhất là “Đây là đường cong Java của bạn”. Tôi đang đăng mã trên Tuyệt vời và Miễn phí, đặc biệt dành cho họ. Và những chủ sở hữu vui vẻ của Pascal miễn phí cho Windows có thể xem qua

dưới tấm lướt gió

Thời gian chương trình; sử dụngWindows; var bắt đầu, kết thúc, res: int64; n, i, j: Số nguyên; g: Mảng số nguyên; bắt đầu n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(bắt đầu); for i:=1 to n-1 do for j:=1 to n-1 do g := i + j; QueryPerformanceCounter(kết thúc); writeln("Thời gian theo hàng:", (kết thúc - bắt đầu) / res, " giây"); QueryPerformanceCounter(bắt đầu); for i:=1 to n-1 do for j:=1 to n-1 do g := i + j; QueryPerformanceCounter(kết thúc); writeln("Thời gian tính bằng cols:", (kết thúc - bắt đầu) / res, " giây"); kết thúc.


Trong đoạn mã trên bằng Pascal, tôi đã loại bỏ các khía cạnh “khó hiểu” và chỉ để lại bản chất của vấn đề. Nếu điều này có thể được gọi là một vấn đề.
Chúng ta sẽ hỏi bị cáo những câu hỏi gì?
1. Tại sao nó hoạt động chậm hơn? Và chi tiết hơn...
2. Làm thế nào để khởi tạo nhanh hơn?

Nếu có nhu cầu tìm hiểu sâu hơn về cách triển khai Java, thì chúng tôi yêu cầu người nộp đơn quan sát thời gian thực hiện đối với các giá trị nhỏ N. Ví dụ: trên ideone.com với n=117, tùy chọn “tối ưu hóa” chậm bằng một nửa. Nhưng đối với giá trị tiếp theo n=118, nó nhanh hơn 100 (một trăm) lần so với giá trị không được tối ưu hóa! Đề nghị thử nghiệm trên máy cục bộ. Hãy để anh ấy chơi với các cài đặt.
Nhân tiện, mọi người có hiểu chuyện gì đang xảy ra không?

Một vài lời biện minh

Tôi muốn nói vài lời để biện minh cho phương pháp phỏng vấn tuyển dụng này. Có, tôi không kiểm tra kiến ​​thức về cú pháp ngôn ngữ và kiến ​​thức về cấu trúc dữ liệu. Có lẽ, trong một thị trường lao động văn minh, tất cả những điều này đều có tác dụng. Nhưng trong điều kiện chúng ta đang thiếu hụt hoàn toàn nhân sự có trình độ, cần phải đánh giá mức độ phù hợp lâu dài của người nộp đơn đối với công việc mà anh ta sẽ phải đối mặt. Những thứ kia. khả năng học hỏi, đột phá, hiểu biết, làm việc.
Điều này có tinh thần tương tự như cuộc “phỏng vấn” tuyển mộ lính lê dương ở La Mã cổ đại. Người chiến binh tương lai vô cùng sợ hãi và quan sát xem anh ta có đỏ mặt hay tái nhợt không. Nếu anh ta tái mặt, thì trong tình huống căng thẳng, máu sẽ chảy ra khỏi đầu người nộp đơn và anh ta dễ có phản ứng thụ động. Ví dụ như ngất xỉu. Nếu người nộp đơn đỏ mặt thì máu dồn lên đầu. Những thứ kia. anh ta có xu hướng hành động tích cực và lao vào đánh nhau. Điều này được coi là phù hợp.
Vâng, một điều cuối cùng. Tại sao tôi lại nói với mọi người về vấn đề này thay vì tiếp tục sử dụng nó trong các cuộc phỏng vấn? Chỉ là những ứng viên tiềm năng đã “học” được nhiệm vụ này và phải sử dụng những nhiệm vụ khác.
Trên thực tế, tôi chú ý đến hiệu ứng này một cách chính xác liên quan đến nhiệm vụ thực sự của việc xử lý hình ảnh. Tình huống có phần khó hiểu và tôi không hiểu ngay tại sao khung hình/giây của mình lại giảm nhiều như vậy sau khi tái cấu trúc. Nói chung chắc hẳn ai cũng có rất nhiều khoảnh khắc tuyệt vời như vậy.

Cho đến nay, phiên bản hàng đầu là bộ nhớ đệm của bộ xử lý là nguyên nhân. Những thứ kia. truy cập tuần tự trong tùy chọn đầu tiên hoạt động trong một hàm băm, được cập nhật khi di chuyển ra ngoài một ranh giới nhất định. Khi truy cập theo cột, hàm băm buộc phải cập nhật liên tục và việc này mất rất nhiều thời gian. Hãy kiểm tra phiên bản này ở dạng tinh khiết nhất của nó. Hãy tạo một mảng và so sánh cái nào nhanh hơn - xử lý tất cả các phần tử trong một hàng hay xử lý các phần tử mảng có số ngẫu nhiên với cùng số lần? Chương trình này là ideone.com/tMaR2S. Đối với 100.000 phần tử mảng, truy cập ngẫu nhiên thường nhanh hơn đáng kể. Điều đó có nghĩa là gì?
Ở đây, tôi (Big_Lebowski) đã chỉ ra khá đúng rằng việc sắp xếp lại các vòng lặp sẽ thay đổi kết quả theo hướng có lợi cho tùy chọn tuần tự. Để đảm bảo độ thuần khiết của thí nghiệm, tôi phải thiết lập một chu trình khởi động. Đồng thời, tôi thực hiện lặp lại nhiều lần để có thời gian hoạt động trung bình như lời khuyên của Leventov. Hóa ra như thế này ideone.com/yN1H4g. Những thứ kia. Truy cập ngẫu nhiên vào các phần tử của một mảng lớn chậm hơn ~ 10% so với truy cập tuần tự. Có lẽ bộ đệm thực sự có thể đóng một vai trò nào đó. Tuy nhiên, trong tình huống ban đầu, hiệu suất giảm đáng kể. Vì vậy, có một cái gì đó khác.

Dần dần, phiên bản về các hành động bổ sung khi di chuyển từ hàng này sang hàng khác đang trở thành người dẫn đầu. Và nó đúng. Vẫn còn phải tìm hiểu chính xác những gì đang xảy ra ở đó.

Thẻ: Thêm thẻ

Mảng là tập hợp các biến cùng loại được gọi bằng một tên chung. Mảng có thể được tạo từ các phần tử thuộc bất kỳ loại nào và chúng có thể có một hoặc nhiều chiều. Một phần tử cụ thể trong mảng được truy cập bằng chỉ mục (số) của nó. Trong lưu ý này, chúng ta sẽ xem xét việc xử lý mảng một chiều và hai chiều.

Mảng một chiều trong Java

Mảng một chiều về cơ bản là một danh sách các biến cùng loại. Để tạo một mảng, trước tiên bạn phải tạo một biến mảng có kiểu mong muốn. Cú pháp chung để khai báo mảng một chiều là:
gõ tên var;
Ở đây type khai báo kiểu cơ bản của mảng; var-name là tên của biến mảng. Kiểu cơ sở xác định kiểu dữ liệu của từng phần tử mảng. Ví dụ: khai báo mảng một chiều gồm các thành phần int có tên là tháng_days trông như sau:
int tháng_ngày ;
Mặc dù khai báo này chứng minh thực tế rằng tháng_ngày là một biến mảng nhưng thực tế không có mảng nào tồn tại. Trên thực tế, date_days được đặt thành null (con trỏ null), đại diện cho một mảng không có giá trị. Để liên kết tháng_ngày với một mảng số nguyên vật lý thực tế, bạn cần cấp phát bộ nhớ cho mảng đó bằng thao tác mới và gán nó cho mảng tháng_ngày; new là một hoạt động đặc biệt để phân bổ bộ nhớ.

Định dạng chung của new khi áp dụng cho mảng một chiều là:
mảng-var = kiểu mới;
trong đó kiểu là kiểu dữ liệu được phân phối, kích thước là số phần tử trong mảng, array-var là một biến được liên kết với mảng. Để sử dụng new để cấp phát bộ nhớ cho một mảng, bạn cần chỉ định loại và số lượng phần tử mảng. Các phần tử trong mảng được phân bổ bằng thao tác mới sẽ tự động được khởi tạo về 0. Ví dụ sau đây phân bổ bộ nhớ cho mảng số nguyên 12 phần tử và liên kết nó với biến tháng_ngày.
tháng_ngày = int mới;
Sau khi câu lệnh này được thực thi, tháng_days sẽ đề cập đến một mảng gồm 12 số nguyên. Khi đó tất cả các phần tử trong mảng sẽ được khởi tạo về 0.
Quá trình lấy một mảng bao gồm hai bước. Đầu tiên, bạn phải khai báo một biến mảng có kiểu mong muốn. Thứ hai, bạn cần phân bổ bộ nhớ sẽ chứa mảng bằng thao tác mới và gán nó cho một biến mảng. Do đó trong Java tất cả các mảng được phân bổ động.

Khi bạn đã cấp phát bộ nhớ cho một mảng, bạn có thể truy cập một phần tử cụ thể trong đó bằng cách chỉ định một chỉ mục trong dấu ngoặc vuông. Việc đánh số các phần tử mảng bắt đầu từ số 0. Tên mảng là tài liệu tham khảo.

Có thể kết hợp khai báo một biến mảng và cấp phát bộ nhớ cho mảng trực tiếp trong khai báo:
int tháng_ngày = int mới;

Hãy xem xét mã của một chương trình thay thế các phần tử âm của một mảng bằng phần tử lớn nhất:

Lớp công khai FindReplace ( public static void main(String args) ( int myArray; // khai báo không khởi tạo int mySecond = new int; /* cấp phát bộ nhớ với khởi tạo giá trị mặc định */ int a = (5, 10, 0, -5 , 16, -2); // khai báo có khởi tạo int max = a; for (int i = 0; i< a.length; i++) { if (a[i]<0) a[i] = max; mySecond[i] = a[i]; System.out.println("a[" + i + "]=" + a[i]); } myArray = a; // установка ссылки на массив a } }

Kết quả thực hiện sẽ là:

>java FindReplace a=5 a=10 a=0 a=5 a=16 a=5

Việc gán mySecond[i] = a[i] sẽ khiến một phần các phần tử của mảng mySecond, cụ thể là sáu, được gán giá trị của các phần tử của mảng a. Các phần tử còn lại của mySecond sẽ giữ lại các giá trị thu được trong quá trình khởi tạo, tức là các số 0. Nếu phép gán được tổ chức dưới dạng mySecond = a hoặc myArray = a thì cả hai mảng tham gia phép gán sẽ nhận được tham chiếu đến mảng a, nghĩa là cả hai sẽ chứa sáu phần tử và tham chiếu đến cùng một vị trí bộ nhớ.
Mảng có thể được khởi tạo tại thời điểm chúng được khai báo. Quá trình này rất giống với quá trình được sử dụng để khởi tạo các kiểu đơn giản. Trình khởi tạo mảng là danh sách các biểu thức được phân tách bằng dấu phẩy được bao quanh bởi dấu ngoặc nhọn. Mảng sẽ tự động được tạo đủ lớn để chứa bao nhiêu phần tử mà bạn chỉ định trong bộ khởi tạo mảng. Không cần phải sử dụng thao tác mới. Ví dụ: để lưu trữ số ngày trong mỗi tháng, đoạn mã sau tạo một mảng số nguyên được khởi tạo:

Lớp công khai ThángNgày ( public static void main(String args) ( int tháng_days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); System.out.println("April chứa " + tháng_ngày + " ngày."); ) )

Kết quả khi thực hiện chương trình, trên màn hình sẽ hiển thị như sau:

Tháng Tư có 30 ngày.

Bình luận: Java thực hiện kiểm tra nghiêm ngặt để đảm bảo bạn không vô tình cố lưu trữ hoặc đọc các giá trị bên ngoài vùng lưu trữ của mảng. Hệ thống điều hành Java cũng thực hiện kiểm tra cẩn thận để đảm bảo rằng tất cả các chỉ số mảng đều nằm trong phạm vi chính xác. (Về vấn đề này Java khác biệt đáng kể so với các ngôn ngữ C/C++, không cung cấp khả năng kiểm tra giới hạn thời gian chạy).

Mảng đa chiều trong Java

TRONG Mảng đa chiều Java trên thực tế là mảng của mảng. Chúng trông và hoạt động giống như các mảng đa chiều thông thường. Tuy nhiên, có một vài khác biệt tinh tế. Để khai báo một biến mảng nhiều chiều, hãy xác định từng chỉ mục bổ sung bằng cách sử dụng một bộ dấu ngoặc vuông khác nhau. Ví dụ: câu lệnh sau khai báo một biến mảng hai chiều có tên twoD:
int twoD = int mới;
Nó phân bổ bộ nhớ cho một mảng 4x5 và gán nó cho biến twoD. Trong nội bộ, ma trận này được triển khai dưới dạng một mảng gồm các số nguyên kiểu int.
Mảng đa chiều có thể được khởi tạo. Để thực hiện việc này, chỉ cần bao gồm trình khởi tạo của mỗi thứ nguyên trong bộ dấu ngoặc nhọn riêng của nó.
Chương trình sau đây tạo và khởi tạo các mảng có độ dài bằng nhau (ma trận) và thực hiện tích của ma trận này với ma trận khác:

Lớp công khai Ma trận ( private int a; Matrix(int ​​​​n, int m) ( // tạo và điền ngẫu nhiên a = new int[n][m]; for (int i = 0; i< n; ++i) for (int j = 0; j < m; ++j) a[i][j] = (int) (Math.random()*5); show(); } public Matrix(int n, int m, int k) { // создание и заполнение с random a = new int[n][m]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = k; if (k != 0) show(); } public void show() { System.out.println("Матрица:" + a.length + " на " + a.length); for (int i = 0; i < a.length; ++i) { for (int j = 0; j < a.length; ++j) System.out.print(a[i][j] + " "); System.out.println(); } } public static void main(String args) { int n = 2, m = 3, z = 4; Matrix p = new Matrix(n, m); Matrix q = new Matrix(m, z); Matrix r = new Matrix(n, z, 0); for (int i = 0; i < p.a.length; ++i) for (int j = 0; j < q.a.length; ++j) for (int k = 0; k < p.a[i].length; ++k) r.a[i][j] += p.a[i][k]*q.a[k][j]; System.out.println("Произведение матриц: "); r.show(); } }

Vì các giá trị được gán cho các phần tử mảng bằng phương thức Random(), nên một trong các tùy chọn để thực thi mã có thể là như sau:

> javac Matrix.java > java Ma trận ma trận:2 x 3 3 2 0 3 3 1 Ma trận:3 x 4 1 2 2 3 3 2 3 2 1 2 3 2 Tích của ma trận: Ma trận:2 x 4 9 10 12 13 13 14 18 17

Ví dụ sau minh họa việc sao chép một mảng:

Lớp công khai ArrayCopyDemo ( public static void main(String args) ( int mas1 = (1,2,3), mas2 = (4,5,6,7,8,9); System.out.print("mas1: " ); show(mas1); System.out.print("mas2: "); // sao chép mảng mas1 sang mas2 System.arraycopy(mas1, 0, mas2, 2, 3); * 2 - phần tử bắt đầu thay thế * 3 - số phần tử được sao chép */ System.out.println("\n sau arraycopy(): "); ; show(mas1); System.out.print("\nmas2: "); riêng tư tĩnh void show(int mas) ( for (int i = 0; i< mas.length; ++i) System.out.print(" " + mas[i]); } }

Kết quả thực hiện chương trình:

> javac ArrayCopyDemo.java > java ArrayCopyDemo mas1: 1 2 3mas2: 4 5 6 7 8 9 sau arraycopy(): mas1: 1 2 3 mas2: 4 5 1 2 3 9

Cú pháp khai báo mảng thay thế

Có một dạng khác có thể được sử dụng để khai báo một mảng:
gõ tên var;
Ở đây dấu ngoặc vuông tuân theo bộ xác định loại chứ không phải tên biến mảng. Ví dụ: hai khai báo sau là tương đương:

Int al = int mới; int a2 = int mới;
Các khai báo được trình bày ở đây cũng tương đương với:
char twodi = char mới; char twod2 = char mới;
Hình thức thông báo thay thế này được đưa vào chủ yếu để thuận tiện.

Mảng là một cấu trúc dữ liệu được thiết kế để lưu trữ dữ liệu cùng loại. Mảng hoạt động khác trong Java so với trong C/C++. Đặc điểm:

  • Vì mảng là đối tượng nên chúng ta có thể tìm thấy độ dài của chúng. Điều này khác với C/C++ nơi chúng tôi tìm thấy độ dài bằng sizeof.
  • Một biến mảng cũng có thể là .
  • Các biến được sắp xếp theo thứ tự và có chỉ số bắt đầu từ 0.
  • Cũng có thể được sử dụng làm trường tĩnh, biến cục bộ hoặc tham số phương thức.
  • Kích thước của mảng phải được chỉ định là int, không dài hoặc ngắn.
  • Siêu lớp trực tiếp của kiểu mảng là Object.
  • Mỗi loại mảng triển khai các giao diện Cloneable và java.io.Serializable.

Khởi tạo và truy cập mảng

Mảng một chiều: Mẫu khai báo chung

Nhập tên var; hoặc gõ tên var;

Một khai báo bao gồm hai thành phần: một kiểu và một tên. type khai báo kiểu của một phần tử mảng. Kiểu phần tử xác định kiểu dữ liệu của từng phần tử.

Ngoài kiểu int, chúng ta còn có thể tạo một mảng gồm các kiểu dữ liệu khác như char, float, double hoặc kiểu dữ liệu do người dùng định nghĩa (đối tượng lớp). Do đó, kiểu phần tử xác định kiểu dữ liệu nào sẽ được lưu trữ trong mảng. Ví dụ:

// cả hai đều là khai báo hợp lệ int intArray; hoặc int intArray; byte byteArray; quần shortArray; boolean booleanArray; dài longArray; float floatArray; đôi đôiArray; char charArray; // một mảng các tham chiếu đến các đối tượng của // lớp MyClass (một lớp được tạo bởi // người dùng) MyClass myClassArray; Đối tượng ao, // mảng Bộ sưu tập đối tượng ca; // mảng Bộ sưu tập // có kiểu không xác định

Mặc dù khai báo đầu tiên ở trên chứng minh rằng intArray là một biến mảng nhưng mảng đó không thực sự tồn tại. Nó chỉ đơn giản cho trình biên dịch biết rằng biến này có kiểu số nguyên.

Để liên kết một mảng int với một mảng số nguyên vật lý thực tế, bạn cần biểu thị nó bằng new và gán nó cho int.

Cách tạo một mảng trong Java

Khi khai báo một mảng, chỉ có một tham chiếu đến mảng được tạo. Để thực sự tạo hoặc cấp phát bộ nhớ cho một mảng, bạn cần tạo mảng như sau: Dạng tổng quát của new khi áp dụng cho mảng một chiều như sau:
var-name = kiểu mới;

Ở đây type cho biết kiểu dữ liệu, size là số phần tử trong mảng và var-name là tên của biến mảng.

intArray; // khai báo intArray = new int; // cấp phát bộ nhớ

Int intArray = int mới; // Liên hiệp

Điều quan trọng cần biết là các phần tử mảng được hàm mới phân bổ sẽ tự động được khởi tạo về 0 (đối với kiểu số), sai (đối với kiểu Boolean) hoặc 0 (đối với kiểu tham chiếu).
Lấy một mảng là một quá trình gồm hai bước. Đầu tiên, bạn cần khai báo một biến có kiểu mong muốn. Thứ hai, bạn cần phân bổ bộ nhớ sẽ chứa mảng bằng cách sử dụng new và gán nó cho một biến. Vì vậy, trong Java, tất cả các mảng đều được phân bổ động.

Mảng chữ

Trong trường hợp đã biết kích thước mảng và các biến, có thể sử dụng chữ.

Int intArray = int mới (1,2,3,4,5,6,7,8,9,10 ); // Khai báo mảng bằng chữ

  • Độ dài của mảng này xác định độ dài của mảng được tạo.
  • Không cần viết int trong các phiên bản Java mới nhất

Truy cập các phần tử mảng Java bằng vòng lặp For

Mỗi phần tử mảng được truy cập thông qua chỉ mục của nó. Chỉ số bắt đầu từ 0 và kết thúc ở (tổng kích thước) -1. Tất cả các phần tử có thể được truy cập bằng vòng lặp for.

Với (int i = 0; tôi< arr.length; i++) System.out.println("Element at index " + i + " : "+ arr[i]);

// Một ví dụ minh họa việc tạo một mảng
// số nguyên, đặt một số giá trị vào một mảng,
// và in từng giá trị.

lớp GFG
{

{

int mảng;

// cấp phát bộ nhớ cho 5 số nguyên.
mảng = int mới;


mảng = 10;


mảng = 20;

//sớm...
mảng = 30;
mảng = 40;
mảng = 50;

// truy cập các phần tử của mảng đã chỉ định
vì (int i = 0; tôi< arr.length; i++)
System.out.println("Phần tử ở chỉ mục " + i +
" : "+ mảng[i]);
}
}
Kết quả là chúng tôi nhận được:

Phần tử tại chỉ số 0: 10 Phần tử tại chỉ mục 1: 20 Phần tử tại chỉ mục 2: 30 Phần tử tại chỉ mục 3: 40 Phần tử tại chỉ mục 4: 50

Mảng đối tượng

Một mảng các đối tượng được tạo theo cách tương tự như các phần tử dữ liệu như sau:

Sinh viên arr = Sinh viên mới;

StudentArray chứa bảy phần tử bộ nhớ của mỗi lớp sinh viên, trong đó địa chỉ của bảy đối tượng Sinh viên có thể được lưu trữ. Các đối tượng sinh viên phải được tạo bằng cách sử dụng hàm tạo của lớp sinh viên và các tham chiếu của chúng phải được gán cho các phần tử mảng như sau:

Sinh viên arr = Sinh viên mới;

// Chương trình Java minh họa việc tạo một mảng các
// các đối tượng

lớp học sinh viên
{
int roll_no công khai;
tên chuỗi công khai;
Sinh viên(int roll_no, Tên chuỗi)
{
this.roll_no = roll_no;
this.name = tên;
}
}

// Các phần tử của mảng là đối tượng của lớp Sinh viên.
lớp công khai GFG
{
public static void main (String args)
{
// khai báo một mảng số nguyên.
Sinh viên;

// cấp phát bộ nhớ cho 5 đối tượng kiểu Sinh viên.
arr = Sinh viên mới;

// khởi tạo các phần tử đầu tiên của mảng
arr = Sinh viên mới(1,"aman");

// khởi tạo phần tử thứ hai của mảng
arr = Sinh viên mới(2,"vaibhav");

// sớm...
arr = Sinh viên mới(3,"shikar");
arr = Sinh viên mới(4,"dharmesh");
arr = Sinh viên mới(5,"mohit");

// truy cập các phần tử của mảng đã chỉ định
vì (int i = 0; tôi< arr.length; i++)
System.out.println("Phần tử tại " + i + " : " +
arr[i].roll_no +" "+ arr[i].name);
}
}

Chúng tôi nhận được:

Phần tử ở mức 0: 1 aman Phần tử ở mức 1: 2 vaibhav Phần tử ở mức 2: 3 shikar Phần tử ở mức 3: 4 dharmesh Phần tử ở mức 4: 5 mohit

Điều gì xảy ra nếu chúng ta cố gắng truy cập một phần tử bên ngoài mảng?
Trình biên dịch ném ra một ngoại lệ ArrayIndexOutOfBoundsException chỉ ra rằng mảng được truy cập ở một chỉ mục không hợp lệ. Chỉ số này âm hoặc lớn hơn hoặc bằng kích thước của mảng.

đa chiều

Mảng nhiều chiều là mảng gồm nhiều mảng trong đó mỗi phần tử chứa một tham chiếu đến mảng khác. Được tạo bằng cách thêm một bộ dấu ngoặc vuông () cho mỗi chiều. Hãy xem một ví dụ:

Int intArray = int mới; // một mảng hoặc ma trận 2D int intArray = new int; // một mảng 3D

lớp đa chiều
{
public static void main(String args)
{
// khai báo và khởi tạo mảng 2D
int mảng = ( (2,7,9),(3,6,1),(7,4,2) );

// in mảng 2D
vì (int i=0; tôi< 3 ; i++)
{
vì (int j=0; j< 3 ; j++)
System.out.print(arr[i][j] + " ");

System.out.println();
}
}
}

Đầu ra: 2 7 9 3 6 1 7 4 2


Truyền mảng cho một phương thức

Cũng giống như các biến, chúng ta có thể truyền mảng cho các phương thức.

// Chương trình Java để chứng minh // truyền mảng sang lớp phương thức Test ( // Phương thức trình điều khiển public static void main(String args) ( int arr = (3, 1, 2, 5, 4); // truyền mảng tới phương thức m1 sum(arr); ) public static void sum(int arr) ( // lấy tổng các giá trị mảng int sum = 0; for (int i = 0; i< arr.length; i++) sum+=arr[i]; System.out.println("sum of array values: " + sum); } }

Ở đầu ra, chúng tôi nhận được:

tổng giá trị mảng: 15

Trả về mảng từ các phương thức

Như thường lệ, phương thức này cũng có thể trả về một mảng. Ví dụ: chương trình bên dưới trả về một mảng từ phương thức m1.

// Chương trình Java để chứng minh // trả về mảng từ lớp phương thức Test ( // Trình điều khiển phương thức public static void main(String args) ( int arr = m1(); for (int i = 0; i< arr.length; i++) System.out.print(arr[i]+" "); } public static int m1() { // returning array return new int{1,2,3}; } }

Đối tượng lớp

Mỗi mảng có một đối tượng lớp liên kết được chia sẻ với tất cả các mảng khác có cùng loại thành phần.

// Chương trình Java để chứng minh // Đối tượng lớp cho lớp mảng Test ( public static void main(String args) ( int intArray = new int; byte byteArray = new byte; short shortsArray = new short; // mảng chuỗi String strArray = Chuỗi mới; System.out.println(intArray.getClass()); System.out.println(intArray.getClass().getSuperclass()); System.out.println(byteArray.getClass()); getClass()); System.out.println(strArray.getClass());

lớp +" "); ) ) )

Một bản sao của mảng nhiều chiều (chẳng hạn như Object ) là một bản sao, nghĩa là nó chỉ tạo một mảng mới với mỗi phần tử và một tham chiếu đến mảng phần tử ban đầu, nhưng các mảng lồng nhau được chia sẻ.

// Chương trình Java để minh họa // sao chép mảng đa chiều class Test ( public static void main(String args) ( int intArray = ((1,2,3),(4,5)); int cloneArray = intArray. clone(); // sẽ in sai System.out.println(intArray == cloneArray); // sẽ in đúng khi bản sao nông được tạo // tức là các mảng con được chia sẻ System.out.println(intArray == cloneArray) ; System.out.println(intArray == cloneArray) )

  • Java,
  • Thuật toán
    • Hướng dẫn

    Tôi nghĩ rằng rất ít người chuẩn bị cho cuộc phỏng vấn đầu tiên khi ứng tuyển vào công việc đầu tiên với tư cách là một lập trình viên cấp dưới sẽ trả lời câu hỏi này theo hướng tiêu cực. Hoặc ít nhất là nghi ngờ câu trả lời tích cực. Tất nhiên, cấu trúc dữ liệu đơn giản như vậy có khả năng truy cập chỉ mục trực tiếp - không cần thủ thuật! Không, trong một số ngôn ngữ như JavaScript hoặc PHP, mảng tất nhiên được triển khai theo một cách rất thú vị và về cơ bản không chỉ là một mảng. Nhưng đây không phải là điều chúng ta đang nói đến mà là về cách triển khai mảng “truyền thống” dưới dạng một “mảnh bộ nhớ liên tục”. Trong trường hợp này, dựa trên các chỉ số và kích thước của một phần tử, địa chỉ được tính toán đơn giản và giá trị tương ứng được truy cập. Có gì khó khăn thế?
    Hãy tìm ra nó. Ví dụ: trong Java. Yêu cầu người nộp đơn không nghi ngờ tạo một mảng số nguyên N x N. Người đó tự tin viết một cái gì đó như:
    int g = int mới[n][n];
    Tuyệt vời. Bây giờ chúng tôi yêu cầu bạn khởi tạo các phần tử mảng bằng một cái gì đó. Ít nhất là theo đơn vị, ít nhất là tổng của các chỉ số. Chúng tôi nhận được:
    for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Họ thậm chí còn viết thường xuyên hơn
    for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    đó cũng là lý do để trò chuyện, nhưng bây giờ chúng ta đang nói về một điều khác. Chúng tôi đang cố gắng tìm hiểu những gì một người biết và xem anh ta nghĩ như thế nào. Do đó, chúng tôi thu hút sự chú ý của anh ấy đến thực tế là các giá trị được đặt đối xứng và yêu cầu anh ấy lưu lại các lần lặp vòng lặp. Tất nhiên, tại sao phải đi qua tất cả các giá trị chỉ số khi bạn chỉ có thể đi qua hình tam giác phía dưới? Đối tượng thường dễ dàng đồng ý và làm nổi bật đường chéo chính một cách khôn ngoan, cẩn thận viết những điều như:
    for(int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    Thay vì g[i][i] = 2* i; thường được viết g[i][i] = i + i; hoặc g[i][i] = tôi<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Chương trình sẽ chạy nhanh hơn bao nhiêu?. Lý do thông thường như sau: tính toán chỉ số ít hơn gần 2 lần; tính toán giá trị ít hơn gần 2 lần (tổng hợp); số lượng nhiệm vụ như nhau. Điều này có nghĩa là nhanh hơn 30 phần trăm. Nếu một người có nền tảng toán học tốt, thì bạn thậm chí có thể thấy chính xác số lượng thao tác đã lưu và đánh giá hợp lý hơn về hiệu quả của việc tối ưu hóa.
    Bây giờ là lúc diễn ra đòn chính. Chúng tôi chạy cả hai phiên bản mã trên một số giá trị đủ lớn N(khoảng vài nghìn), ví dụ như thế này.

    Mã kiểm soát thời gian

    lớp A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0;< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    Chúng ta thấy gì? Phiên bản tối ưu hóa hoạt động chậm hơn 10-100 lần! Bây giờ là lúc quan sát phản ứng của ứng viên đối với vị trí này. Phản ứng với một tình huống căng thẳng bất thường (chính xác hơn là thông thường trong thực tế của nhà phát triển) sẽ là gì. Nếu khuôn mặt của bị cáo tỏ ra phấn khích và anh ta bắt đầu bấm nút, tạm thời quên mất sự tồn tại của bạn thì đây là một dấu hiệu tốt. Đến một mức độ nhất định. Bạn không muốn thuê một nhà nghiên cứu không quan tâm đến kết quả của dự án, phải không? Vậy thì đừng hỏi anh ấy câu hỏi "Tại sao?" Yêu cầu họ làm lại tùy chọn thứ hai để nó thực sự hoạt động nhanh hơn tùy chọn đầu tiên.
    Bây giờ bạn có thể an tâm tiếp tục công việc kinh doanh của mình trong một thời gian. Trong nửa giờ, bạn sẽ có đủ tài liệu để đánh giá những phẩm chất cá nhân và nghề nghiệp cơ bản của người nộp đơn.
    Nhân tiện, khi tôi mô tả ngắn gọn vấn đề này trên trang web làm việc của mình, nhận xét phổ biến nhất là “Đây là đường cong Java của bạn”. Tôi đang đăng mã trên Tuyệt vời và Miễn phí, đặc biệt dành cho họ. Và những chủ sở hữu vui vẻ của Pascal miễn phí cho Windows có thể xem qua

    dưới tấm lướt gió

    Thời gian chương trình; sử dụngWindows; var bắt đầu, kết thúc, res: int64; n, i, j: Số nguyên; g: Mảng số nguyên; bắt đầu n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(bắt đầu); for i:=1 to n-1 do for j:=1 to n-1 do g := i + j; QueryPerformanceCounter(kết thúc); writeln("Thời gian theo hàng:", (kết thúc - bắt đầu) / res, " giây"); QueryPerformanceCounter(bắt đầu); for i:=1 to n-1 do for j:=1 to n-1 do g := i + j; QueryPerformanceCounter(kết thúc); writeln("Thời gian tính bằng cols:", (kết thúc - bắt đầu) / res, " giây"); kết thúc.


    Trong đoạn mã trên bằng Pascal, tôi đã loại bỏ các khía cạnh “khó hiểu” và chỉ để lại bản chất của vấn đề. Nếu điều này có thể được gọi là một vấn đề.
    Chúng ta sẽ hỏi bị cáo những câu hỏi gì?
    1. Tại sao nó hoạt động chậm hơn? Và chi tiết hơn...
    2. Làm thế nào để khởi tạo nhanh hơn?

    Nếu có nhu cầu tìm hiểu sâu hơn về cách triển khai Java, thì chúng tôi yêu cầu người nộp đơn quan sát thời gian thực hiện đối với các giá trị nhỏ N. Ví dụ: trên ideone.com với n=117, tùy chọn “tối ưu hóa” chậm bằng một nửa. Nhưng đối với giá trị tiếp theo n=118, nó nhanh hơn 100 (một trăm) lần so với giá trị không được tối ưu hóa! Đề nghị thử nghiệm trên máy cục bộ. Hãy để anh ấy chơi với các cài đặt.
    Nhân tiện, mọi người có hiểu chuyện gì đang xảy ra không?

    Một vài lời biện minh

    Tôi muốn nói vài lời để biện minh cho phương pháp phỏng vấn tuyển dụng này. Có, tôi không kiểm tra kiến ​​thức về cú pháp ngôn ngữ và kiến ​​thức về cấu trúc dữ liệu. Có lẽ, trong một thị trường lao động văn minh, tất cả những điều này đều có tác dụng. Nhưng trong điều kiện chúng ta đang thiếu hụt hoàn toàn nhân sự có trình độ, cần phải đánh giá mức độ phù hợp lâu dài của người nộp đơn đối với công việc mà anh ta sẽ phải đối mặt. Những thứ kia. khả năng học hỏi, đột phá, hiểu biết, làm việc.
    Điều này có tinh thần tương tự như cuộc “phỏng vấn” tuyển mộ lính lê dương ở La Mã cổ đại. Người chiến binh tương lai vô cùng sợ hãi và quan sát xem anh ta có đỏ mặt hay tái nhợt không. Nếu anh ta tái mặt, thì trong tình huống căng thẳng, máu sẽ chảy ra khỏi đầu người nộp đơn và anh ta dễ có phản ứng thụ động. Ví dụ như ngất xỉu. Nếu người nộp đơn đỏ mặt thì máu dồn lên đầu. Những thứ kia. anh ta có xu hướng hành động tích cực và lao vào đánh nhau. Điều này được coi là phù hợp.
    Vâng, một điều cuối cùng. Tại sao tôi lại nói với mọi người về vấn đề này thay vì tiếp tục sử dụng nó trong các cuộc phỏng vấn? Chỉ là những ứng viên tiềm năng đã “học” được nhiệm vụ này và phải sử dụng những nhiệm vụ khác.
    Trên thực tế, tôi chú ý đến hiệu ứng này một cách chính xác liên quan đến nhiệm vụ thực sự của việc xử lý hình ảnh. Tình huống có phần khó hiểu và tôi không hiểu ngay tại sao khung hình/giây của mình lại giảm nhiều như vậy sau khi tái cấu trúc. Nói chung chắc hẳn ai cũng có rất nhiều khoảnh khắc tuyệt vời như vậy.

    Cho đến nay, phiên bản hàng đầu là bộ nhớ đệm của bộ xử lý là nguyên nhân. Những thứ kia. truy cập tuần tự trong tùy chọn đầu tiên hoạt động trong một hàm băm, được cập nhật khi di chuyển ra ngoài một ranh giới nhất định. Khi truy cập theo cột, hàm băm buộc phải cập nhật liên tục và việc này mất rất nhiều thời gian. Hãy kiểm tra phiên bản này ở dạng tinh khiết nhất của nó. Hãy tạo một mảng và so sánh cái nào nhanh hơn - xử lý tất cả các phần tử trong một hàng hay xử lý các phần tử mảng có số ngẫu nhiên với cùng số lần? Chương trình này là ideone.com/tMaR2S. Đối với 100.000 phần tử mảng, truy cập ngẫu nhiên thường nhanh hơn đáng kể. Điều đó có nghĩa là gì?
    Ở đây, tôi (Big_Lebowski) đã chỉ ra khá đúng rằng việc sắp xếp lại các vòng lặp sẽ thay đổi kết quả theo hướng có lợi cho tùy chọn tuần tự. Để đảm bảo độ thuần khiết của thí nghiệm, tôi phải thiết lập một chu trình khởi động. Đồng thời, tôi thực hiện lặp lại nhiều lần để có thời gian hoạt động trung bình như lời khuyên của Leventov. Hóa ra như thế này ideone.com/yN1H4g. Những thứ kia. Truy cập ngẫu nhiên vào các phần tử của một mảng lớn chậm hơn ~ 10% so với truy cập tuần tự. Có lẽ bộ đệm thực sự có thể đóng một vai trò nào đó. Tuy nhiên, trong tình huống ban đầu, hiệu suất giảm đáng kể. Vì vậy, có một cái gì đó khác.

    Dần dần, phiên bản về các hành động bổ sung khi di chuyển từ hàng này sang hàng khác đang trở thành người dẫn đầu. Và nó đúng. Vẫn còn phải tìm hiểu chính xác những gì đang xảy ra ở đó.

    thẻ:

    • Lập trình
    • mảng
    • ký ức
    Thêm nhãn Mảng là một cấu trúc dữ liệu lưu trữ các giá trị cùng loại. Một phần tử mảng riêng lẻ được truy cập bằng chỉ mục số nguyên. Ví dụ: nếu a là một mảng các số nguyên thì giá trị của biểu thức a[i] bằng số nguyên thứ i trong mảng. Một mảng được khai báo như sau: đầu tiên, loại của mảng được chỉ định, tức là loại phần tử có trong mảng, theo sau là một cặp dấu ngoặc vuông trống và sau đó là tên của biến. Ví dụ: đây là cách khai báo một mảng gồm các số nguyên: int a; Tuy nhiên, câu lệnh này chỉ khai báo biến a mà không khởi tạo nó bằng một mảng thực tế. Để tạo một mảng, bạn cần sử dụng toán tử mới. int a = int mới [ 100 ] ; Toán tử này tạo ra một mảng gồm 100 số nguyên. Các phần tử của mảng này được đánh số từ 0 đến 99 (không phải từ 1 đến 100). Sau khi được tạo, mảng có thể được lấp đầy, chẳng hạn bằng cách sử dụng vòng lặp. int a = int mới [ 100 ] ; vì (int i = 0; tôi< 100 ; i++ ) a[ i] = i; // Điền vào mảng các số từ 0 đến 99 Nếu bạn cố gắng truy cập phần tử a (hoặc bất kỳ phần tử nào khác có chỉ mục nằm ngoài phạm vi từ 0 đến 99) bằng cách tạo một mảng gồm 100 phần tử, chương trình sẽ chấm dứt vì sẽ xảy ra ngoại lệ chỉ số mảng nằm ngoài phạm vi giới hạn. Để đếm số phần tử trong một mảng, hãy sử dụng phương thức Arrayname.length. Ví dụ: với (int i = 0; i< a. length; i++ , System. out. println (a[ i] ) ) ; После создания массива изменить его размер невозможно (хотя можно, конечно, изменять отдельные его элементы). Если в ходе выполнения программы необходимо часто изменять размер массива, лучше использовать другую структуру данных, называемую списком массивов (array list). Массив можно объявить двумя способами: int a; или int a ; Большинство программистов на языке Java предпочитают первый стиль, поскольку в нем четче отделяется тип массива int (целочисленный массив) от имени переменной.

    Bộ khởi tạo mảng và mảng không tên

    Java có một phương tiện để đồng thời tạo và khởi tạo một mảng. Đây là một ví dụ về cấu trúc cú pháp như vậy: int SmallPrimes = (2, 3, 5, 7, 11, 13); Lưu ý rằng trong trường hợp này không cần sử dụng toán tử mới. Ngoài ra, bạn thậm chí có thể khởi tạo một mảng chưa được đặt tên: new int (16, 19, 23, 29, 31, 37) Biểu thức này phân bổ bộ nhớ cho một mảng mới và điền vào mảng đó các số được chỉ định trong dấu ngoặc nhọn. Trong trường hợp này, số lượng của chúng được tính toán và theo đó, kích thước của mảng được xác định. Cấu trúc cú pháp này rất thuận tiện khi sử dụng để khởi tạo lại một mảng mà không cần tạo biến mới. Ví dụ: biểu thức smallPrimes = new int (17, 19, 23, 29, 31, 37); là phiên bản viết tắt của biểu thức int ẩn danh = (17, 19, 23, 29, 31, 37); SmallPrimes = ẩn danh; Có thể tạo một mảng có kích thước bằng 0. Một mảng như vậy có thể hữu ích khi viết một phương thức đánh giá một mảng hóa ra trống. Một mảng có độ dài bằng 0 được khai báo như sau: Kiểu phần tử mới Lưu ý rằng mảng như vậy không tương đương với một đối tượng null.

    Sao chép mảng

    Một mảng có thể được sao chép sang mảng khác, nhưng cả hai biến sẽ tham chiếu đến cùng một mảng. int luckyNumbers = SmallPrimes; số may mắn[ 5] = 12 ; // Bây giờ phần tử SmallPrimes cũng là 12 Kết quả được hiển thị trong hình. 3.1. Nếu bạn cần sao chép tất cả các phần tử của mảng này sang mảng khác, bạn nên sử dụng phương thức arraycopy từ lớp System. Cuộc gọi của nó trông như thế này: System. bản sao mảng (từ, fromlndex, to, tolndex, count); Mảng to phải đủ lớn để chứa tất cả các phần tử cần sao chép. Hình.3.1. Sao chép một mảng Ví dụ: các toán tử được hiển thị bên dưới, kết quả của chúng được hiển thị trong Hình. 3.2, tạo hai mảng rồi sao chép bốn phần tử cuối cùng của mảng đầu tiên vào mảng thứ hai. Quá trình sao chép bắt đầu từ vị trí thứ hai trong mảng nguồn và các phần tử được sao chép được đặt trong mảng đích bắt đầu từ vị trí thứ ba. int SmallPrimes = (2, 3, 5, 7, 11, 13); int số may mắn = (1001, 1002, 1003, 1004, 1005, 1006, 1007); Hệ thống. công cụ thẩm định (smallPrimes, 2, luckyNumbers, 3, 4); vì (int i = 0; tôi< luckyNumbers. length; i++ ) System. out. println (i + ": " + luckyNumbers[ i] ) ; Выполнение этих операторов приводит к следующему результату. 0 : 1001 1 : 1002 2 : 1003 3 : 5 4 : 7 5 : 11 6 : 13 Cơm. 3.2. Sao chép các phần tử mảng Mảng trong Java khác biệt đáng kể so với mảng trong C++. Tuy nhiên, thực tế nó giống như một con trỏ tới một mảng động. Điều này có nghĩa là toán tử int a = new int [ 100 ] ; // Java tương đương với toán tử int * = new int [ 100 ] ; //C++, không phải int a[ 100 ] ; //C++ Trong ngôn ngữ Java, toán tử mặc định kiểm tra phạm vi thay đổi chỉ mục. Ngoài ra, Java không có con trỏ số học—bạn không thể tăng con trỏ để truy cập phần tử tiếp theo của mảng. Liên kết đến đầu tiên