Câu hỏi Làm thế nào để khai báo và khởi tạo một mảng trong Java?


Làm thế nào để khai báo và khởi tạo một mảng trong Java?


1617
2017-07-29 14:22


gốc


Có java 10 cho phép khai báo mảng qua var? - gstackoverflow


Các câu trả lời:


Bạn có thể sử dụng khai báo mảng hoặc mảng chữ (nhưng chỉ khi bạn khai báo và ảnh hưởng đến biến ngay lập tức, mảng chữ không thể được sử dụng để gán lại một mảng).

Đối với các kiểu nguyên thủy:

int[] myIntArray = new int[3];
int[] myIntArray = {1,2,3};
int[] myIntArray = new int[]{1,2,3};

Đối với các lớp học, ví dụ String, Nó giống nhau:

String[] myStringArray = new String[3];
String[] myStringArray = {"a","b","c"};
String[] myStringArray = new String[]{"a","b","c"};

Cách thứ ba của việc khởi tạo là hữu ích khi bạn khai báo mảng đầu tiên và sau đó khởi tạo nó. Các diễn viên là cần thiết ở đây.

String[] myStringArray;
myStringArray = new String[]{"a","b","c"};

2192
2017-07-09 21:59



Mục đích của việc có cả hai cách thứ hai và thứ ba để làm điều đó là gì? - Quazi Irfan
@iamcreasy Có vẻ như cách thứ hai không hoạt động với các câu lệnh trả về. return {1,2,3} đưa ra một lỗi, trong khi return new int[]{1,2,3} hoạt động tốt (giả sử tất nhiên là hàm của bạn trả về một mảng nguyên). - Skylar Ittner
@SkylarMT Nhưng chúng ta vẫn có thể sử dụng cách đầu tiên để sử dụng với câu lệnh return. - Quazi Irfan
@iamcreasy Gần đây tôi đã viết một hàm trả về một mảng ints. Nếu một lỗi xảy ra bên trong hàm, tôi muốn nó trả về một giá trị nào đó, nhưng hàm cần trả về một mảng. Cách nào hoạt động cho một tuyên bố trả về một lớp? Chỉ thứ ba. - Skylar Ittner
@apadana Trong trường hợp thứ hai, bạn đang tạo một đối tượng ẩn danh chỉ được định nghĩa trong phạm vi kèm theo (hàm hoặc bất kỳ thứ gì). Sau khi trả lại cho người gọi, nó không còn hợp lệ nữa. Sử dụng từ khóa mới, bạn phân bổ đối tượng mới từ heap và nó hợp lệ bên ngoài phạm vi xác định. - teukkam


Có hai loại mảng.
 

Một mảng chiều

Cú pháp cho các giá trị mặc định:

int[] num = new int[5];

Hoặc (ít được ưa thích hơn)

int num[] = new int[5];

Cú pháp với các giá trị đã cho (khởi tạo biến / trường):

int[] num = {1,2,3,4,5};

Hoặc (ít được ưa thích hơn)

int num[] = {1, 2, 3, 4, 5};

Ghi chú: Để thuận tiện, int [] num thích hợp hơn vì nó cho biết rõ ràng bạn đang nói ở đây về mảng. Nếu không thì không có sự khác biệt. Không có gì.

Mảng đa chiều

Tờ khai

int[][] num = new int[5][2];

Hoặc là

int num[][] = new int[5][2];

Hoặc là

int[] num[] = new int[5][2];

Khởi tạo

 num[0][0]=1;
 num[0][1]=2;
 num[1][0]=1;
 num[1][1]=2;
 num[2][0]=1;
 num[2][1]=2;
 num[3][0]=1;
 num[3][1]=2;
 num[4][0]=1;
 num[4][1]=2;

Hoặc là

 int[][] num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} };

Ragged Array (hoặc mảng hình chữ nhật không)

 int[][] num = new int[5][];
 num[0] = new int[1];
 num[1] = new int[5];
 num[2] = new int[2];
 num[3] = new int[3];

Vì vậy, ở đây chúng tôi đang xác định cột một cách rõ ràng.
Cách khác: 

int[][] num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} };

Để truy cập:

for (int i=0; i<(num.length); i++ ) {
    for (int j=0;j<num[i].length;j++)
        System.out.println(num[i][j]);
}

Ngoài ra:

for (int[] a : num) {
  for (int i : a) {
    System.out.println(i);
  }
}

Mảng rách rưới là mảng đa chiều.
Để được giải thích, hãy xem chi tiết mảng đa chiều tại hướng dẫn java chính thức


222
2017-07-29 14:29



Sẽ không phải là người đầu tiên dẫn đến một mảng null / trống, thay vì mảng với các giá trị mặc định? - vipin8169
Tôi đồng ý vào thời điểm đó và chúng tôi có thể thêm một tính năng nữa, chúng tôi có thể thay đổi kích thước động. - AdamIJK
Tôi có thể tranh luận với bạn về điểm mà một mảng đa chiều là một "loại" khác nhau của mảng. Nó chỉ đơn giản là một thuật ngữ được sử dụng để mô tả một mảng có chứa các mảng khác. Cả hai mảng bên ngoài và mảng bên trong (và những mảng ở giữa, nếu chúng tồn tại) chỉ là mảng thông thường. - tradeJmark


Type[] variableName = new Type[capacity];

Type[] variableName = {comma-delimited values};



Type variableName[] = new Type[capacity]; 

Type variableName[] = {comma-delimited values};

cũng hợp lệ, nhưng tôi thích các dấu ngoặc sau loại, bởi vì nó dễ dàng hơn để thấy rằng loại biến thực sự là một mảng.


116
2017-07-29 14:28



Tôi đồng ý vào thời điểm đó. Loại biến không phải là "TYPE", nhưng thực sự là một TYPE [], do đó, nó có ý nghĩa để viết nó theo cách đó cho tôi. - Chet
Phong cách Google cũng đề nghị điều này. - wener
Lưu ý rằng int[] a, b; sẽ không giống như int a[], b;, một sai lầm dễ thực hiện nếu bạn sử dụng mẫu sau. - Jeroen Vannevel


Có nhiều cách khác nhau để bạn có thể khai báo một mảng trong Java:

float floatArray[]; // Initialize later
int[] integerArray = new int[10];
String[] array = new String[] {"a", "b"};

Bạn có thể tìm thêm thông tin trong Hướng dẫn về mặt trời trang web và JavaDoc.


32
2017-07-29 14:29





Tôi thấy nó rất hữu ích nếu bạn hiểu từng phần:

Type[] name = new Type[5];

Type[] là kiểu của biến tên gọi ("name" được gọi là định danh). Chữ "Loại" là loại cơ sở và các dấu ngoặc có nghĩa là loại mảng của cơ sở đó. Các loại mảng là loại lần lượt của riêng chúng, cho phép bạn tạo các mảng đa chiều như Type[][] (loại mảng Kiểu []). Từ khóa new nói để cấp phát bộ nhớ cho mảng mới. Số giữa dấu ngoặc đơn cho biết mảng mới sẽ lớn như thế nào và lượng bộ nhớ cần phân bổ. Ví dụ, nếu Java biết rằng kiểu cơ sở Type mất 32 byte, và bạn muốn một mảng có kích thước 5, nó cần phân bổ nội bộ 32 * 5 = 160 byte.

Bạn cũng có thể tạo mảng với các giá trị đã có, chẳng hạn như

int[] name = {1, 2, 3, 4, 5};

không chỉ tạo ra không gian trống mà còn lấp đầy nó bằng những giá trị đó. Java có thể nói rằng các nguyên thủy là số nguyên và có 5 trong số chúng, do đó kích thước của mảng có thể được xác định ngầm định.


26
2018-06-04 06:02



Vì vậy, nó không phải là cần thiết để bao gồm int[] name = new int[5] ? - Cookie Monster


Sau đây cho thấy khai báo của một mảng, nhưng mảng không được khởi tạo:

 int[] myIntArray = new int[3];

Sau đây cho thấy việc khai báo cũng như khởi tạo mảng:

int[] myIntArray = {1,2,3};

Bây giờ, sau đây cũng cho thấy việc khai báo cũng như khởi tạo mảng:

int[] myIntArray = new int[]{1,2,3};

Nhưng điều thứ ba này cho thấy thuộc tính của việc tạo đối tượng mảng ẩn danh được trỏ bởi biến tham chiếu "myIntArray", vì vậy nếu chúng ta viết chỉ là "new int [] {1,2,3};" thì đây là cách mảng đối tượng ẩn danh có thể được tạo ra.

Nếu chúng ta chỉ viết:

int[] myIntArray;

đây không phải là khai báo mảng, nhưng câu lệnh sau đây làm cho việc khai báo ở trên hoàn tất:

myIntArray=new int[3];

26
2017-07-29 14:25



Hoàn toàn không có sự khác biệt giữa cách tiếp cận thứ hai và thứ ba, ngoài cách tiếp cận thứ hai chỉ có hoạt động khi bạn cũng khai báo một biến. Nó không rõ ràng những gì bạn có nghĩa là bởi "cho thấy tài sản của vô danh tạo đối tượng mảng" nhưng họ thực sự là những phần tương đương của mã. - Jon Skeet
Ngoài ra, đoạn đầu tiên làm khởi tạo mảng - nó được đảm bảo có giá trị 0 cho mỗi phần tử mảng. - Jon Skeet


Ngoài ra,

// Either method works
String arrayName[] = new String[10];
String[] arrayName = new String[10];

Điều đó tuyên bố một mảng được gọi là arrayName kích thước 10 (bạn có các phần tử từ 0 đến 9 để sử dụng).


22
2017-07-29 15:56



Tiêu chuẩn để sử dụng là gì? Tôi vừa mới phát hiện ra cái cũ, và tôi thấy nó gây hiểu lầm khủng khiếp: | - Anti Earth
Đối với những gì nó có giá trị prof của tôi nói rằng cách thứ hai là điển hình hơn trong Java và nó tốt hơn truyền đạt những gì đang xảy ra; như một mảng liên quan đến loại biến được tạo thành. - Celeritas
Đối với một lưu ý phụ: Một ngôn ngữ có nhiều hơn một ngữ nghĩa để khai báo một điều có nghĩa là thiết kế ngôn ngữ xấu. - Muhammad Suleman


Ngoài ra, trong trường hợp bạn muốn một cái gì đó năng động hơn có giao diện danh sách. Điều này sẽ không hoạt động tốt, nhưng linh hoạt hơn:

List<String> listOfString = new ArrayList<String>();

listOfString.add("foo");
listOfString.add("bar");

String value = listOfString.get(0);
assertEquals( value, "foo" );

22
2018-01-28 19:19



"<>" được gọi trong danh sách bạn đã tạo là gì? - CyprUS


Có hai cách chính để tạo một mảng:

Cái này, cho một mảng trống:

int[] array = new int[n]; // "n" being the number of spaces to allocate in the array

Và cái này, cho một mảng khởi tạo:

int[] array = {1,2,3,4 ...};

Bạn cũng có thể tạo các mảng đa chiều, như sau:

int[][] array2d = new int[x][y]; // "x" and "y" specify the dimensions
int[][] array2d = { {1,2,3 ...}, {4,5,6 ...} ...};

12
2018-05-23 19:56





Lấy kiểu nguyên thủy int ví dụ. Có một số cách để khai báo và int mảng:

int[] i = new int[capacity];
int[] i = new int[] {value1, value2, value3, etc};
int[] i = {value1, value2, value3, etc};

trong tất cả những điều này, bạn có thể sử dụng int i[] thay vì int[] i.

Với sự phản chiếu, bạn có thể sử dụng (Type[]) Array.newInstance(Type.class, capacity);

Lưu ý rằng trong các tham số phương thức, ... cho biết variable arguments. Về cơ bản, bất kỳ số tham số nào cũng được. Nó dễ dàng hơn để giải thích bằng mã:

public static void varargs(int fixed1, String fixed2, int... varargs) {...}
...
varargs(0, "", 100); // fixed1 = 0, fixed2 = "", varargs = {100}
varargs(0, "", 100, 200); // fixed1 = 0, fixed2 = "", varargs = {100, 200};

Bên trong phương pháp, varargs được coi là bình thường int[]. Type... chỉ có thể được sử dụng trong các tham số phương thức, vì vậy int... i = new int[] {} sẽ không biên dịch.

Lưu ý rằng khi chuyển int[] cho một phương pháp (hoặc bất kỳ phương pháp nào khác Type[]), bạn không thể sử dụng cách thứ ba. Trong tuyên bố int[] i = *{a, b, c, d, etc}*, trình biên dịch giả định rằng {...} có nghĩa là một int[]. Nhưng đó là bởi vì bạn đang khai báo một biến. Khi chuyển mảng sang phương thức, khai báo phải là new Type[capacity] hoặc là new Type[] {...}.

Mảng đa chiều

Mảng đa chiều khó xử lý hơn nhiều. Về cơ bản, một mảng 2D là một mảng các mảng. int[][] có nghĩa là một mảng int[]S. Điều quan trọng là nếu một int[][] được khai báo là int[x][y], chỉ số tối đa là i[x-1][y-1]. Về cơ bản, một hình chữ nhật int[3][5] Là:

[0, 0] [1, 0] [2, 0]
[0, 1] [1, 1] [2, 1]
[0, 2] [1, 2] [2, 2]
[0, 3] [1, 3] [2, 3]
[0, 4] [1, 4] [2, 4]

9
2018-01-20 11:54