A PHP Error was encountered

Severity: Warning

Message: unlink(/home/anhtest2/public_html/application/cache/Config_model_SelectByKeylogo.cache): No such file or directory

Filename: drivers/Cache_file.php

Line Number: 279

Backtrace:

File: /home/anhtest2/public_html/application/core/MY_Model.php
Line: 25
Function: get

File: /home/anhtest2/public_html/application/models/Config_model.php
Line: 42
Function: query_cache

File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 124
Function: SelectByKey

File: /home/anhtest2/public_html/application/controllers/frontend/Lesson.php
Line: 9
Function: __construct

File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once

A PHP Error was encountered

Severity: Warning

Message: unlink(/home/anhtest2/public_html/application/cache/Config_model_SelectByKeyapp_id.cache): No such file or directory

Filename: drivers/Cache_file.php

Line Number: 279

Backtrace:

File: /home/anhtest2/public_html/application/core/MY_Model.php
Line: 25
Function: get

File: /home/anhtest2/public_html/application/models/Config_model.php
Line: 42
Function: query_cache

File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 133
Function: SelectByKey

File: /home/anhtest2/public_html/application/controllers/frontend/Lesson.php
Line: 9
Function: __construct

File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once

A PHP Error was encountered

Severity: Warning

Message: unlink(/home/anhtest2/public_html/application/cache/Config_model_SelectByKeymeta_keywords.cache): No such file or directory

Filename: drivers/Cache_file.php

Line Number: 279

Backtrace:

File: /home/anhtest2/public_html/application/core/MY_Model.php
Line: 25
Function: get

File: /home/anhtest2/public_html/application/models/Config_model.php
Line: 42
Function: query_cache

File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 143
Function: SelectByKey

File: /home/anhtest2/public_html/application/controllers/frontend/Lesson.php
Line: 9
Function: __construct

File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once

[Selenium Java] Bài 1: Java Basic | Anh Tester



NỘI DUNG BÀI HỌC

Variable (biến), kiểu dữ liệu (data type), toán tử, function/method (hàm/phương thức), IF Else, vòng lặp For, Mảng (Array), Collection (ArrayList, Set, Map,...)

✅ Biến trong Java

Trong Java, biến là tên của một vùng nhớ. Dùng để lưu trữ giá trị và khai báo trong phương thức của một class Java. Có 3 kiểu biến trong Java, bao gồm biến Local (biến địa phương), biến instance (biến toàn cục) và biến static.
Nếu các bạn không chuyên code và mới học thì có thể hiểu biến và thuộc tính là như nhau nhưng thực ra nó có điểm khác nhau. Mình sẽ nói rõ thuộc tính ở bài "Thuộc tính và Phương thức" sau nhé.

Các kiểu biến trong java

Khai báo biến trong java

Cú pháp khai báo biến:

**Biến có gán giá trị trước

DataType variableName = value;

**Biến không gán giá trị trước

DataType variableName;

 

Trong đó, DataType là kiểu dữ liệu của biến, chúng ta sẽ học phần tiếp theo kĩ hơn. Đại khái các bạn nắm nhanh:

  • String đại diện kiểu chuỗi
  • int đại diện kiểu số nguyên
variableName là tên biến.


Quy tắc đặt tên biến trong java:

  • Chỉ được bắt đầu bằng một ký tự(chữ), hoặc một dấu gạch dưới(_), hoặc một ký tự dollar($)
  • Tên biến không được chứa khoảng trắng
  • Bắt đầu từ ký tự thứ hai, có thể dùng ký tự(chữ), dấu gạch dưới(_), hoặc ký tự dollar($)
  • Không được trùng với các từ khóa (class, String, static, public, void,...)
  • Có phân biệt chữ hoa và chữ thường

 

✳️ Các loại biến trong java

 

🔆 Biến Local trong java

  • Biến Local được khai báo trong các phương thức, hoặc hàm contructor hoặc trong các block.
  • Biến Local không được gọi dùng ở các hàm khác. Chỉ sử dụng trong chính hàm khai báo biến đó.
  • Biến local được tạo bên trong các phương thức, contructor, block và sẽ bị phá hủy khi kết thúc các phương thức, contructor và block.
  • Không được sử dụng "access modifier" khi khai báo biến local.
  • Các biến local được lưu trên vùng nhớ stack của bộ nhớ.
  • Bạn cần khởi tạo giá trị mặc định cho biến local trước khi có thể sử dụng.


Ví dụ 1:
Khởi tạo giá trị cho biến local:

public class DemoBien {
     
    public void sayHello() {
        int n = 10;      // Đây là biến local
        System.out.println("Gia tri cua n la: " + n);
    }
     
    public static void main(String[] args) {
        DemoBien bienLocal = new DemoBien();
        bienLocal.sayHello();
    }
}

Kết quả:

Gia tri cua n la: 10


Ví dụ 2:
Không khởi tạo giá trị cho biến local:

public class BienCucBo {
     
    public void sayHello() {
        int n;                 // Đây là biến local
        System.out.println("Gia tri cua n la: " + n);
    }
     
    public static void main(String[] args) {
        BienCucBo bienLocal = new BienCucBo();
        bienLocal.sayHello();
    }
}

 

Kết quả:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable n may not have been initialized​
Khi không khởi tạo biến Local, chương trình java sẽ báo lỗi khi biên dịch.


🔆 Biến instance (biến toàn cục) trong java

  • Biến toàn cục được khai báo trong một lớp(class), bên ngoài các phương thức, ngoài constructor và ngoài các block.
  • Biến toàn cục được gọi sử dụng ở các hàm khác nhau trong cùng một class. Khác class phải xét tới phạm vi truy cập. (học ở phần Phạm vi truy cập trong Java sau)
  • Biến instance được lưu trong bộ nhớ heap.
  • Biến instance được tạo khi một đối tượng được tạo bằng việc sử dụng từ khóa “new” và sẽ bị phá hủy khi đối tượng bị phá hủy.
  • Biến instance có thể được sử dụng bởi các phương thức, constructor, block, ... Nhưng nó phải được sử dụng thông qua một đối tượng cụ thể.
  • Bạn được phép sử dụng "access modifier" khi khai báo biến instance, mặc định là "default" (private, public, protected).
  • Biến instance có giá trị mặc định phụ thuộc vào kiểu dữ liệu của nó. Ví dụ nếu là kiểu int, short, byte thì giá trị mặc định là 0, kiểu double thì là 0.0d, ... Vì vậy, bạn sẽ không cần khởi tạo giá trị cho biến instance trước khi sử dụng.
  • Bên trong class mà bạn khai báo biến instance, bạn có thể gọi nó trực tiếp bằng tên khi sử dụng ở khắp nới bên trong class đó.


Ví dụ về biến instance trong java:

package anhtester.bienvadulieu;
 
public class Sinhvien {
    // biến instance "ten" kiểu String, có giá trị mặc định là null
    public String ten;
 
    // biến instance "tuoi" kiểu Integer, có giá trị mặc định là 0
    private int tuoi;
 
    // sử dụng biến ten trong một constructor
    public Sinhvien(String ten) {
        this.ten = ten;
    }
 
    // sử dụng biến tuoi trong phương thức setTuoi
    public void setTuoi(int tuoi) {
        this.tuoi = tuoi;
    }
 
    public void showStudent() {
        System.out.println("Ten  : " + ten);
        System.out.println("Tuoi : " + tuoi);
    }
 
    public static void main(String args[]) {
        Sinhvien sv = new Sinhvien("Nguyen Van A");
        sv.setTuoi(21);
        sv.showStudent();
    }
}

Kết quả:

Ten: Nguyen Van A
Tuoi: 21

🔆 Biến static trong java

  • Biến static được khai báo trong một class với từ khóa "static", nằm bên ngoài các phương thức, ngoài constructor và ngoài block.
  • Biến static được truy cập thông qua tên của class chứa nó, với cú pháp: TenClass.tenBien. VD: ThongTin.companyName
  • Sẽ chỉ có duy nhất một bản sao của các biến static được tạo ra, dù bạn tạo bao nhiêu đối tượng từ lớp tương ứng.
  • Biến static được lưu trữ trong bộ nhớ static riêng.
  • Biến static được tạo khi chương trình bắt đầu chạy và chỉ bị phá hủy khi chương trình dừng.
  • Giá trị mặc định của biến static phụ thuộc vào kiểu dữ liệu bạn khai báo tương tự biến instance.
  • Trong class, các phương thức sử dụng biến static bằng cách gọi tên của nó khi phương thức đó cũng được khai báo với từ khóa "static".


Ví dụ về biến static trong java:

public class SinhVien {
    // biến static 'ten'
    public static String ten = "Võ Thái An";
     
    // biến static 'tuoi'
    public static int tuoi = 21;
 
    public static void main(String args[]) {
        // Sử dụng biến static bằng cách gọi trực tiếp
        System.out.println("Tên: " + ten);
 
        // Sử dụng biến static bằng cách gọi thông qua tên class
        System.out.println("Tuổi: " + SinhVien.tuoi);
    }
}

Kết quả:

Tên: Võ Thái An
Tuổi: 21





✅ Các kiểu dữ liệu trong java


Trong Java, các kiểu dữ liệu được chia thành hai loại:

  • Các kiểu dữ liệu nguyên thủy
  • Các kiểu dữ liệu đối tượng
 


🔆 Kiểu dữ liệu nguyên thủy

Java cung cấp các kiểu dữ liệu cơ bản như sau:

Kiểu dữ liệu Mô tả
String Dùng để lưu dữ liệu kiểu chuỗi. VD: "Automation Test", "Selenium",... Dạng này dùng rất nhiều.
byte Dùng để lưu dữ liệu kiểu số nguyên có kích thước một byte (8 bít). Phạm vi biểu diễn giá trị từ -128 đến 127. Giá trị mặc định là 0.
char Dùng để lưu dữ liệu kiểu kí tự hoặc số nguyên không âm có kích thước 2 byte (16 bít). Phạm vi biểu diễn giá trị từ 0 đến u\ffff. Giá trị mặc định là 0.
boolean Dùng để lưu dữ liệu chỉ có hai trạng thái đúng hoặc sai (độ lớn chỉ có 1 bít). Phạm vi biểu diễn giá trị là {“True”, “False”}. Giá trị mặc định là False.
short Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 2 byte (16 bít). Phạm vi biểu diễn giá trị từ - 32768 đến 32767. Giá trị mặc định là 0.
int Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 4 byte (32 bít). Phạm vi biểu diễn giá trị từ -2,147,483,648 đến 2,147,483,647. Giá trị mặc định là 0.
long Dùng để lưu dữ liệu có kiểu số nguyên có kích thước lên đến 8 byte. Giá trị mặc định là 0L.
float Dùng để lưu dữ liệu có kiểu số thực, kích cỡ 4 byte (32 bít). Giá trị mặc định là 0.0F.
double Dùng để lưu dữ liệu có kiểu số thực có kích thước lên đến 8 byte. Giá trị mặc định là 0.00D


🔆 Kiểu dữ liệu đối tượng

Trong Java có 3 kiểu dữ liệu đối tượng:

Kiểu dữ liệu Mô tả
Array Một mảng của các dữ liệu cùng kiểu.
Class Dữ liệu kiểu lớp đối tượng do người dùng định nghĩa. Chứa tập các thuộc tính và phương thức..
Interface Dữ liệu kiểu lớp giao tiếp do người dùng định nghĩa. Chứa các phương thức của giao tiếp.




 

✅ Toán tử trong Java

Toán tử trong java là một ký hiệu được sử dụng để thực hiện một phép tính/chức năng nào đó. Java cung cấp các dạng toán tử sau:

  • Toán tử số học
  • Toán tử bit
  • Toán tử quan hệ
  • Toán tử logic
  • Toán tử điều kiện
  • Toán tử gán
[Selenium Java] Bài 1: Java basic | Anh Tester



Nội dung chính:

  • Toán tử số học
  • Các toán tử quan hệ
  • Các toán tử logic
  • Các toán tử điều kiện
  • Toán tử gán
  • Thứ tụ ưu tiên của các toán tử
  • Thay đổi thứ tự ưu tiên của các toán tử



Toán tử số học

Các toán hạng của các toán tử số học phải ở dạng số. Các toán hạng kiểu boolean không sử dụng được, các toán hạng ký tự cho phép sử dụng loại toán tử này. Một vài kiểu toán tử được liệt kê trong bảng dưới đây.

Giả sử chúng ta có biến số nguyên a = 10 và b = 20.

Toán tử Mô tả Ví dụ
+ Cộng
Trả về giá trị là tổng của hai toán hạng
a + b sẽ là 30
- Trừ
Trả về kết quả là hiệu của hai toán hạng.
a - b sẽ là -10
* Nhân
Trả về giá trị là tích của hai toán hạng.
a * b sẽ là 200
/ Chia
Trả về giá trị là thương của phép chia.
b / a sẽ là 2
% Phép lấy modul
Giá trị trả về là phần dư của phép chia
b % a sẽ là 0
++ Tăng dần
Tăng giá trị của biến lên 1. Ví dụ a++ tương đương với a = a + 1
a++ sẽ là 11
-- Giảm dần
Giảm giá trị của biến 1 đơn vị. Ví dụ a-- tương đương với a = a - 1
a-- sẽ là 9
+= Cộng và gán giá trị
Cộng các giá trị của toán hạng bên trái vào toán hạng bên phải và gán giá trị trả về vào toán hạng bên trái. Ví dụ c += a tương đương c = c + a
a += 2 sẽ là 12
-= rừ và gán giá trị
Trừ các giá trị của toán hạng bên trái vào toán toán hạng bên phải và gán giá trị trả về vào toán hạng bên trái. Ví dụ c -= a tương đương với c = c - a
a -= 2 sẽ là 8
*= Nhân và gán
Nhân các giá trị của toán hạng bên trái với toán toán hạng bên phải và gán giá trị trả về vào toán hạng bên trái. Ví dụ c *= a tương đương với c = c*a
a *= 2 sẽ là 20
/= Chia và gán
Chia giá trị của toán hạng bên trái cho toán toán hạng bên phải và gán giá trị trả về vào toán hạng bên trái. Ví dụ c /= a tương đương với c = c/a
a /= 2 sẽ là 5
%= Lấy số dư và gán
Chia giá trị của toán hạng bên trái cho toán toán hạng bên phải và gán giá trị số dư vào toán hạng bên trái. Ví dụ c %= a tương đương với c = c%a
a %= 8 sẽ là 2

 

Các toán tử quan hệ

Các toán tử quan hệ được sử dụng kiểm tra mối quan hệ giữa hai toán hạng. Kết quả của một biểu thức có dùng các toán tử quan hệ là những giá trị Boolean (logic “true” hoặc “false”). Các toán tử quan hệ được sử dụng trong các cấu trúc điều khiển.

Toán tử Mô tả
== So sánh bằng
Toán tử này kiểm tra sự tương đương của hai toán hạng
!= So sánh khác
Toán tử này kiểm tra sự khác nhau của hai toán hạng
> Lớn hơn
Kiểm tra giá trị của toán hạng bên phải lớn hơn toán hạng bên trái hay không
< Nhỏ hơn
Kiểm tra giá trị của toán hạng bên phải có nhỏ hơn toán hạng bên trái hay không
>= Lớn hơn hoặc bằng
Kiểm tra giá trị của toán hạng bên phải có lớn hơn hoặc bằng toán hạng bên trái hay không
<= Nhỏ hơn hoặc bằng
Kiểm tra giá trị của toán hạng bên phải có nhỏ hơn hoặc bằng toán hạng bên trái hay không

 

Các toán tử logic

Các toán tử logic làm việc với các toán hạng Boolean. Các toán tử quan hệ được sử dụng trong các cấu trúc điều khiển.

Toán tử Mô tả
&& Toán tử và (AND)
Trả về một giá trị “Đúng” (True) nếu chỉ khi cả hai toán tử có giá trị “True”
|| Toán tử hoặc (OR)
Trả về giá trị “True” nếu ít nhất một giá trị là True
^ Toán tử XOR
Trả về giá trị True nếu và chỉ nếu chỉ một trong các giá trị là True, các trường hợp còn lại cho giá trị False (sai)
! Toán tử phủ định (NOT)
Toán hạng đơn tử NOT. Chuyển giá trị từ True sang False và ngược lại.


Các toán tử điều kiện

Toán tử điều kiện là một loại toán tử đặc biệt vì nó bao gồm ba thành phần cấu thành biểu thức điều kiện. Cú pháp:

<biểu thức 1>   ?   <biểu thức 2>   :   <biểu thức 3>;​
  • biểu thức 1: Biểu thức logic. Trả trả về giá trị True hoặc False
  • biểu thức 2: Là giá trị trả về nếu <biểu thức="" 1="">xác định là True</biểu>
  • biểu thức 3: Là giá trị trả về nếu <biểu thức="" 1="">xác định là False</biểu>


Ví dụ:

public class Test {
    public static void main(String[] args) {
        int a = 20;
        int b = 3;
 
        String s = (a % b == 0) ? "a chia het cho b" : "a khong chia het cho b";
        System.out.println(s);
    }
}​

Kết quả:

a khong chia het cho b

 

Toán tử gán

Toán tử gán (=) dùng để gán một giá trị vào một biến và có thể gán nhiều giá trị cho nhiều biến cùng một lúc.

Ví dụ:

int var = 20;
int p,q,r,s; 
p=q=r=s=var;

Trong ví dụ trên, đoạn lệnh sau gán một giá trị cho biến var và giá trị này lại được gán cho nhiều biến trên một dòng lệnh đơn.

Dòng lệnh cuối cùng được thực hiện từ phải qua trái. Đầu tiên giá trị ở biến var được gán cho ‘s’, sau đó giá trị của ‘s’ được gán cho ‘r’ và cứ tiếp như vậy.


Thứ tụ ưu tiên của các toán tử

Thứ tự ưu tiên quyết định trật tự thực hiện các toán tử trên các biểu thức. Bảng dưới đây liệt kê thứ tự thực hiện các toán tử trong Java

Toán tử Mô tả
1 Các toán tử đơn như +,-,++,--
2 Các toán tử số học và các toán tử dịch như *,/,+,-,<<,>>
3 Các toán tử quan hệ như >,<,>=,<=,= =,!=
4 Các toán tử logic và Bit như &&,||,&,|,^
5 Các toán tử gán như =,*=,/=,+=,-=


Thay đổi thứ tự ưu tiên của các toán tử

Để thay đổi thứ tự ưu tiên trên một biểu thức, bạn có thể sử dụng dấu ngoặc đơn ():

  • Phần được giới hạn trong ngoặc đơn được thực hiện trước.
  • Nếu dùng nhiều ngoặc đơn lồng nhau thì toán tử nằm trong ngoặc đơn phía trong sẽ thực thi trước, sau đó đến các vòng phía ngoài.
  • Trong phạm vi một cặp ngoặc đơn thì quy tắc thứ tự ưu tiên vẫn giữ nguyên tác dụng.


Ví dụ:

public class TestThuTu {
    public static void main(String[] args) {
        int a = 20;
        int b = 5;
        int c = 10;
 
        System.out.println("a + b * c   = " + (a + b * c));
        System.out.println("(a + b) * c = " + ((a + b) * c));
        System.out.println("a / b - c   = " + (a / b - c));
        System.out.println("a / (b - c) = " + (a / (b - c)));
    }
}

Kết quả:

a + b * c   = 70
(a + b) * c = 250
a / b - c   = -6
a / (b - c) = -4

 

 

✅ Phương thức trong Java (Hàm)

Một phương thức là một tập hợp các khối lệnh (code) để thi hành một chức năng nào đó.

Ví dụ như phương thức System.out.println() đã biết, là một phương thức để in ra giá trị. Bạn có thể định nghĩa phương thức riêng của bạn, thực thi một nhiệm vụ cụ thể nào đó.


Tóm tắt cú pháp khai báo hàm

Hàm không có kết quả trả về

<modifier> void methodName(Danh sách các tham số) {
    // code
}

Hàm có kết quả trả về

<modifier> returnType methodName(Danh sách các tham số) {
    // code
    
    return <giá trị gì đó> //giống kiểu returnType 
}


Hãy xem ví dụ sau:

class MyClass {
    static void sayHello() {
        System.out.println("Hello World!");
    }
    public static void main(String[] args) {
        sayHello();
    }
}

Xuất ra:

Hello World!
 

Trong ví dụ trên, đã định nghĩa một phương thức sayHello(), phương thức đó được hàm main() gọi để in ra lời chào mừng. Như vậy để gọi phương thức để thi hành code chỉ cần viết tên phương thức và truyền các tham số nếu cần thiết. Một phương thức có thể gọi bao nhiêu lần là tùy mục đích.

Phần khai báo phương thức tên bạn thấy ngoài tên phương thức là sayHello và code của phương thức trong khối {...} thì bạn còn thấy:

  • static từ khóa này trước tên phương thức cho biết phương thức được gọi mà không cần thiết phải tạo đối tượng của phương thức, ngoài từ khóa này còn có các từ khóa như publicprotectedprivate sẽ tìm hiểu kỹ ở phần Phamj vi truy cập bài 2.
  • void cho biết phương thức này khi kết thúc không trả về dữ liệu gì, nếu sau này phương thức cần trả về dữ liệu thì thay bằng void bằng kiểu dữ liệu trả về như intString ...

 

🔆 Tham số của phương thức

Bạn có thể tạo phương thức chấp nhận các tham số truyền vào. Tham số được mô tả trong dấu cặp ngoặc (), các tham số mô tả bởi kiểu dữ liệu và tên tham số, nhiều tham số thì cách nhau bởi dấu phảy ,

Ví dụ phương thức sau có tên welcome, có một tham số kiểu String có tên là name

class MyClass {
    static void welcome(String name) {
        System.out.println("Xin chào " + name);
    }
    public static void main(String[] args) {
        welcome("Triều");
        welcome("Như");
        welcome("Mẫn");
    }
}

In ra:

Xin chào Triều
Xin chào Như
Xin chào Mẫn


🔆 Giá trị trả về của phương thức

Một phương thức có thể có giá trị trả về, sử dụng từ khóa return trong thân phương thức để kết thúc và trả về giá trị, hãy xem phương thức sau:

// Phương thức sum trả về kiểu int, là tổng của hai tham số
static int sum(int a, int b) {
    // phương thức kết thúc khi gặp return
    return a + b;
}

Chú ý trong định nghĩa phương thức, kiểu trả về phải được định nghĩa trước tên phương thức, như trên đó là kiểu int.


Giờ là ví dụ sử dụng phương thức trên

class MyClass {

    static int sum(int a, int b) {
        return a+ b;
    }

    public static void main(String[] args) {
        // giá trị trả về của sum lưu vào biến x
        int x = sum(2, 5);
        System.out.println(x);
    }
}

Kết quả in ra:

7
 

Bạn thấy, giá trị trả về của phương thức đã được gán vào biến x.

Khi phương thức bạn xây dựng mà không có giá trị trả về thì cần phải khai báo với từ khóa void.

// trả về giá trị kiểu int, số 5
static int returnFive() {
    return 5;
}

// phương thức có tham số, nhưng không có giá trị trả về
static void sayHelloTo(String name) {
    System.out.println("Hello " + name);
}

 


 

✅ Static trong Java

Trong java, Static có thể là:

  1. Biến static: Khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.
  2. Phương thức static: Khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.
  3. Khối static: Được sử dụng để khởi tạo thành viên dữ liệu static.

 

🔆 Biến static trong Java

Khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.

  1. Biến static có thể được sử dụng để tham chiếu thuộc tính chung của tất cả đối tượng (mà không là duy nhất cho mỗi đối tượng), ví dụ như tên công ty của nhân viên, tên trường học của các sinh viên, ...
  2. Biến static lấy bộ nhớ chỉ một lần trong Class Area tại thời gian tải lớp đó.


Lợi thế của biến static

Sử dụng biến static giúp chương trình của bạn sử dụng bộ nhớ hiệu quả hơn (tiết kiệm bộ nhớ).

Vấn đề khi không sử dụng biến static

class Student{ 
     int rollno; 
     String name; 
     String college="Bưu Chính Viễn Thông"; 
}


Giả sử có 1000 sinh viên trong trường đại học, bây giờ instance của các dữ liệu thành viên sẽ sự dụng bộ nhớ mỗi khi đối tượng được tạo. Tất cả sinh viên có rollno và name là thuộc tính riêng. Tuy nhiên, college là thuộc tính chung của tất cả đối tượng. Nếu chúng ta tạo nó là static, thì trường này sẽ chỉ sử dụng bộ nhớ một lần để lưu biến này.

Ghi chú: Thuộc tính static trong Java được chia sẻ tới tất cả đối tượng.

Ví dụ về biến static trong java

public class Student {
    int rollno;
    String name;
    static String college = "Bưu Chính Viễn Thông";


    Student(int r, String n) {
        rollno = r;
        name = n;
    }


    void display() {
        System.out.println(rollno + " - " + name + " - " + college);
    }


    public static void main(String args[]) {
        Student s1 = new Student(111, "Thông");
        Student s2 = new Student(222, "Minh");


        s1.display();
        s2.display();
    }
}​

 

Kết quả:

111 - Thông - Bưu Chính Viễn Thông
222 - Minh - Bưu Chính Viễn Thông


Ví dụ: Chương trình đếm số không sử dụng biến static trong java

Trong ví dụ dưới đây, chúng ta tạo một biến instance có tên count mà được tăng lên trong constructor. Khi biến instance này lấy bộ nhớ tại thời điểm tạo đối tượng, mỗi đối tượng sẽ có bản sao của biến instance đó, nếu nó được tăng lên, nó sẽ không ảnh hướng đến các đối tượng khác. Vì thế mỗi đối tượng sẽ có giá trị 1 trong biến count.

public class Counter1 {
    int count = 0; // sẽ lấy bộ nhớ khi instance được tạo ra

    Counter1() {
        count++;
        System.out.println(count);
    }


    public static void main(String args[]) {

        Counter1 c1 = new Counter1();
        Counter1 c2 = new Counter1();
        Counter1 c3 = new Counter1();

    }
}

Kết quả:

1
1
1


Ví dụ: Chương trình đếm số có sử dụng biến static trong java

Như bạn đã thấy ở trên, biến static sẽ lấy bộ nhớ chỉ một lần, nếu bất cứ đối tượng nào thay đổi giá trị của biến static, nó sẽ vẫn ghi nhớ giá trị của nó.

 
public class Counter2 {
    static int count = 0; // sẽ lấy bộ nhớ chỉ một lần

    Counter2() {
        count++;
        System.out.println(count);
    }


    public static void main(String args[]) {

        Counter2 c1 = new Counter2();
        Counter2 c2 = new Counter2();
        Counter2 c3 = new Counter2();

    }
}​

Kết quả:

1
2
3


🔆 Phương thức static trong Java

Nếu bạn áp dụng từ khóa static với bất cứ phương thức nào, thì phương thức đó được gọi là phương thức static.

  1. Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.
  2. Một phương thức static gọi mà không cần tạo một instance của một lớp.
  3. Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.

Ví dụ về phương thức static trong Java

 
public class Student2 {
    int rollno;
    String name;
    static String college = "Bưu Chính Viễn Thông";


    static void change() {
        // Thay đổi thuộc tính static (thuộc tính chung của tất cả các đối tượng)
        college = "Đại Học Công Nghệ";
    }


    Student2(int r, String n) {
        rollno = r;
        name = n;
    }


    void display() {
        System.out.println(rollno + " - " + name + " - " + college);
    }


    public static void main(String args[]) {
        Student2.change();


        Student2 s1 = new Student2(111, "Thông");
        Student2 s2 = new Student2(222, "Minh");
        Student2 s3 = new Student2(333, "Anh");


        s1.display();
        s2.display();
        s3.display();
    }
}​

Kết quả:

111 - Thông - Đại Học Công Nghệ 
222 - Minh - Đại Học Công Nghệ 
333 - Anh - Đại Học Công Nghệ


Sự hạn chế của phương thức static

Có hai hạn chế chính đối với phương thức static. Đó là:

  1. Phương thức static không thể sử dụng biến non-static hoặc gọi trực tiếp phương thức non-static.
  2. Từ khóa this và super không thể được sử dụng trong ngữ cảnh static.

Ví dụ:

class A1 {
    int a = 40; // non static


    public static void main(String args[]) {
        System.out.println(a);
    }
}

Kết quả:

Compile Time Error

 

🔆 Khối static trong Java

  1. Được sử dụng để khởi tạo thành viên dữ liệu static.
  2. Nó được thực thi trước phương thức main tại lúc tải lớp.

Ví dụ về khối static trong Java

public class A2 {
    static {
        System.out.println("Khối static: hello !");
    }


    public static void main(String args[]) {
        System.out.println("Main: hello !");
    }
}

Kết quả:

Khối static: hello ! 
Main: hello !

 


Câu hỏi: Tại sao phương thức main trong Java là static?

Bởi vì không cần thiết phải tạo đối tượng để gọi phương thức static. Nếu nó là phương thức non-static, JVM đầu tiên tạo đối tượng và sau đó gọi phương thức main() mà có thể gây ra vấn đề về cấp phát bộ nhớ bộ nhớ phụ.


Câu hỏi: Chúng ta có thể thực thi một chương trình mà không có phương thức main()?

Có, một trong các cách đó là khối static trong phiên bản trước của JDK. Không phải là JDK 1.7

Ví dụ:

public class A3 {
    static {
        System.out.println("static block is invoked");
        System.exit(0);
    }
}

Kết quả: (TH < jdk7)

static block is invoked

Kết quả: (TH >= jdk7)

Error: Main method not found in class A3, please define the main method as:
public static void main(String[] args)

Yeah chổ này thì chúng ta dùng Java 11 trở lên nên cũng không cần quan tâm.



✅ IF Else trong java

Mệnh đề if trong java được sử dụng để kiểm tra giá trị dạng boolean của điều kiện. Mệnh đề này trả về giá trị True hoặc False . Có các kiểu của mệnh đề if-else trong java như sau:

  • Mệnh đề if
  • Mệnh đề if-else
  • Mệnh đề if-else-if


Mệnh đề if

Mệnh đề if được sử dụng để kiểm tra giá trị dạng boolean của điều kiện. Khối lệnh sau if được thực thi nếu giá trị của điều kiện là True

Cú pháp:

if (condition) {  
    // khối lệnh này thực thi 
    // nếu condition = true
}  

IF Else - Anh Tester


Ví dụ:

public class Test {
    public static void main(String[] args) {
        int age = 20;
        if (age > 18) {
            System.out.print("Tuổi lớn hơn 18");
        }
    }
}

Kết quả:

Tuổi lớn hơn 18


🔆 Mệnh đề if else

Mệnh đề if-else cũng kiểm tra giá trị dạng boolean của điều kiện. Nếu giá trị điều kiện là True thì chỉ có khối lệnh sau if sẽ được thực hiện, nếu là False thì chỉ có khối lệnh sau else được thực hiện.

Cú pháp:

if (condition) {
    // khối lệnh này được thực thi
    // nếu condition = true
} else {
    // khối lệnh này được thực thi
    // nếu condition = false
}

Ví dụ:

public class Test {
    public static void main(String[] args) {
        int number = 13;
        if (number % 2 == 0) {
            System.out.println("Số " + number + " là số chẵn.");
        } else {
            System.out.println("Số " + number + " là số lẻ.");
        }
    }
}

Kết quả:

Số 13 là số lẻ.


🔆 Mệnh đề if-else-if

Mệnh đề if-else-if cũng kiểm tra giá trị dạng boolean của điều kiện. Nếu giá trị điều kiện if là True thì chỉ có khối lệnh sau if sẽ được thực hiện. Nếu giá trị điều kiện if else nào là True thì chỉ có khối lệnh sau else if đó sẽ được thực hiện… Nếu tất cả điều kiện của if và else if là False thì chỉ có khối lệnh sau else sẽ được thực hiện.

Cú pháp:

if (condition1) {  
    // khối lệnh này được thực thi 
    // nếu condition1 là true  
} else if (condition2) {  
    // khối lệnh này được thực thi 
    // nếu condition2 là true  
}  else if (condition3) {  
    // khối lệnh này được thực thi 
    // nếu condition3 là true  
}  
...  
else {  
    // khối lệnh này được thực thi 
    // nếu tất cả những điều kiện trên là false                 
}

Ví dụ:

public class Test {
    public static void main(String[] args) {
        int marks = 65;
 
        if (marks < 50) {
            System.out.println("Tạch!");
        } else if (marks >= 50 && marks < 60) {
            System.out.println("Xếp loại D");
        } else if (marks >= 60 && marks < 70) {
            System.out.println("Xếp loại C");
        } else if (marks >= 70 && marks < 80) {
            System.out.println("Xếp loại B");
        } else if (marks >= 80 && marks < 90) {
            System.out.println("Xếp loại A");
        } else if (marks >= 90 && marks < 100) {
            System.out.println("Xếp loại A+");
        } else {
            System.out.println("Giá trị không hợp lệ!");
        }
    }
}

Kết quả:

Xếp loại C

 

✅ Mệnh đề Switch Case trong Java

Mệnh đề switch case trong Java được sử dụng để thực thi 1 hoặc nhiều khối lệnh từ điều kiện đầu vào.

Cú pháp:

switch (bieu_thuc) {    
     case gia_tri_1:
        // Khối lệnh 1
        break;  //tùy chọn
    case gia_tri_2:    
        // Khối lệnh 2
        break;  //tùy chọn
    ......    
    case gia_tri_n:    
        // Khối lệnh n
        break;  //tùy chọn    
    default:     
        // Khối lệnh này được thực thi 
        // nếu tất cả các điều kiện trên không thỏa mãn 
}


[Selenium Java] Bài 1: Java Basic | Anh Tester

 

🔆 Mệnh đề Switch Case khi sử dụng 'break'

Khi sử dụng từ khóa 'break' trong mệnh đề switch case. Điều này có nghĩa là rơi vào case nào thì khối lệnh sẽ thực thi xong và thoát luôn switch đó, không phải kiểm tra tiếp các case bên dưới.

Ví dụ:

public class SwitchExampleBreak {
    public static void main(String[] args) {
        int number = 20;
        switch (number) {
        case 10:
            System.out.println("10");
            break;
        case 20:
            System.out.println("20");
            break;
        case 30:
            System.out.println("30");
            break;
        default:
            System.out.println("Not in 10, 20 or 30");
        }
    }
}

Kết quả:

20


🔆 Mệnh đề Switch Case khi KHÔNG sử dụng 'break'

Khi không sử dụng từ khóa 'break' trong mệnh đề switch case. Điều này có nghĩa là các khối lệnh sau cái case mà có giá trị phù hợp sẽ được thực thi tiếp cho đến hết mà không cần kiểm tra thoả điều kiện.

Ví dụ:

public class SwitchExampleNOTBreak {
    public static void main(String[] args) {
        int number = 20;
        switch (number) {
        case 10:
            System.out.println("10");
        case 20:
            System.out.println("20");
        case 30:
            System.out.println("30");
        default:
            System.out.println("Not in 10, 20 or 30");
        }
    }
}

Kết quả:

20
30
Not in 10, 20 or 30

 



✅ Vòng lặp For trong Java

Vòng lặp for trong java được sử dụng để lặp một phần của chương trình nhiều lần. Nếu số lần lặp là cố định thì vong lặp for được khuyến khích sử dụng, còn nếu số lần lặp không cố định thì nên sử dụng vòng lặp while hoặc do while.

Có 3 kiểu của vòng lặp for trong Java:

  • Vòng lặp for đơn giản
  • Vòng lặp for cải tiến
  • Vòng lặp for gán nhãn


🔆 Vòng lặp for đơn giản

Vòng lặp for đơn giản giống như trong C/C++. Chúng ta có thể khởi tạo biến, kiểm tra điều kiện và tăng/giảm giá trị của biến.

Cú pháp:

for (khoi_tao_bien ; check_dieu_kien ; tang/giam_bien) {  
    // Khối lệnh được thực thi
}

Vòng lặp For - Anh Tester

Ví dụ:

public class ForExample {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            System.out.println(i);
        }
    }
}

Kết quả:

1
2
3
4
5
6
7
8
9
10


🔆 Vòng lặp for cải tiến

Vòng lặp for cải tiến được sử dụng để lặp mảng(array) hoặc collection trong java. Bạn có thể sử dụng nó dễ dàng, dễ hơn cả vòng lặp for đơn giản. Bởi vì bạn không cần phải tăng hay giảm giá trị của biến rồi check điều kiện, bạn chỉ cần sử dụng ký hiệu hai chấm “:”

Cú pháp:

for (Type var : array) {  
    // Khối lệnh được thực thi
}

Ví dụ:

public class ForEachExample {
    public static void main(String[] args) {
        int arr[] = { 12, 23, 44, 56, 78 };
        for (int i : arr) {
            System.out.println(i);
        }
    }
}

Kết quả:

12
23
44
56
78




✅ Mảng (Array) trong Java

Mảng (array) là một tập hợp các phần tử có cùng kiểu dữ liệu và được lưu trữ gần nhau trong bộ nhớ. (có thứ tự)

Mảng trong Java là một đối tượng chứa các phần tử có kiểu dữ liệu giống nhau. Mảng là một cấu trúc dữ liệu nơi lưu trữ các phần tử giống nhau. Với mảng trong Java chúng ta chỉ có thể lưu trữ một tập các phần tử có số lượng phần tử cố định.

Mảng trong Java lưu các phần tử theo chỉ số và chỉ số của phần tử đầu tiên là 0.

Array - Anh Tester

Lợi ích của mảng trong Java

  • Tối ưu code: Mảng giúp lấy hoặc sắp xếp dữ liệu dễ dàng.
  • Truy cập ngẫu nhiên: Chúng ta có thể lấy dữ liệu được lưu trữ ở bất kỳ vị trí nào thông qua chỉ số.

Sự bất tiện của mảng trong java

  • Giới hạn kích thước: Chúng ta phải khởi tạo kích thước của mảng trong java trước khi sử dụng. Không thể thay đổi được kích thước của nó lúc runtime. Collection framework được sử dụng trong java để giải quyết vấn đề này.

Các kiểu của mảng trong Java

Có hai kiểu mảng trong java

  • Mảng một chiều
  • Mảng đa chiều
Chổ này thì chúng ta chỉ học mảng một chiều thôi nhé. Mảng đa chiều rất phức tạp và khuyên hạn chế dùng hoặc không nên dùng.


✳️ Mảng một chiều trong Java

Các cách khai báo mảng một chiều trong Java

dataType[] arr;
dataType []arr; 
dataType arr[];  


🔆 Khởi tạo mảng một chiều trong Java

datatype <tên mảng>[] = new datatype[size];


🔆 Ví dụ về mảng một chiều trong Java

Ví dụ đơn giản về khai báo, khởi tạo và duyệt các phần tử của mảng.

public class TestArray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// khai báo và khởi tạo mảng
		int a[] = new int[3];
		a[0] = 10; // gán giá trị
		a[1] = 20;
		a[2] = 50;

		// in mảng ra màn hình
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}

}

Kết quả:

10 20 50


🔆 Khai báo và khởi tạo mảng một chiều theo kiểu nặc danh

Ví dụ:

public class TestArray1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// gán mảng nặc danh cho mảng a
		int a[] = { 33, 3, 4, 5 };

		// in mảng a ra màn hình
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
	}

}

Kết quả:

33 3 4 5


Truyền mảng vào phương thức trong java

Chúng ta có thể truyền mảng vào phương thức, điều này giúp tái sử dụng code logic để xử lý mảng bất kỳ. Ví dụ:

public class TestArray2 {

	static void min(int arr[]) {
        int min = arr[0];
        for (int i = 1; i < arr.length; i++)
            if (min > arr[i]) {
                min = arr[i];
            }
        System.out.println(min);
    }
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[] = { 33, 3, 4, 5 };
        min(a);// truyền mảng tới phương thức
	}

}

Kết quả:

3

 

Collection trong Java

"Collection" và "Collections" trong java là hai khái niệm khác nhau.

Collections trong java là một khuôn khổ cung cấp một kiến trúc để lưu trữ và thao tác tới nhóm các đối tượng. Tất cả các hoạt động mà bạn thực hiện trên một dữ liệu như tìm kiếm, phân loại, chèn, xóa,... có thể được thực hiện bởi Java Collections.

Collection trong java là một root interface trong hệ thống cấp bậc Collection. Java Collection cung cấp nhiều interface (Set, List, Queue, Deque, ..vv..) và các lớp (ArrayList, Vector, LinkedList, PriorityQueue, HashSet, LinkedHashSet, TreeSet, ..vv..).

colection vs collections trong java


 

Hệ thống cấp bậc Collection trong java

Gói java.util chứa tất cả các lớp và interface của Collection.

hệ thống cấp bậc collection trong java


Dưới đây là mô tả những interface chính của Collection

  • Set: là một collection không thể chứa 2 giá trị trùng lặp. Set được sử dụng để biểu diễn các bộ, chẳng hạn như bộ tú lu khơ, thời khóa biểu của học sinh, các tiến trình đang chạy trên máy tính...
  • List: là một collection có thứ tự (đôi khi còn được gọi là một chuỗi). List có thể chứa các phần tử trùng lặp. Thường có quyền kiểm soát chính xác vị trí các phần tử được chèn vào và có thể truy cập chúng bằng chỉ số (vị trí của chúng).
  • Queue (hàng đợi): là một collection được sử dụng để chứa nhiều phần tử trước khi xử lý. Bên cạnh các thao tác cơ bản của collection, Queue cung cấp các thao tác bổ sung như chèn, lấy ra và kiểm tra. Queue có thể được sử dụng như là FIFO (first-in, first-out - vào trước, ra trước)
  • Deque: là một collection được sử dụng để chứa nhiều phần tử trước khi xử lý. Ngoài các thao tác cơ bản của collection, một Deque cung cấp các thao tác bổ sung như chèn, lấy ra và kiểm tra. Deques có thể được sử dụng như là FIFO (first-in, first-out - vào trước, ra trước) và LIFO (last-in, first-out - vào sau, ra trước). Trong một Deque, tất cả các phần tử mới có thể được chèn vào, lấy ra và lấy ra ở cả hai đầu.
  • Map: là một đối tượng ánh xạ mỗi key tương úng với một giá trị. Map không thể chứa key trùng lặp (nếu trùng thì nó chỉ hiểu key ở cuối cùng). Mỗi key có thể ánh xạ đến chỉ một giá trị.

Dưới đây là mô tả 2 interface được sắp xếp của Set mà Map

  • SortedSet: là một Set chứa các phần tử theo thứ tự tăng dần.
  • SortedMap: là một Map chứa các phần tử được sắp xếp theo thứ tự tăng dần của key của chúng. Các SortedMap được sử dụng cho các collection theo thứ tự tự nhiên của cặp key/value, chẳng hạn như từ điển và danh bạ điện thoại.

Iterable interface

Iterable interface chứa dữ liệu thành viên Iterator interface

Iterator interface

Giao tiếp Iterator cung cấp phương tiện để lặp đi lặp lại các thành phần từ đầu đến cuối của một collection.

Các phương thức của Iterator interface

Chỉ có ba phương pháp trong giao tiếp Iterator như sau:

Phương thức Mô tả
public boolean hasNext() Nó trả về true nếu iterator còn phần tử kế tiếp phần tử đang duyệt.
public object next() Nó trả về phần tử hiện tại và di chuyển con trỏ trỏ tới phần tử tiếp theo.
public void remove() Nó loại bỏ phần tử cuối được trả về bởi Iterator. Nó hiếm khi được sử dụng.

Các phương thức của interface Collection trong java

Có nhiều phương thức được khai báo trong interface Collection như sau:

Phương thức Mô tả
public boolean add(Object element) Được sử dụng để chèn một phần tử vào collection.
public boolean addAll(Collection c) Được sử dụng để chèn các phần tử collection được chỉ định vào collection gọi phương thức này.
public boolean remove(Object element) Được sử dụng để xóa phần tử từ collection.
public boolean removeAll(Collection c) Được sử dụng để xóa tất cả các phần tử của collection được chỉ định từ collection gọi phương thức này.
public boolean retainAll(Collection c) Được sử dụng để xóa tất cả các thành phần từ collection gọi phương thức này ngoại trừ collection được chỉ định.
public int size() Trả lại tổng số các phần tử trong collection.
public void clear() Loại bỏ tổng số của phần tử khỏi collection.
public boolean contains(Object element) Được sử dụng để tìm kiếm phần tử.
public boolean containsAll(Collection c) ược sử dụng để tìm kiếm collection được chỉ định trong collection.
public Iterator iterator() Trả về một iterator.
public Object[] toArray() Chuyển đổi collection thành mảng (array).
public boolean isEmpty() Kiểm tra nếu collection trống.
public boolean equals(Object element) So sanh 2 collection.
public int hashCode() Trả về số hashcode của collection.

 

Ví dụ về Collection trong java

File: CollectionExample1.jva

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class CollectionExample1 {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<String>();
        arrayList.add("PHP");
        arrayList.add("Python");
        arrayList.add("Java");
        arrayList.add("C++");
        System.out.println("Các phần tử của ArrayList");
        System.out.print("\t" + arrayList + "\n");


        List<String> linkedList = new LinkedList<String>();
        linkedList.add("PHP");
        linkedList.add("Python");
        linkedList.add("Java");
        linkedList.add("C++");
        System.out.println("Các phần tử của LinkedList");
        System.out.print("\t" + linkedList + "\n");


        // new TreeSet() sẽ sắp xếp các phần tử
        Set<String> hashSet = new HashSet<String>();
        hashSet.add("PHP");
        hashSet.add("Python");
        hashSet.add("Java");
        hashSet.add("Java");
        hashSet.add("C++");
        System.out.println("Các phần tử của Set");
        System.out.print("\t" + hashSet + "\n");


        // new TreeMap() sẽ sắp xếp các phần tử dự vào key của chúng
        Map<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("Windows", "2000");
        hashMap.put("Windows", "XP");
        hashMap.put("Language2", "Java");
        hashMap.put("Language1", ".Net");
        System.out.println("Các phần tử của Map");
        System.out.print("\t" + hashMap);
    }
}

Output:

Các phần tử của ArrayList
 [PHP, Python, Java, C++]
Các phần tử của LinkedList
 [PHP, Python, Java, C++]
Các phần tử của Set
 [Java, C++, PHP, Python]
Các phần tử của Map
 {Language1=.Net, Windows=XP, Language2=Java}

Non-generic Collection và Generic Collection

Collection trong java là non-generic trước JDK 1.5. Từ JDK 1.5 về sau là generic.

Generic Collection trong java cho phép chỉ có một kiểu đối tượng trong collection. Đây là một kiểu an toàn vì không cần phải ép kiểu tại runtime.

Ví dụ về non-generic collection - kiểu cũ

ArrayList list = new ArrayList();

Ví dụ về generic collection - kiểu mới

ArrayList<String> list = new ArrayList<String>();

Trong generic collection, chúng ta phải chỉ định kiểu dữ liệu được đặt trong <...>. Từ JDK 1.5 về sau, khi sử dụng ArrayList bắt buộc phải chỉ định kiểu dữ liệu cho nó. Nếu bạn cố gắng thêm một đối tượng có kiểu khác vào, chương trình sẽ báo lỗi compile-time.

Ví dụ generic collection trong java


Duyệt các phần tử của collection

Có 2 cách để duyệt các phần tử của collection trong java.

  1. Sử dụng Iterator interface.
  2. Sử dụng vòng lặp for-each.

Ví dụ 1: ArrayListExample1.java

import java.util.ArrayList;
import java.util.Iterator;


public class ArrayListExample1 {
    public static void main(String args[]) {
        // Creating arraylist
        ArrayList<String> list = new ArrayList<String>();
        // Add objects to arraylist
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");
        // Show list through Iterator
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            System.out.print(itr.next() + ", ");
        }
        // Show list through for-each
        System.out.println();
        for (String obj : list) {
            System.out.print(obj + ", ");
        }
        // Show list through index
        System.out.println();
        int size = list.size();
        for (int i = 0; i < size; i++) {
            System.out.print(list.get(i) + ", ");
        }
    }
}

Output:

Java, C++, PHP, Java, 
Java, C++, PHP, Java, 
Java, C++, PHP, Java, 

Ví dụ 2: HashSetExample1.java

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


public class HashSetExample1 {
    public static void main(String[] args) {
        // Creating hashset
        Set<String> set = new HashSet<String>();
        // Add objects to hashset
        set.add("Java");
        set.add("C++");
        set.add("PHP");
        set.add("Java");
        // Show set through Iterator
        Iterator<String> itr = set.iterator();
        while (itr.hasNext()) {
            System.out.print(itr.next() + ", ");
        }
        // Show set through for-each
        System.out.println();
        for (String obj : set) {
            System.out.print(obj + ", ");
        }
    }
}

Output:

 

Java, C++, PHP, 
Java, C++, PHP, 

 

Ví dụ 3: duyệt Map

import java.util.HashMap;
import java.util.Map;

public class DemoMap {
    public static void main(String[] args) {

        Map<String, String> hashMap = new HashMap<String, String>();

        hashMap.put("Windows", "XP");
        hashMap.put("Windows", "2000");
        hashMap.put("Language2", "Java");
        hashMap.put("Language1", ".Net");

        hashMap.remove("Language1");
        System.out.println(hashMap.containsKey("Windows"));
        System.out.println(hashMap.containsValue(".Net"));

        System.out.println("Các phần tử của Map");
        System.out.print("\t" + hashMap);

        //2 trường hợp mình dùng nhiều là đọc data Excel và JSON
        //Thiết lập config cho Driver trong Selenium

        System.out.println("");
        //Truy xuất giá trị theo từng key
        System.out.println(hashMap.get("Windows"));

        //Get hết giá trị của key và value
        for (Map.Entry<String, String> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

    }
}

Kết quả:

2000
Windows: 2000
Language2: Java

 

Lớp ArrayList trong java

Lớp ArrayList trong java là một lớp kế thừa lớp AbstractList và triển khai của List Interface trong Collections Framework nên nó sẽ có một vài đặc điểm và phương thức tương đồng với List. ArrayList được sử dụng như một mảng động để lưu trữ các phần tử.

Những điểm cần ghi nhớ về ArrayList:

  • Lớp ArrayList trong java có thể chứa các phần tử trùng lặp.
  • Lớp ArrayList duy trì thứ tự của phần tử được thêm vào.
  • Lớp ArrayList là không đồng bộ (non-synchronized).
  • Lớp ArrayList cho phép truy cập ngẫu nhiên vì nó lưu dữ liệu theo chỉ mục.
  • Lớp ArrayList trong java, thao tác chậm vì cần nhiều sự dịch chuyển nếu bất kỳ phần tử nào bị xoá khỏi danh sách.

 

🔆 Hệ thống cấp bậc của lớp ArrayList trong java (Hierarchy)

Hierarchy của lớp ArrayList trong java

Lớp java.util.ArrayList được khai báo như sau:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

🔆 Khởi tạo ArrayList trong java

Có 2 kiểu khởi tạo ArrayList là non-generic và generic, xem thêm trong bài Collection trong java

ArrayList list = new ArrayList(); // non-generic - kiểu cũ
ArrayList<String> list = new ArrayList<String>(); // generic - kiểu mới

 

🔆 Constructor của lớp ArrayList

Constructor Mô tả
ArrayList() Nó được sử dụng để khởi tạo một danh sách mảng trống.
ArrayList(Collection c) Nó được sử dụng để xây dựng một danh sách mảng được khởi tạo với các phần tử của collection c.
ArrayList(int capacity) Nó được sử dụng để xây dựng một danh sách mảng mà có dung lượng ban đầu được chỉ định.

Phương thức của lớp ArrayList

Phương thức Mô tả
boolean add(Object o) Nó được sử dụng để nối thêm phần tử được chỉ định vào cuối một danh sách.
void add(int index, Object element) Nó được sử dụng để chèn phần tử element tại vị trí index vào danh sách.
boolean addAll(Collection c) Nó được sử dụng để nối tất cả các phần tử trong collection c vào cuối của danh sách, theo thứ tự chúng được trả về bởi bộ lặp iterator.
boolean addAll(int index, Collection c) Nó được sử dụng để chèn tất cả các phần tử trong collection c vào danh sách, bắt đầu từ vị trí index.
void retainAll(Collection c) Nó được sử dụng để xóa những phần tử không thuộc collection c ra khỏi danh sách.
void removeAll(Collection c) Nó được sử dụng để xóa những phần tử thuộc collection c ra khỏi danh sách.
int indexOf(Object o) Nó được sử dụng để trả về chỉ mục trong danh sách với sự xuất hiện đầu tiên của phần tử được chỉ định, hoặc -1 nếu danh sách không chứa phần tử này.
int lastIndexOf(Object o) Nó được sử dụng để trả về chỉ mục trong danh sách với sự xuất hiện cuối cùng của phần tử được chỉ định, hoặc -1 nếu danh sách không chứa phần tử này.
Object[] toArray() Nó được sử dụng để trả về một mảng chứa tất cả các phần tử trong danh sách này theo đúng thứ tự.
Object[] toArray(Object[] a) Nó được sử dụng để trả về một mảng chứa tất cả các phần tử trong danh sách này theo đúng thứ tự.
Object clone() Nó được sử dụng để trả về một bản sao của ArrayList.
void clear() Nó được sử dụng để xóa tất cả các phần tử từ danh sách này.
void trimToSize() Nó được sử dụng để cắt dung lượng của thể hiện ArrayList này là kích thước danh sách hiện tại.
boolean contains(element) Kết quả trả về là true nếu tìm thấy element trong danh sách, ngược lại trả về false.

 

🔆 Các ví dụ ArrayList trong Java

Khởi tạo một ArrayList

Để khai báo một ArrayList, chúng ta cần phải import gói thư viện java.util.ArrayList của Java. Cú pháp import như sau:

// import gói thư viện java.util.ArrayList
import java.util.ArrayList;


public class KhoiTaoArrayList {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là listString
        // có kiểu là String
        ArrayList<String> listString = new ArrayList<String>();
    }
}

Ngoài ra, nếu chúng ta đã biết trước số lượng phần tử thì chúng ta có thể khai báo kèm với số lượng phần tử của nó. Ví dụ dưới đây sẽ khai báo một ArrayList có kiểu String và có 20 phần tử:

// import gói thư viện java.util.ArrayList
import java.util.ArrayList;


public class KhoiTaoArrayList {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là listString
        // có kiểu là String
        ArrayList<String> listString = new ArrayList<String>(20);
    }
}

🔆 Hiển thị các phần tử có trong ArrayList

Để hiển thị các phần tử có trong ArrayList, chúng ta có các cách như sau:

🔆 Hiển thị theo tên của ArrayList.

package anhtester.com.arraylist;


import java.util.ArrayList;


public class DuyetArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");
        // hiển thị các phần tử của list
        System.out.println("Các phần tử có trong list là: ");
        System.out.println(list);
    }
}

Kết quả:

Các phần tử có trong list là:
[Java, C++, PHP, Java]

🔆 Duyệt các phần tử của ArrayList - sử dụng vòng lặp for

package anhtester.com.arraylist;


import java.util.ArrayList;


public class DuyetArrayList2 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Ruby");
        // sử dụng vòng lặp for - hiển thị các phần tử của list
        System.out.println("Các phần tử có trong list là: ");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

Kết quả:

Các phần tử có trong list là:
Java
C++
PHP
Ruby

🔆 Duyệt các phần tử của ArrayList - sử dụng vòng lặp for cải tiến

package anhtester.com.arraylist;


import java.util.ArrayList;


public class DuyetArrayList3 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Csharp");
        // sử dụng vòng lặp for cải tiến - hiển thị các phần tử của list
        System.out.println("Các phần tử có trong list là: ");
        for (String str : list) {
            System.out.println(str);
        }
    }
}

Kết quả:

Các phần tử có trong list là:
Java
C++
PHP
Csharp

🔆 Duyệt các phần tử của ArrayList - sử dụng Iterator.

Để sử dụng được Iterator chúng ta cần phải import gói thư viện java.util.Iterator của Java.

package anhtester.com.arraylist;


import java.util.ArrayList;
import java.util.Iterator;


public class DuyetArrayList4 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Javascript");
        // sử dụng Iterator - hiển thị các phần tử của list
        Iterator<String> iterator = list.iterator();
        System.out.println("Các phần tử có trong list là: ");
        while (iterator.hasNext()) {
            System.out.println((String) iterator.next());
        }
    }
}

Kết quả:

Các phần tử có trong list là:
Java
C++
PHP
Javascript

🔆 Duyệt các phần tử của ArrayList - sử dụng ListIterator.

Vì ArrayList là một lớp triển khai của List Interface nên nó cũng có thể sử dụng ListIterator để duyệt qua các phần tử của nó. Để sử dụng được ListIterator chúng ta cần phải import gói thư viện java.util.ListIterator của Java.

package anhtester.com.arraylist;


import java.util.ArrayList;
import java.util.ListIterator;


public class DuyetArrayList5 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Python");
        // sử dụng ListIterator - hiển thị các phần tử của list
        ListIterator<String> iterator = list.listIterator();
        System.out.println("Các phần tử có trong list là: ");
        while (iterator.hasNext()) {
            System.out.println((String) iterator.next());
        }
    }
}

Kết quả:

Các phần tử có trong list là:
Java
C++
PHP
Python

✅ Các phương thức addAll(), removeAll(), retainAll() của lớp ArrayList

Ví dụ sau minh họa cách sử dụng các phương thức addAll(), removeAll(), retainAll() của lớp ArrayList trong Java:

package anhtester.com.arraylist;


import java.util.ArrayList;


public class PhuongThucArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // Add objects to list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");


        System.out.println("ví dụ sử dụng phương thức addAll()");
        System.out.println("-----------------------------------");
        // thêm các phần tử của list vào listA
        ArrayList<String> listA = new ArrayList<String>();
        listA.addAll(list);
        System.out.print("listA:");
        showList(listA);


        System.out.println("\nví dụ sử dụng phương thức retainAll()");
        System.out.println("-----------------------------------");
        // khởi tạo listB
        ArrayList<String> listB = new ArrayList<String>();
        listB.add("Java");
        // xóa những phần tử không thuộc listB khỏi listA
        listA.retainAll(listB);
        System.out.print("listA:");
        showList(listA);


        System.out.println("\nví dụ sử dụng phương thức removeAll()");
        System.out.println("-----------------------------------");
        // xóa những phần tử thuộc listB  khỏi list
        list.removeAll(listB);
        System.out.print("list:");
        showList(list);
    }


    public static void showList(ArrayList<String> list) {
        // Show list through for-each
        for (String obj : list) {
            System.out.print("\t" + obj + ", ");
        }
        System.out.println();
    }
}

Kết quả:

ví dụ sử dụng phương thức addAll()
-----------------------------------
listA:	Java, 	C++, 	PHP, 	Java, 

ví dụ sử dụng phương thức retainAll()
-----------------------------------
listA:	Java, 	Java, 

ví dụ sử dụng phương thức removeAll()
-----------------------------------
list:	C++, 	PHP, 

Truy cập phần tử của ArrayList

Java cung cấp cho chúng ta phương thức get() để truy cập đến 1 phần tử bất kỳ trong ArrayList thông qua chỉ số của phần tử đó. Chỉ số của ArrayList trong Java bắt đầu từ 0.

package vn.viettuts.arraylist;
 
import java.util.ArrayList;
 
public class TruyCapArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");
         
        // truy cập phần tử có chỉ số 3 của list
        System.out.println(list.get(3));
    }
}

Kết quả:

Java

Cập nhật giá trị của phần tử Arraylist

Để cập nhật giá trị của phần tử trong ArrayList, Java cung cấp cho chúng ta phương thức set(index, element), trong đó index là chỉ số của phần tử cần cập nhật và element là phần tử mới để thay thế.

package anhtester.com.arraylist;


import java.util.ArrayList;


public class CapNhatArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");


        System.out.println("list trước khi cập nhật: ");
        System.out.println(list);
        // cập nhật giá trị cho phần tử có chỉ số là 3 (Java)
        list.set(3, "Python");
        System.out.println("list trước khi cập nhật: ");
        System.out.println(list);
    }
}

Kết quả:

list trước khi cập nhật: 
[Java, C++, PHP, Java]
list trước khi cập nhật: 
[Java, C++, PHP, Python]

Xóa phần tử ArrayList

Để xóa phần tử trong ArrayList, Java cung cấp cho chúng ta 2 phương thức có sẵn đó là phương thức clear() và phương thức remove().

Phương thức clear()

Phương thức clear() sẽ xóa tất cả các phần tử có trong ArrayList. Sau đây là ví dụ minh họa phương thức này.

package anhtester.com.arraylist;


import java.util.ArrayList;


public class XoaArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Python");


        System.out.println("Số phần tử của list ban đầu : " + list);
        System.out.println("Các phần tử của list ban đầu: " + list.size());
        // clear list
        list.clear();
        System.out.println("\nSố phần tử của list sau khi clear: " + list);
        System.out.println("Các phần tử của list sau khi clear: " + list.size());
    }
}

Kết quả:

Số phần tử của list ban đầu : [Java, C++, PHP, Python]
Các phần tử của list ban đầu: 4

Số phần tử của list sau khi clear: []
Các phần tử của list sau khi clear: 0


Phương thức remove()

Phương thức remove() sẽ xóa phần tử ra khỏi ArrayList theo 2 cách đó là xóa dựa vào chỉ số của phần tử và xóa trực tiếp phần tử đó (không cần biết đến chỉ số của nó). Ví dụ dưới đây sẽ minh họa 2 cách xóa này:

package anhtester.com.arraylist;


import java.util.ArrayList;


public class XoaArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Python");


        System.out.println("Số phần tử của list ban đầu : " + list);
        System.out.println("Các phần tử của list ban đầu: " + list.size());
        // remove phần tử có chỉ số index = 1 khỏi list
        list.remove(1);
        System.out.println("\nSố phần tử của list sau khi remove phan tu co index = 1: "
                + list);
        System.out.println("Các phần tử của list sau khi remove phan tu co index = 1: "
                + list.size());
        // remove phần tử có chỉ số index = 1 khỏi list
        list.remove("PHP");
        System.out.println("\nSố phần tử của list sau khi remove phan tu \"PHP\": "
                + list);
        System.out.println("Các phần tử của list sau khi remove phan tu \"PHP\": "
                + list.size());
    }
}

Kết quả:

Số phần tử của list ban đầu : [Java, C++, PHP, Python]
Các phần tử của list ban đầu: 4

Số phần tử của list sau khi remove phan tu co index = 1: [Java, PHP, Python]
Các phần tử của list sau khi remove phan tu co index = 1: 3

Số phần tử của list sau khi remove phan tu "PHP": [Java, Python]
Các phần tử của list sau khi remove phan tu "PHP": 2

Tìm kiếm một phần tử ArrayList

Để tìm kiếm một phần tử trong ArrayList thì chúng ta có 3 phương pháp tìm kiếm như sau:

Tìm kiếm trực tiếp phần tử.

Để tìm kiếm trực tiếp phần tử, chúng ta sẽ sử dụng phương thức contains() . Kết quả trả về là true nếu tìm thấy, ngược lại trả về false.

package anhtester.com.arraylist;


import java.util.ArrayList;


public class TimKiemArrayList1 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Python");
         
        // kiểm tra xem PHP có tồn tại trong list hay không?
        System.out.println(list.contains("PHP"));
        // kiểm tra xem ANDROID có tồn tại trong list hay không?
        System.out.println(list.contains("ANDROID"));
    }
}

Kết quả:

true
false

Tìm kiếm vị trí xuất hiện đầu tiên của 1 phần tử trong ArrayList.

Để tìm kiếm vị trí xuất hiện đầu tiên của 1 phần tử trong ArrayList, chúng ta sẽ sừ dụng phương thức indexOf(). Kết quả của phương thức này sẽ trả về chỉ số xuất hiện đầu tiên của phần tử đó trong ArrayList, ngược lại nếu không tìm thấy trả về -1.

package anhtester.com.arraylist;


import java.util.ArrayList;


public class TimKiemArrayList2 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Python");
         
        // kiểm tra xem Java có tồn tại trong list hay không?
        System.out.println(list.indexOf("Java"));
        // kiểm tra xem ANDROID có tồn tại trong list hay không?
        System.out.println(list.indexOf("ANDROID"));
    }
}

Kết quả:

0
-1

Tìm kiếm vị trí xuất hiện cuối cùng của 1 phần tử trong List.

Để tìm kiếm vị trí xuất hiện cuối cùng của 1 phần tử trong ArrayList, chúng ta sẽ sừ dụng phương thức lastIndexOf(). Kết quả của phương thức này sẽ trả về chỉ số xuất hiện cuối cùng của phần tử đó trong ArrayList, ngược lại nếu không tìm thấy trả về -1.

package vn.viettuts.arraylist;


import java.util.ArrayList;


public class TimKiemArrayList3 {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");
         
        // kiểm tra xem Java có tồn tại trong list hay không?
        System.out.println(list.lastIndexOf("Java"));
        // kiểm tra xem ANDROID có tồn tại trong list hay không?
        System.out.println(list.lastIndexOf("ANDROID"));
    }
}

Kết quả:

3
-1

Chuyển ArrayList sang mảng (Array) trong Java

Phương thức toArray() trong Java được dùng để chuyển đổi một ArrayList sang mảng tương ứng. Sau đây là ví dụ minh họa phương thức này:

package anhtester.com.arraylist;


import java.util.ArrayList;


public class ConvertToArray {
    public static void main(String[] args) {
        // khai báo 1 ArrayList có tên là list
        // có kiểu là String
        ArrayList<String> list = new ArrayList<String>();
        // thêm các phần tử vào list
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");


        // sử dụng phương thức toArray() chuyển list thành mảng
        // kết quả của phương thức này sẽ trả về mảng arr
        Object[] arr = list.toArray();


        // hiển thị các phần tử có trong mảng arr
        for (int i = 0; i < arr.length; i++) {
            System.out.println("Phần tử tại vị trí " + i + " "
                    + "trong arr là " + arr[i]);
        }
    }
}

Kết quả:

Phần tử tại vị trí 0 trong arr là Java
Phần tử tại vị trí 1 trong arr là C++
Phần tử tại vị trí 2 trong arr là PHP
Phần tử tại vị trí 3 trong arr là Java

Tạo ArrayList có kiểu generic là String

File: ArrayListExample1.java

import java.util.ArrayList;
import java.util.Iterator;


public class ArrayListExample1 {
    public static void main(String args[]) {
        // Creating arraylist
        ArrayList<String> list = new ArrayList<String>();
        // Add objects to arraylist
        list.add("Java");
        list.add("C++");
        list.add("PHP");
        list.add("Java");
        // Show list through Iterator
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            System.out.print(itr.next() + ", ");
        }
        // Show list through for-each
        System.out.println();
        for (String obj : list) {
            System.out.print(obj + ", ");
        }
        // Show list through index
        System.out.println();
        int size = list.size();
        for (int i = 0; i < size; i++) {
            System.out.print(list.get(i) + ", ");
        }
    }
}

Tạo ArrayList có kiểu generic là đối tượng do người dùng định nghĩa

File: ArrayListExample2.java

import java.util.ArrayList;


class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student@[name=" + name + ", age=" + age + "]";
    }
}


public class ArrayListExample2 {
    public static void main(String[] args) {
        // Create listStudent
        ArrayList<Student> listStudent = new ArrayList<Student>();
        // Create students
        Student student1 = new Student("Bac", 17);
        Student student2 = new Student("Nam", 20);
        Student student3 = new Student("Trung", 19);
        // Add objects to listStudent
        listStudent.add(student1);
        listStudent.add(student2);
        listStudent.add(student3);
        // Show listStudent
        for (Student student : listStudent) {
            System.out.println(student.toString());
        }
    }
}

Output:

Student@[name=Bac, age=17]
Student@[name=Nam, age=20]
Student@[name=Trung, age=19]

So sánh ArrayList vs LinkedList

ArrayList và LinkedList đều là lớp triển khai của List Interface. Vậy khi nào chúng ta sẽ sử dụng ArrayList và khi nào chúng ta sẽ sử dụng LinkedList? Chúng ta sẽ sử dụng ArrayList khi ứng dụng của chúng ta cần truy xuất phần tử nhiều hơn cập nhật và xóa phần tử và chúng ta sẽ sử dụng LinkedList khi ứng dụng của chúng ta cần cập nhật và xóa phần tử nhiều hơn là truy cập phần tử.

 

So sánh ArrayList vs Array

Mảng (Array) là một cấu trúc dữ liệu có kích thước cố định, trong khi ArrayList là một lớp Collection có thể thay đổi được kích thước. Nghĩa là chúng ta không thể thay đổi kích thước của mảng khi đã tạo, nhưng ArrayList có thể được thay đổi.

Chúng ta không thể lưu giữ dữ liệu nguyên thủy trong ArrayList, nó chỉ có thể chứa các đối tượng. Nhưng mảng có thể chứa cả hai kiểu dữ liệu nguyên thủy và các đối tượng trong Java. Kể từ Java 5, kiểu nguyên thủy được tự động chuyển đổi trong các đối tượng được gọi là auto-boxing.

Sự khác nhau giữa Array với ArrayList được tóm tắt lại như trong bảng sau:

Array ArrayList
1) Kích thước cố định. Kích thước có thể thay đổi được.
2) Có thể lưu trữ dữ liệu kiểu nguyên thủy và đối tượng. Chỉ có thể lưu trữ dữ liệu kiểu đối tượng. Kể từ Java 5, kiểu nguyên thủy được tự động chuyển đổi trong các đối tượng được gọi là auto-boxing.
3) Tốc độ lưu trữ và thao tác nhanh hơn. Tốc độ lưu trữ vào thao tác chậm hơn.
4) Chỉ có thuộc tính length. Có nhiều phương thức để thao tác với dữ liệu.

 

Làm sao để chuyển đổi Array thành ArrayList và ngược lại?

Dưới đây là ví dụ về việc chuyển đổi ArrayList thành Array và Array thành ArrayList:

package anhtester.com.collection;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class Example1 {
    public static void main(String[] args) {
        // create arrayList
        List<String> arrayList = new ArrayList<>();
        // adding String object to arrayList
        arrayList.add("Java");
        arrayList.add("C");
        arrayList.add("C++");
        arrayList.add("PHP");
        arrayList.add("Python");
         
        // convert ArrayList to Array
        System.out.println("Convert ArrayList to Array:");
        String[] item = arrayList.toArray(new String[arrayList.size()]);
        // show item
        for (String s : item) {
            System.out.println(s);
        }
         
        // convert Array to ArrayList
        System.out.println("Convert Array to ArrayList:");
        List<String> list2 = new ArrayList<>();
        list2 = Arrays.asList(item);
        // show list2
        System.out.println(list2);
    }
}

Kết quả:

Convert ArrayList to Array:
Java
C
C++
PHP
Python
Convert Array to ArrayList:
[Java, C, C++, PHP, Python]


 

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học