2012-08-13 33 views
5

Tôi đã làm việc với các mảng tương đối lớn String hôm nay. (Khoảng 400 x 400 kích thước) Tôi đã tự hỏi làm thế nào làm cho một mảng bằng với nhau hoạt động chính xác. Ví dụ:Java: Cách mảng hoạt động

String[][] array1 = new String[400][400]; 
String[][] array2 = array1; 

Tạo một mảng bằng một thứ khác giống như lặp qua từng phần tử và làm cho nó bằng với vị trí tương ứng trong một mảng khác không? (Giống như dưới đây)

for(int y = 0; y < 400; y++) { 
    for(int x = 0; x < 400; x++) { 
     array2[x][y] = array1[x][y]; 
    } 
} 

Bây giờ là phương pháp lặp lại giống như làm cho một mảng bằng nhau? Hay là người đầu tiên/giây nhanh hơn người kia? Cá nhân, tôi nghĩ rằng đầu tiên sẽ nhanh hơn chỉ vì không có đệ quy hoặc phải tự cấp phát bộ nhớ cho array2 trước khi đệ quy. Nhưng, tôi không biết bắt đầu tìm kiếm thông tin này ở đâu và tôi muốn hiểu hậu cần về cách Java xử lý các loại điều này.

+0

Hãy xem [Mảng Java] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) – adatapost

+3

Tôi cũng nghĩ rằng bạn đang bối rối về định nghĩa đệ quy. –

+0

Thú vị nhưng tôi không thấy bất cứ điều gì về điều này ngoại trừ ở phía dưới, nơi nó đề cập đến phương pháp arrayCopy mà dường như không có bất cứ điều gì để làm với làm một mảng bằng khác với dấu bằng Doug Ramsey: Tôi có lẽ là vì Tôi thực sự không biết CÁCH làm việc nhiều như tôi biết rằng họ thực sự làm việc .. – CoderTheTyler

Trả lời

12

Không, nó không giống nhau: mảng là đối tượng tham chiếu, vì vậy array2 trở thành bí danh của array1, không phải là bản sao của nó. Bất kỳ chuyển nhượng nào bạn thực hiện cho một phần tử của array2 trở thành "hiển thị" qua array1 và ngược lại. Nếu bạn muốn tạo một bản sao của một mảng một chiều, bạn có thể sử dụng phương thức clone() của nó; lưu ý rằng bản sao sẽ là nông, tức là các thành phần riêng lẻ của mảng sẽ không phải được nhân bản (làm cho mẹo không thể áp dụng cho mảng 2-D mà bạn mô tả trong bài đăng của mình).

+0

Wow ... Tôi chưa bao giờ nhận ra điều đó. Điều đó có lẽ có thể giải thích tại sao rất nhiều chương trình của tôi với mảng không hoạt động theo cách tôi muốn chúng. Cảm ơn sự khai sáng! – CoderTheTyler

5

array2 = array1 không tạo bản sao của các phần tử, chỉ tham chiếu mảng. Vì vậy, array2array1 cả tham chiếu cùng một mảng cơ bản.

này là rất dễ dàng để xác định cho chính mình:

String[][] array1 = new String[4][4]; 
array1[0][0] = "some string"; 
String[][] array2 = array1; 
array1[0][0] = "another string"; 
System.out.println("array2: " + array2[0][0]); 
array2[0][0] = "a third string"; 
System.out.println("array1: " + array1[0][0]); 
+0

Giống như câu trả lời của @ dasblinkenlight nhưng với một ví dụ. Cảm ơn! : D – CoderTheTyler

1

Hmm Tôi nghĩ rằng khi bạn thực hiện một mảng bằng khác, bạn chỉ cần thay đổi tham chiếu. Ví dụ:

ARRAY 1 - * [] [] [] [] ... [] [] nơi * là một tham chiếu đến mảng 1
Mảng 2 - & [] [] [] [] .. . [] [] nơi & là tham chiếu đến mảng 2

Sau đó Thiết mảng 1 = Array 2 mảng 1 sẽ chỉ đơn giản là thay đổi tham chiếu của nó để & và bắt đầu đọc ở tài liệu tham khảo bộ nhớ &

1

dòng thứ hai trong ví dụ mã đầu tiên là tạo một biến tham chiếu kiểu String [] tham chiếu đến cùng một đối tượng mảng hai chiều mà ref erence array1 đề cập đến. Chỉ có một mảng hai chiều trong bộ nhớ, nhưng hai biến tham chiếu tham chiếu đến nó, mảng 1 và mảng2.

Bạn có vẻ bối rối về định nghĩa đệ quy, vì vậy tôi sẽ chỉ cho bạn tại đây- Recursion in Computer Science.

Các vấn đề liên quan