Độ dài thay đổi (Động) Mảng trong Java


108

Tôi đã tự hỏi làm thế nào để khởi tạo một mảng số nguyên để kích thước và giá trị của nó thay đổi trong quá trình thực thi chương trình của tôi, có gợi ý nào không?

Câu trả lời:


121

Có: sử dụng ArrayList .

Trong Java, mảng "bình thường" có kích thước cố định. Bạn phải cung cấp cho họ một kích thước và không thể mở rộng hoặc thu hẹp chúng. Để thay đổi kích thước, bạn phải tạo một mảng mới và sao chép dữ liệu bạn muốn - điều này không hiệu quả và gây khó khăn cho bạn.

May mắn thay, có tất cả các loại lớp tích hợp thực hiện các cấu trúc dữ liệu chung và các công cụ hữu ích khác. Bạn sẽ muốn kiểm tra API Java 6 để biết danh sách đầy đủ của chúng.

Một lưu ý: ArrayList chỉ có thể chứa các đối tượng (ví dụ: Số nguyên), không chứa các đối tượng nguyên thủy (ví dụ: int). Trong nhiều trường hợp NHẤT, autoboxing / autounboxing sẽ âm thầm giải quyết việc này cho bạn, nhưng bạn có thể gặp một số hành vi kỳ lạ tùy thuộc vào việc bạn đang làm.


2
Tôi tự hỏi tại sao mã sau lại đúng trong java? int[] array = new int[size]; sizelà một biến, nhưng chiều dài của một mảng phải được cố định, tôi phải @Lord Torgamus?
jerry_sjtu

12
@jerry_sjtu vâng, mảng không thay đổi kích thước để phù hợp sizekhi chương trình tiếp tục; nó nhận được bất kỳ kích thước nào xảy ra sizekhi dòng đó được thực thi.
Pops

Bất cứ khi nào tôi xóa một mục khỏi ArrayList, tôi kết thúc bằng dấu nullở cuối. Bất kỳ ý tưởng tại sao?
Aaron Franke

37

Mảng trong Java có kích thước cố định. Những gì bạn cần là ArrayList, một trong số các Bộ sưu tập cực kỳ có giá trị có sẵn trong Java.

Thay vì

Integer[] ints = new Integer[x]

bạn sử dụng

List<Integer> ints = new ArrayList<Integer>();

Sau đó, để thay đổi danh sách bạn sử dụng ints.add(y)ints.remove(z)trong số nhiều phương pháp tiện dụng khác, bạn có thể tìm thấy trong Javadocs thích hợp.

Tôi thực sự khuyên bạn nên nghiên cứu các lớp Bộ sưu tập có sẵn trong Java vì chúng rất mạnh và cung cấp cho bạn nhiều chức năng tích hợp mà người mới sử dụng Java có xu hướng cố gắng tự viết lại một cách không cần thiết.


muốn làm việc cho đến khi tôi đã thử: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
Tại sao bạn sử dụng List<Integer>thay vì ArrayList<Integer>?
Dean Meehan

24

Mảng có kích thước cố định sau khi được khởi tạo. Bạn có thể sử dụng một Danh sách để thay thế.

Autoboxing làm cho một Danh sách có thể sử dụng được tương tự như một mảng, bạn có thể chỉ cần đặt các giá trị int vào đó:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
Tại sao bạn khai báo một biến tham chiếu kiểu List, chứ không phải ArrayList?
LppEdd

2
Bởi vì nó cho phép bạn chuyển đổi đơn giản giữa các triển khai Danh sách nếu cần, bạn chỉ phải thay đổi XYZList () mới. Nếu biến được khai báo là ArrayList oyu có thể sử dụng các phương thức cụ thể cho việc triển khai này, làm cho thay đổi phức tạp hơn.
Mnementh

1
Cảm ơn, tôi hiểu.
LppEdd

11

Tôi không đồng ý với câu trả lời trước gợi ý ArrayList, vì ArrayListkhông một mảng động nhưng một danh sách được hỗ trợ bởi một mảng. Sự khác biệt là bạn không thể làm như sau:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Nó sẽ cung cấp cho bạn một IndexOutOfBoundsException vì chưa có phần tử nào ở vị trí này mặc dù mảng hỗ trợ sẽ cho phép bổ sung như vậy. Vì vậy, bạn cần sử dụng triển khai Mảng có thể mở rộng tùy chỉnh như được đề xuất bởi @ randy-lance


Tôi tin rằng bạn muốn liên kết nó với codereply.com/answer/6i5bur/java-dynamic-arrays.html
Amit Kumar Gupta

Tôi không chắc liệu ArrayList có bất kỳ phương thức put nào như tôi thấy trong mã nguồn Java8 hay không. Chỉ cố gắng tìm hiểu xem nó hoạt động như thế nào với khả năng nhất định. Tuy nhiên đã tìm thấy phương thức ArrayList.add ().
Sanjeet A

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

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

}

Nguồn: Cách làm mảng động


7
  1. Bạn nên sử dụng Danh sách để đối phó với kích thước quy mô nhỏ.

  2. Nếu bạn có một số lượng lớn, ĐỪNG BAO GIỜ sử dụng Danh sách và hộp tự động,

    Danh sách <Số nguyên> danh sách

Đối với mỗi số nguyên, một Số nguyên mới được tạo tự động. Bạn sẽ thấy nó chậm dần khi kích thước của danh sách tăng lên. Các số nguyên này là các đối tượng không cần thiết. Trong trường hợp này, sử dụng kích thước ước tính sẽ tốt hơn,

int[] array = new int[ESTIMATED_SIZE];

4

Làm thế nào về việc sử dụng một Listthay thế? Ví dụ,ArrayList<integer>


4

Bạn không thể thay đổi kích thước của một mảng. Tuy nhiên, bạn có thể tạo một mảng mới với kích thước phù hợp và sao chép dữ liệu từ mảng cũ sang mảng mới.

Nhưng lựa chọn tốt nhất của bạn là sử dụng IntList từ jacarta commons. ( đây )

Nó hoạt động giống như một Danh sách nhưng chiếm ít không gian hơn và hiệu quả hơn thế, bởi vì nó lưu trữ int thay vì lưu trữ các đối tượng wrapper trên int (đó là lớp Integer).


-4

Tôi đã trả lời câu hỏi này. Đây là liên kết Cách sử dụng Mảng động Java và đây là liên kết cho câu hỏi của tôi mà tôi đã trả lời Mảng động Java


1
điều này chỉ là sai. câu trả lời được liên kết gọi System.arrayCopy (), sao chép mảng cũ thành mảng mới với kích thước tăng lên, sau đó thêm mục mới. mảng vẫn không thể có kích thước động.
katzenhut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.