CodeGym /Blog Java /Ngẫu nhiên /Danh sách Java

Danh sách Java

Xuất bản trong nhóm
Java Collection Framework chứa các giao diện và lớp rất hữu ích triển khai chúng để làm việc với các cấu trúc dữ liệu. Có thể nói đây là một trong những JDK framework quan trọng nhất. Giao diện Danh sách rất phổ biến. bởi vì không có tất cả các loại danh sách trong lập trình thì nó là điều không thể thiếu. Trong bài viết này, chúng tôi sẽ đề cập đến giao diện này, các phương thức và triển khai Danh sách Java.

Giao diện danh sách Java

Điều quan trọng nhất về một danh sách là nó là một tập hợp có thứ tự . Bạn cũng có thể gọi nó là một chuỗi. Trong Java, danh sách là đồng nhất, nghĩa là các phần tử của danh sách có cùng kiểu dữ liệu. Giao diện Danh sách Java kế thừa từ Bộ sưu tập, nó kế thừa tất cả các hoạt động của nó. Ngoài chúng, các thao tác sau cũng có thể thực hiện được trong Danh sách:
  • Truy cập vị trí. Mỗi phần tử có một chỉ mục và có thể được thao tác dựa trên vị trí của chúng. trong danh sách. Tức là bạn có thể thêm, loại trừ và sửa đổi các phần tử.
  • Tìm kiếm. Bạn có thể tìm một phần tử trong danh sách theo nội dung của nó và trả về chỉ mục của nó.
  • Lặp lại. Tính chất tuần tự của List cho phép sử dụng phương thức lặp (listIterator).
  • Phạm vi xem. Phương thức danh sách con thực hiện các thao tác phạm vi tùy ý trên danh sách.

Các phương thức danh sách Java

Các hoạt động trên được hiển thị trong các phương thức của giao diện Danh sách Java. Đây là một số trong số họ:
Phương pháp Sự miêu tả
thêm (phần tử E) Phương thức này thêm phần tử phần tử vào cuối danh sách này.
thêm (chỉ số int, phần tử) Phương thức thêm một phần tử tại một chỉ mục cụ thể trong danh sách. Nếu một tham số cần thiết được truyền vào, nó sẽ thêm phần tử vào cuối danh sách.
addAll(int index, Bộ sưu tập bộ sưu tập) Thêm tất cả các phần tử trong bộ sưu tập đã cho vào danh sách. Nếu một tham số duy nhất được truyền vào, nó sẽ thêm tất cả các phần tử của tập hợp đã cho vào cuối danh sách.
kích cỡ() Trả về kích thước của danh sách (số lượng phần tử trong danh sách).
lấy (chỉ số int) Trả về phần tử tại chỉ mục đã chỉ định.
thiết lập (chỉ số int, phần tử) Thay thế các phần tử tại một chỉ mục nhất định bằng phần tử mới và trả về phần tử đã được thay thế bằng phần tử mới.
xóa (chỉ số int) Xóa một phần tử khỏi chỉ mục đã chỉ định.
xóa (phần tử) Loại bỏ sự xuất hiện đầu tiên của phần tử đã cho trong danh sách.
thông thoáng() Xóa tất cả các phần tử khỏi danh sách.
indexOf(phần tử) Trả về lần xuất hiện đầu tiên của phần tử đã cho. Nếu phần tử không có trong danh sách, trả về -1 .
lastIndexOf(phần tử) Trả về lần xuất hiện cuối cùng của phần tử đã cho. Nếu phần tử không có trong danh sách, trả về -1 .
bằng (phần tử) So sánh sự bằng nhau của phần tử đã cho với các phần tử của danh sách.
Mã Băm() Trả về giá trị mã băm của danh sách đã cho.
isEmpty() Kiểm tra xem danh sách có trống không. Trả về true nếu danh sách trống.
chứa (phần tử) Kiểm tra xem danh sách có chứa phần tử hay không . Trả về true nếu danh sách chứa phần tử.
chứaAll(Bộ sưu tập) Kiểm tra xem danh sách có chứa tất cả tập hợp các phần tử hay không.
sắp xếp (So sánh comp) Sắp xếp các phần tử của danh sách trên cơ sở bộ so sánh đã cho.
danh sách con (int from Index, int to Index) Trả về dạng xem của phần danh sách này giữa fromIndex, bao gồm và toIndex, độc quyền đã chỉ định.

Danh sách thực hiện

Bởi vì Danh sách là một giao diện, các chương trình cần tạo ra một triển khai cụ thể cho nó. Bạn có thể chọn giữa các triển khai Danh sách sau trong API Bộ sưu tập Java:
  • java.util.ArrayList
  • java.util.LinkedList
  • java.util.Vector
  • java.util.Stack
Việc triển khai phổ biến nhất của giao diện Danh sách được gọi là ArrayList. Ít thường xuyên hơn, nhưng bạn vẫn có thể thấy việc sử dụng LinkedList trong các tác vụ thực tế, nhưng Vector và Stack đã trở nên lỗi thời về mặt đạo đức trong một thời gian dài, vì vậy rất có thể bạn sẽ chỉ tìm thấy chúng trong các dự án có mã kế thừa cổ xưa.

Khai báo giao diện danh sách

Bạn có thể khai báo một List trong chương trình Java theo một trong các cách sau:

List<String> myList = new ArrayList();
List myList1 = new ArrayList();
List myList3 = new ArrayList<String>();
ArrayList arrayList = new ArrayList();
Tốt nhất là khai báo một danh sách mới thông qua một giao diện. Tương tự, bạn có thể khai báo các triển khai khác của Danh sách. Con đường ngắn nhất:

Vector myVector = new Vector;
LinkedList linkedList = new LinkedList();
Stack stack = new Stack();
Với cách khai báo như vậy, kiểu dữ liệu của các phần tử trong danh sách đó được xác định trong quá trình khởi tạo danh sách, tức là khi các phần tử được thêm vào đó.

List myList = new ArrayList<String>();
Vector myVector = new Vector();
LinkedList linkedList = new LinkedList();
Stack stack = new Stack();
stack.add("Paul");
linkedList.add(1);
myVector.add(1.2f);
myList.add('a');
Bây giờ chỉ có thể thêm các chuỗi vào ngăn xếp của chúng tôi, các số nguyên vào LinkedList , float vào myVectormyList là một danh sách các ký tự.

ArrayList hoạt động như thế nào

Nếu bạn đã quen thuộc với các mảng thông thường, thì bạn cũng đã phần nào quen thuộc với ArrayList. Thực tế, ArrayList là một mảng động, và bên trong nó là một mảng thông thường. Mảng này hoạt động như một kho lưu trữ dữ liệu. ArrayList chỉ lưu trữ các loại tham chiếu, bất kỳ đối tượng nào, bao gồm các lớp bên thứ ba, chuỗi, luồng đầu ra và các bộ sưu tập khác. Các lớp bao bọc được sử dụng để lưu trữ các kiểu dữ liệu nguyên thủy trong ArrayList. Khi tạo danh sách, chúng tôi có thể đặt kích thước của nó ngay lập tức, nhưng trong hầu hết các trường hợp, chúng tôi không làm như vậy. Theo mặc định, kích thước ArrayList = 10. Việc thêm phần tử mới vào ArrayList trông như thế nào? Trước hết, một cuộc kiểm tra được bắt đầu để xem liệu có đủ khoảng trống trong mảng bên trong hay không và liệu một phần tử nữa có phù hợp hay không. Nếu có khoảng trống, phần tử mới sẽ được thêm vào cuối danh sách, nghĩa là vào ô theo sau phần tử cuối cùng. Chỉ mục của nó sẽ là arraylist.size(). Nếu chúng ta vừa tạo danh sách của mình và nó trống, điều này có nghĩa là arrayList.size() = 0. Theo đó, một phần tử mới sẽ được thêm vào ô có chỉ số 0. Nếu không đủ chỗ, một phần tử mới sẽ được thêm vào. mảng được tạo bên trong ArrayList với kích thước (kích thước của OldArray * 1.5) + 1. Theo nguyên tắc tương tự, việc chèn xảy ra ở giữa danh sách, nhưng đồng thời, tất cả các phần tử theo sau phần tử được chèn đều chuyển sang bên phải. Vì vậy, nếu chúng ta có 5 phần tử trong mảng và chúng ta cần chèn một phần tử vào ô số 2 (nghĩa là ô thứ ba), thì các phần tử mảng 0 và 1 vẫn giữ nguyên vị trí, một phần tử mới xuất hiện trong ô 2 và tiền thân của nó đi đến ô thứ ba, v.v. một phần tử mới sẽ được thêm vào ô có chỉ số 0. Nếu không có đủ dung lượng, một mảng mới sẽ được tạo bên trong ArrayList với kích thước (kích thước của OldArray * 1.5) + 1. Tương tự nguyên tắc, một phép chèn xảy ra ở giữa danh sách, nhưng đồng thời, tất cả các phần tử theo sau phần tử được chèn đều được dịch sang phải. Vì vậy, nếu chúng ta có 5 phần tử trong mảng và chúng ta cần chèn một phần tử vào ô số 2 (nghĩa là ô thứ ba), thì các phần tử mảng 0 và 1 vẫn giữ nguyên vị trí, một phần tử mới xuất hiện trong ô 2 và tiền thân của nó đi đến ô thứ ba, v.v. một phần tử mới sẽ được thêm vào ô có chỉ số 0. Nếu không có đủ dung lượng, một mảng mới sẽ được tạo bên trong ArrayList với kích thước (kích thước của OldArray * 1.5) + 1. Tương tự nguyên tắc, một phép chèn xảy ra ở giữa danh sách, nhưng đồng thời, tất cả các phần tử theo sau phần tử được chèn đều được dịch sang phải. Vì vậy, nếu chúng ta có 5 phần tử trong mảng và chúng ta cần chèn một phần tử vào ô số 2 (nghĩa là ô thứ ba), thì các phần tử mảng 0 và 1 vẫn giữ nguyên vị trí, một phần tử mới xuất hiện trong ô 2 và tiền thân của nó đi đến ô thứ ba, v.v. một phép chèn xảy ra ở giữa danh sách, nhưng đồng thời, tất cả các phần tử theo sau phần tử được chèn đều được dịch sang phải. Vì vậy, nếu chúng ta có 5 phần tử trong mảng và chúng ta cần chèn một phần tử vào ô số 2 (nghĩa là ô thứ ba), thì các phần tử mảng 0 và 1 vẫn giữ nguyên vị trí, một phần tử mới xuất hiện trong ô 2 và tiền thân của nó đi đến ô thứ ba, v.v. một phép chèn xảy ra ở giữa danh sách, nhưng đồng thời, tất cả các phần tử theo sau phần tử được chèn đều được dịch sang phải. Vì vậy, nếu chúng ta có 5 phần tử trong mảng và chúng ta cần chèn một phần tử vào ô số 2 (nghĩa là ô thứ ba), thì các phần tử mảng 0 và 1 vẫn giữ nguyên vị trí, một phần tử mới xuất hiện trong ô 2 và tiền thân của nó đi đến ô thứ ba, v.v.

Ví dụ về danh sách Java (hiện thực hóa danh sách mảng)


import java.util.*;

public class ArrayListExample2 {
   public static void main(String[] args) {
       List<String> myFriendsList = new ArrayList();
       //we created list of some objects 
       System.out.println( "the size of myList before init = " + myFriendsList.size());
       myFriendsList.add("Alex");
       myFriendsList.add("Tanya");
       myFriendsList.add("Veloxy");
       myFriendsList.add("Alex");
       myFriendsList.add("Andrew");
       System.out.println(myFriendsList);
       System.out.println( "the size of myList after init = " + myFriendsList.size());

       myFriendsList.add("Ihor");
       System.out.println(myFriendsList);
       System.out.println("the size of my list = " +  myFriendsList.size());


       //here the program will print out the first appearance of "Alex" element
       System.out.println(myFriendsList.indexOf("Alex"));
       //program will print out the first appearance of "Alex" element starting from the element 0

       myFriendsList.remove(3);
       System.out.println(myFriendsList.get(3));
       System.out.println("after removing one of Alex's there is only one Alex: " + myFriendsList);
       System.out.println(myFriendsList.get(1));



       myFriendsList.clear();
       System.out.println("the size of the vector after clear method = " +  myFriendsList.size());

   }
}
Đây là đầu ra của chương trình này:
kích thước của myList trước init = 0 [Alex, Tanya, Veloxy, Alex, Andrew] kích thước của myList sau init = 5 [Alex, Tanya, Veloxy, Alex, Andrew, Ihor] kích thước danh sách của tôi = 6 0 Andrew sau khi loại bỏ một trong những Alex thì chỉ còn một Alex: [Alex, Tanya, Veloxy, Andrew, Ihor] Tanya kích thước của vectơ sau phương thức xóa = 0 Quá trình kết thúc với mã thoát 0

LinkedList hoạt động như thế nào

Trong LinkedList, các phần tử thực sự là các liên kết trong cùng một chuỗi. Mỗi phần tử, ngoài dữ liệu mà nó lưu trữ, có một liên kết đến phần tử trước đó và phần tử tiếp theo. Các liên kết này cho phép bạn điều hướng từ phần tử này sang phần tử khác. Trình vòng lặp hỗ trợ truyền tải theo cả hai hướng. Triển khai các phương thức lấy, xóa và chèn vào đầu, giữa và cuối danh sách. Cho phép bạn thêm bất kỳ yếu tố nào kể cả null. LinkedList triển khai hai giao diện — không chỉ Danh sách mà còn cả Deque. Điều này cung cấp khả năng tạo hàng đợi hai chiều từ bất kỳ phần tử nào, thậm chí là null. Mỗi đối tượng được đặt trong danh sách liên kết là một nút (node). Mỗi nút chứa một phần tử, một liên kết đến nút trước và nút tiếp theo. Trên thực tế, danh sách được liên kết bao gồm một chuỗi các nút, mỗi nút được thiết kế để lưu trữ một đối tượng thuộc loại được xác định khi nó được tạo.

Mã ví dụ


import java.util.*;
public class LinkedListTest {

       public static void main(String args[]){

           List myLinkedList= new LinkedList<Integer>();
           myLinkedList.add(1);
           myLinkedList.add(2);
           myLinkedList.add(4);
           System.out.println("three added elements: " + myLinkedList);
           myLinkedList.add(5);
           myLinkedList.remove(1);
           System.out.println(myLinkedList);
           myLinkedList.size(); //3
           
           //add new element at the specified position:
           myLinkedList.add(2,7);
           System.out.println(myLinkedList);
                }
       }
Đầu ra ở đây:
ba yếu tố được thêm vào: [1, 2, 4] [1, 4, 5] [1, 4, 7, 5]

Ví dụ mã véc tơ

Vector cũng là một mảng động và rất giống với ArrayList, nhưng được đồng bộ hóa và có một số phương thức kế thừa mà khung bộ sưu tập không có. Đây là một ví dụ đơn giản về việc sử dụng lớp này.

import java.util.Vector;

public class VectorExample1 {

   public static void main(String[] args) {
       Vector vector = new Vector();
       System.out.println("the size of the empty vector = " +  vector.size());
       vector.add("Alex");
       vector.add("Tanya");
       vector.add("Andrew");
       System.out.println(vector);
       vector.add("Alex");
       vector.add("Ihor");
       System.out.println(vector);
       System.out.println("the size of the vector = " +  vector.size());
       System.out.println("the first element of the vector = " + vector.firstElement());

       //here the program will print out the first appearance of "Johnny" element
       System.out.println(vector.indexOf("Andrew"));
       //program will print out the first appearance of "Johnny" element starting from the element 1
       System.out.println(vector.indexOf("Alex", 1));
       System.out.println(vector);
       vector.clear();
       System.out.println("the size of the vector after clear method = " +  vector.size());

   }
}
Đầu ra là:
kích thước của vectơ trống = 0 [Alex, Tanya, Andrew] [Alex, Tanya, Andrew, Alex, Ihor] kích thước của vectơ = 5 phần tử đầu tiên của vectơ = Alex 2 3 [Alex, Tanya, Andrew, Alex, Ihor] kích thước của vectơ sau phương thức xóa = 0 Quá trình kết thúc với mã thoát 0

Mã lớp Java Stack Ví dụ


import java.util.Stack;

public class StackTest {
   public static void main(String[] args) {
       Stack stack = new Stack();
       System.out.println(stack.isEmpty());
       stack.add("Paul");
       stack.add("Johnny");
       stack.add("Alex");
       System.out.println(stack.isEmpty());
       stack.push("Andrew");
       System.out.println(stack);
       stack.pop();
       System.out.println(stack);
   }
}
Stack không chỉ có các phương thức add()remove() mà còn có cả push và pop, chúng là cổ điển cho cấu trúc dữ liệu như vậy. Ngăn xếp tuân theo quy tắc “vào trước, ra sau” — đây là một cách chống hàng đợi. Do đó, thao tác pop bật phần tử được đặt lần cuối trên ngăn xếp. Đây là đầu ra của ví dụ của chúng tôi:
đúng sai [Paul, Johnny, Alex, Andrew] [Paul, Johnny, Alex]
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION