1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình nâng cao với Java

170 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập trình nâng cao với Java
Trường học Đại học SPKT Hưng Yên
Chuyên ngành Công nghệ Phần mềm
Thể loại Bài giảng
Thành phố Hưng Yên
Định dạng
Số trang 170
Dung lượng 1,18 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • Bài 1. Kế thừa và đa hình trong Java (9)
    • 1.1. Đối tượng trong Java (9)
    • 1.2 Lớp trong Java (9)
    • 1.3 Phương thức trong Java (11)
    • 1.4 Tạo một đối tượng trong Java (11)
    • 1.5 Truy cập các biến instance và các phương thức trong Java (12)
    • 1.6 Đối tượng vô danh (annonymous) trong Java (16)
  • Bài 3: Xử lý ngoại lệ (19)
    • 3.1 Exception là gì? (19)
    • 3.2 Khối try trong Java (23)
    • 3.3 Sự sử dụng khối finally trong Java (28)
    • 3.6 Phân biệt final, finally, và finalize trong Java (29)
    • 3.4 Từ khóa throw trong Java (31)
    • 3.5 Từ khóa throws trong Java (32)
    • A. Chương trình ví dụ nếu exception không xuất hiện (35)
    • B. Chương trình ví dụ nếu exception xuất hiện (35)
      • 3.6 ExceptionHandling và Ghi đè phương thức trong Java (37)
      • 3.7. Custom Exception trong Java (41)
  • Bài 5. String (43)
    • 5.1 String trong Java (43)
    • 5.2 Immutable String trong Java (46)
    • 5.3. So sánh chuỗi trong Java (47)
    • 5.4 Nối chuỗi trong Java (49)
    • 5.5 Chuỗi con trong Java (51)
    • 5.6 Phương thức của lớp String trong Java (52)
    • 5.7 Lớp StringBuffer trong Java (54)
    • 5.8 StringBuilder trong Java (59)
    • 5.9 So sánh lớp String và StringBuffer trong Java (64)
    • 5.10 So sánh lớp StringBuffer và StringBuilder trong Java (67)
  • Bài 7. Bài tập và thảo luận về Case study ATM (1) (70)
    • 7.1. Các yêu cầu của ATM (70)
    • 7.2. Cách xây dựng lớp và đối tượng (71)
    • 1. Các thành phần trong bản vẽ Class (71)
    • 2. Relationship (Quan hệ) (72)
    • 3. Cách xây dựng bản vẽ Class (75)
      • 7.2. Phân tích theo mô hình hướng đối tượng (77)
    • 1. Đặc tả Class (77)
    • 2. Sử dụng bản vẽ Class (78)
    • 3. Kết luận (78)
  • Bài 8. Thao tác tệp (79)
    • 8.1 File và I/O trong Java (79)
    • 8.2 Lớp File trong Java (88)
    • 8.3 Lớp FileReader trong Java (94)
    • 8.4 Lớp FileWriter trong Java (95)
  • Bài 10. Kiểu Collections (98)
    • 10.1 Collection trong Java (98)
    • 10.2 Collection Interface trong Java (103)
    • 10.3 List Interface trong Java (106)
    • 10.4 Lớp LinkedList trong Java (109)
    • 10.5 Lớp Hashtable trong Java (117)
    • 10.6 Map Interface trong Java (120)
    • 10.7 Lớp HashMap trong Java (123)
  • Bài 12 Generic trong Java (127)
    • 12.1 Generic trong Java (127)
    • 12.2 Các phương thức generic trong Java (127)
    • 12.3 Các tham số kiểu giới hạn (bounded type) trong Java (129)
    • 12.4 Các lớp Generic trong Java (131)
  • Bài 14: Thread (133)
    • 14.1 Thread trong Java (133)
    • 14.2 Vòng đời của một Thread trong Java (133)
    • 14.3 Quyền ưu tiên của thread trong Java (134)
    • 14.4 Tạo thread bởi triển khai Runnable Interface trong Java (134)
    • 14.5 Tạo Thread bởi kế thừa lớp Thread trong Java (137)
    • 14.6 Các phương thức của lớp Thread trong Java (139)
  • Bài 17. Lập trình với JDBC (145)
    • 17.1 JDBC là gì? (145)
    • 17.2. Cài đặt JDBC (146)
    • 17.3 Giới thiệu JDBC Driver (146)
    • 17.4 Kiểu dữ liệu trong JDBC (148)
    • 17.5 Kết nối JDBC với cơ sở dữ liệu (154)
  • Bài 18. Bài tập và thảo luận về Case study ATM (3) (159)
    • 18.1. Cài đặt các chức năng và giao diện (159)
    • 18.2. Chạy và kiểm tra lỗi (159)
  • Bài 20. Bài tập và thảo luận tổng kết môn học (160)
    • 20.1. Những ưu điểm của lập trình hướng đối tượng (160)
    • 20.2. Phân tích bài toán theo mô hình hướng đối tượng (160)
    • 20.3. Trao đổi (169)

Nội dung

Bài giảng Lập trình nâng cao với Java nhằm cung cấp các kiến thức cơ bản cho các bạn sinh viên chuyên ngành về: Kế thừa và đa hình trong Java, xử lý ngoại lệ, bài tập và thảo luận về Case study ATM, thao tác tệp, kiểu Collections, generic trong Java,...

Kế thừa và đa hình trong Java

Đối tượng trong Java

Một thực thể có trạng thái và hành vi, chẳng hạn như bàn, ghế, xe con, hay mèo, có thể mang tính vật lý hoặc logic Một ví dụ về thực thể logic là hệ thống ngân hàng.

Một đối tượng có ba đặc trưng sau:

Trạng thái: biểu diễn dữ liệu (giá trị) của một đối tượng

Hành vi: biểu diễn hành vi (tính năng) của một đối tượng như gửi tiền vào, rút tiền ra, …

Nhận diện đối tượng được thực hiện thông qua một ID duy nhất, giá trị của ID này không thể nhìn thấy từ bên ngoài nhưng được JVM sử dụng để xác định mỗi đối tượng một cách độc nhất.

Bút là một đối tượng cụ thể, được gọi là Thiên Long và có màu trắng, thể hiện trạng thái của nó Chức năng chính của bút là viết, do đó hành vi của nó là viết Đối tượng này là một sự thể hiện (Instance) của một lớp, trong khi lớp là một mẫu thiết kế (Template) từ đó đối tượng được tạo ra Vì vậy, đối tượng chính là kết quả (Instance) của lớp.

Lớp trong Java

Một lớp trong Java là một nhóm các đối tượng có thuộc tính chung, hoạt động như một mẫu hoặc bản thiết kế để tạo ra các đối tượng.

Cú pháp để khai báo một lớp class ten_lop{ thanh_vien_du_lieu; phuong_thuc;

Ví dụ đơn giản về Lớp và Đối tượng trong Java

Trong bài viết này, chúng ta sẽ tạo một lớp Student với hai thành viên dữ liệu là id và name Để khởi tạo đối tượng của lớp Student, chúng ta sử dụng từ khóa new và gán giá trị cho các thuộc tính của đối tượng Lớp Student bao gồm một biến instance là id, giúp quản lý thông tin của sinh viên.

String name; //thanh vien du lieu (cung la bien instance) public static void main(String args[]){

Student1 s1=new Student1(); //tao mot doi tuong Student

Một lớp có thể chứa bất kỳ loại biến sau:

Biến Local là những biến được định nghĩa trong các phương thức, constructor hoặc block code Chúng được khai báo và khởi tạo bên trong phương thức và sẽ bị hủy khi phương thức hoàn tất.

Biến instance là các biến thuộc về một lớp nhưng không nằm trong bất kỳ phương thức nào Chúng được khởi tạo khi lớp được tải và có thể được truy cập từ bất kỳ phương thức, constructor hoặc khối nào trong lớp đó.

Biến Class: Các biến class là các biến được khai báo với một lớp, bên ngoài bất kỳ phương thức nào, với từ khóa static.

Phương thức trong Java

Trong Java, phương thức tương tự như hàm và được sử dụng để thể hiện hành vi của một đối tượng Việc sử dụng phương thức không chỉ tăng cường tính tái sử dụng của mã nguồn mà còn giúp tối ưu hóa hiệu suất của code.

Từ khóa new được sử dụng để cấp phát bộ nhớ tại runtime

Khi thảo luận về các lớp trong lập trình, một yếu tố quan trọng cần lưu ý là các constructor Mỗi lớp đều có ít nhất một constructor Nếu lập trình viên không định nghĩa rõ ràng một constructor cho lớp, bộ biên dịch Java sẽ tự động tạo ra một constructor mặc định cho lớp đó.

Khi một đối tượng mới được tạo ra, ít nhất một constructor sẽ được gọi, và các constructor này có tên trùng với tên lớp Một lớp có thể có nhiều hơn một constructor để đáp ứng các nhu cầu khởi tạo khác nhau.

Sau đây là ví dụ về một constructor: public class Xecon{ public Xecon(){

// Contructor nay co mot tham so la ten

Java cũng hỗ trợ Lớp Singleton trong Java, ở đây bạn sẽ có thể tạo chỉ một instance của một lớp.

Tạo một đối tượng trong Java

Trong Java, lớp là bản thiết kế cho các đối tượng, do đó, một đối tượng được tạo ra từ một lớp Để tạo một đối tượng mới, lập trình viên sử dụng từ khóa "new".

Có ba bước khi tạo một đối tượng từ một lớp:

Khai báo: Một khai báo biến với một tên biến với một loại đối tượng

Cài đặt: Từ khóa new được sử dụng để tạo đối tượng

Khởi tạo: Từ khóa new được theo sau bởi một lời gọi một constructor Gọi hàm này khởi tạo đối tượng mới

Dưới đây là ví dụ về tạo một đối tượng: public class Xecon{ public Xecon(String ten){

// Contructor nay co mot tham so la ten

System.out.println("Ten xe la :" + ten );

} public static void main(String []args){

// Lenh sau se tao mot doi tuong la Xecuatoi

Xecon Xecuatoi = new Xecon( "Toyota" );

Nếu chúng ta biên dịch và chạy chương trình, nó sẽ cho kết quả sau:

Truy cập các biến instance và các phương thức trong Java

Các biến instance và các phương thức được truy cập thông qua các đối tượng được tạo Để truy cập một biến instance, path sẽ là như sau:

/* Dau tien, ban tao mot doi tuong */

/* Sau do ban goi mot bien nhu sau */

/* Bay gio ban co the goi mot phuong thuc lop nhu sau */

Ví dụ này giải thích cách để truy cập các biến instance và các phương thức của một lớp: public class Xecon{ int Giaxe; public Xecon(String ten){

// Contructor nay co mot tham so la ten

System.out.println("Ten xe la :" + ten );

} public void setGia( int gia ){

System.out.println("Gia mua xe la :" + Giaxe ); return Giaxe;

} public static void main(String []args){

Xecon Xecuatoi = new Xecon( "Toyota" );

/* Goi mot phuong thuc lop de thiet lap gia xe */

/* Goi mot phuong thuc lop khac de lay gia xe */

/* Ban cung co the truy cap bien instance nhu sau */

System.out.println("Gia tri bien :" + Xecuatoi.Giaxe );

Biên dịch và thực thi chương trình sẽ cho kết quả sau:

Ví dụ đối tượng và lớp mà duy trì bản ghi các sinh viên

Trong ví dụ này, chúng ta tạo hai đối tượng từ lớp Student và khởi tạo giá trị cho chúng bằng phương thức insertRecord Sau đó, chúng ta hiển thị trạng thái của các đối tượng này bằng cách gọi phương thức displayInformation Lớp Student2 bao gồm thuộc tính rollno.

String name; void insertRecord(int r, String n){ //phuong thuc rollno=r; name=n;

} void displayInformation(){System.out.println(rollno+" "+name);} //phuong thuc public static void main(String args[]){

Student2 s2=new Student2(); s1.insertRecord(111,"HoangThanh"); s2.insertRecord(222,"ThanhHuong"); s1.displayInformation(); s2.displayInformation();

Ví dụ khác về lớp và đối tượng trong Java

Lớp Rectangle lưu trữ các thuộc tính chiều dài và chiều rộng Phương thức insert cho phép người dùng nhập giá trị cho chiều dài và chiều rộng của hình chữ nhật.

} void calculateArea(){System.out.println(length*width);} public static void main(String args[]){

Rectangle r2=new Rectangle(); r1.insert(11,5); r2.insert(3,15); r1.calculateArea(); r2.calculateArea();

Các cách khác nhau để tạo đối tượng trong Java?

Có nhiều cách để tạo một đối tượng trong Java Đó là:

Đối tượng vô danh (annonymous) trong Java

Vô danh, hay còn gọi là đối tượng không có tên, là một khái niệm quan trọng trong lập trình Khi một đối tượng không có tham chiếu, nó được xem là vô danh Việc sử dụng đối tượng vô danh là một giải pháp hiệu quả khi bạn chỉ cần sử dụng đối tượng đó một lần Ví dụ, trong lớp Calculation, phương thức fact(int n) tính giai thừa của số nguyên n bằng cách sử dụng vòng lặp để nhân các số từ 1 đến n, từ đó trả về kết quả giai thừa.

System.out.println("factorial is "+fact);

} public static void main(String args[]){ new Calculation().fact(5); //Goi phuong thuc voi doi tuong vo danh (annonymous)

Tạo nhiều đối tượng bởi chỉ một kiểu

Chúng ta có thể tạo nhiều đối tượng bởi chỉ một kiểu như khi chúng ta thực hiện trong các kiểu gốc Ví dụ:

Rectangle r1=new Rectangle(),r2=new Rectangle(); //Tao hai doi tuong

Ví dụ: class Rectangle{ int length; int width; void insert(int l,int w){ length=l; width=w;

} void calculateArea(){System.out.println(length*width);} public static void main(String args[]){

Rectangle r1=new Rectangle(),r2=new Rectangle(); //Tao hai doi tuong r1.insert(11,5); r2.insert(3,15); r1.calculateArea(); r2.calculateArea();

Xử lý ngoại lệ

Exception là gì?

Trong Java, Exception là một tình trạng bất thường, đại diện cho sự kiện làm gián đoạn luồng thực thi chuẩn của chương trình Nó được xem như một đối tượng được ném ra trong quá trình Runtime Ngoại lệ trong Java có thể xảy ra vì nhiều lý do khác nhau trong quá trình thực hiện chương trình.

Người dùng nhập dữ liệu không hợp lệ

Một file cần được mở nhưng không thể tìm thấy

Kết nối mạng có thể bị ngắt trong quá trình giao tiếp hoặc do JVM hết bộ nhớ Để nắm rõ hơn về các khái niệm trong chương này, bạn có thể tham khảo loạt bài viết về Ví dụ về Exception trong Java.

Trong Java, việc xử lý ngoại lệ có thể phát sinh từ nhiều nguyên nhân khác nhau, bao gồm lỗi của người dùng, lỗi của lập trình viên và lỗi từ nguồn dữ liệu vật lý Để hiểu rõ cách xử lý ngoại lệ, bạn cần nắm vững các loại ngoại lệ khác nhau.

Checked Exception là loại ngoại lệ thường xảy ra do hành động của người dùng mà lập trình viên không thể dự đoán trước, chẳng hạn như khi mở một file không tồn tại Những ngoại lệ này không thể bị bỏ qua trong quá trình biên dịch Checked Exception bao gồm các lớp kế thừa từ lớp Throwable, ngoại trừ RuntimeException và Error, ví dụ như IOException và SQLException Chúng được kiểm tra tại thời gian biên dịch (compile-time).

Unchecked exceptions are runtime exceptions that programmers can avoid, inheriting from the RuntimeException class Examples include ArithmeticException, NullPointerException, and ArrayIndexOutOfBoundsException Unlike checked exceptions, unchecked exceptions are not verified at compile-time; they are instead assessed during runtime.

Lỗi (Error) khác với các ngoại lệ (exception) vì chúng xảy ra ngoài tầm kiểm soát của lập trình viên hoặc người dùng Khi gặp lỗi, lập trình viên thường không thể can thiệp, ví dụ như trong trường hợp OutOfMemoryError, VirtualMachineError, hay AssertionError Những lỗi này thường bị bỏ qua trong quá trình biên dịch Java.

Exception Handling is a technique used to manage Runtime Errors such as ClassNotFound, IO, SQL, and Remote errors The primary advantage of Exception Handling is to maintain the standard flow of the application Exceptions can disrupt this flow, which is why Exception Handling is essential For example, in a sequence of statements, an exception may occur after several lines of code, impacting the execution of subsequent statements.

Trong một chương trình Java, nếu có 10 lệnh và một Exception xảy ra tại lệnh thứ 5, các lệnh từ 6 đến 10 sẽ không được thực thi Tuy nhiên, khi áp dụng Exception Handling, phần lệnh còn lại sẽ được thực hiện, điều này thể hiện tầm quan trọng của việc sử dụng Exception Handling trong Java.

Cấp bậc exception trong Java

All exception classes are subclasses of java.lang.Exception, which itself is a subclass of Throwable Another type of exception class, known as Error, is also a subclass of Throwable.

Lỗi trong Java thường không được xử lý bởi các chương trình, mà chủ yếu được tạo ra để phản ánh các vấn đề trong môi trường runtime, chẳng hạn như khi JVM hết bộ nhớ Thông thường, các chương trình không thể khôi phục sau khi gặp phải những lỗi này.

Lớp Exception có hai lớp con chính là : IOException và RuntimeException Đây là danh sách các checked và unchecked exception phổ biến: Exception có sẵn trong

Các phương thức của lớp Exceptions trong Java

Dưới đây là danh sách các phương thức phố biến của lớp Throwable trong Java

STT Phương thức và Miêu tả

Trả về một message cụ thể về exception đã xảy ra Message này được khởi tạo bởi phương thức contructor của Throwable

Trả về nguyên nhân xảy ra exception biểu diễn bởi đối tượng

Trả về tên của lớp và kết hợp với kết quả từ phương thức getMessage()

In ra kết quả của phương thức toString cùng với stack trace đến

Trả về một mảng chứa từng phần tử trong stack trace, trong đó phần tử đầu tiên (chỉ mục 0) đại diện cho phần trên cùng của Call Stack, còn phần tử cuối cùng trong mảng đại diện cho phương thức ở dưới cùng của Call Stack.

Fills the stack trace of this Throwable object with the current stack trace, adding to any previous information in the stack trace

Các tình huống phổ biến mà Exception có thể xảy ra

Dưới đây là một số tình huồng phổ biến mà Unchecked Exception có thể xảy ra:

Với ArithmaticException: xảy ra nếu bạn chia bất cứ số nào cho số 0 int aP/0;//ArithmeticException

NullPointerException xảy ra khi bạn cố gắng thực hiện các hoạt động với một biến có giá trị null Điều này có thể dẫn đến lỗi trong quá trình xử lý, vì biến null không thể thực hiện các thao tác như mong đợi.

System.out.println(s.length());//NullPointerException

NumberFormatException xảy ra khi có lỗi trong việc định dạng giá trị, ví dụ như khi cố gắng chuyển đổi một chuỗi chứa ký tự thành số Nếu biến chuỗi không chứa giá trị số hợp lệ, việc chuyển đổi sẽ dẫn đến ngoại lệ này.

String s="abc"; int i=Integer.parseInt(s);//NumberFormatException

Với ArrayIndexOutOfBoundsException: nếu bạn đang chèn bất cứ giá trị nào trong một chỉ mục sai sẽ làm xuất hiện kiểu exception này int a[]=new int[5]; a[10]P; //ArrayIndexOutOfBoundsException

Các từ khóa để Xử lý ngoại lệ trong Java

Có 5 từ khóa được sử dụng để Xử lý ngoại lệ trong Java, đó là: try catch finally throw throws

Khối try trong Java

Khối try trong Java được sử dụng để bao quanh đoạn mã có khả năng ném ra Exception, và nó cần phải nằm bên trong một phương thức Sau khối try, bạn phải sử dụng hoặc khối catch để xử lý Exception, hoặc khối finally để thực hiện các thao tác cuối cùng.

Cú pháp của khối try-catch trong Java try{

//code ma co the nem exception

}catch(Exception_class_Name ref){}

Cú pháp của khối try-finally trong Java try{

//code ma co the nem exception

Khối catch trong Java được sử dụng để xử lý các Exception và phải được đặt ngay sau khối try Bạn có thể kết hợp nhiều khối catch với một khối try duy nhất để xử lý các loại Exception khác nhau.

Vấn đề khi không có Exception Handling

Chúng ta cùng tìm hiểu vấn đề nếu không sử dụng khối try-catch public class Testtrycatch1{ public static void main(String args[]){ int dataP/0;//co the nem exception

System.out.println("Phan code con lai ");

Chương trình sẽ cho kết quả sau:

Exception in thread "main" java.lang.ArithmeticException: / by zero

Trong ví dụ trên, phần còn lại của mã không được thực thi, bao gồm lệnh inPhan và các dòng mã sau exception Nếu có khoảng 100 dòng mã sau exception, tất cả sẽ không được thực thi.

Xử lý vấn đề trên bởi Exception Handling trong Java

In this example, we utilize a try-catch block to address the issue of division by zero in Java The code snippet demonstrates how to implement error handling effectively to prevent program crashes and manage exceptions gracefully.

}catch(ArithmeticException e){System.out.println(e);}

System.out.println("Phan code con lai ");

Chương trình sẽ cho kết quả sau: java.lang.ArithmeticException: / by zero

Lúc này, phần còn lại của code đã được thực thi

Trong Java, khối try-catch hoạt động bằng cách mà JVM đầu tiên kiểm tra xem ngoại lệ đã được xử lý hay chưa Nếu ngoại lệ chưa được xử lý, JVM sẽ cung cấp một Exception Handler mặc định để thực hiện các tác vụ cần thiết.

In ra miêu tả của exception đó

In ra stack trace (cấu trúc thứ bậc của phương thức nơi mà exception xuất hiện)

Làm cho chương trình ngừng lại

Nếu lập trình viên đã xử lý exception, luồng chuẩn của ứng dụng sẽ được duy trì và phần còn lại của mã code sẽ tiếp tục được thực thi.

Nhiều khối catch trong Java

In Java, when handling multiple tasks that may throw different exceptions, you can utilize multiple catch blocks For instance, consider the following example where an array is declared, and an attempt is made to access an out-of-bounds index, followed by a division by zero operation, which can trigger various exceptions.

} catch(ArithmeticException e){System.out.println("Task1 duoc hoan thanh");} catch(ArrayIndexOutOfBoundsException e){System.out.println("Task2 duoc hoan thanh");} catch(Exception e){System.out.println("Task chung duoc hoan thanh");}

System.out.println("Phan code con lai ");

Chương trình sẽ cho kết quả sau:

Qui tắc 1: Tại một thời điểm, chỉ một exception được xuất hiện và tại một thời điểm chỉ có một khối catch được thực thi

Rule 2: All catch blocks must be arranged from the most specific to the most general For example, catching ArithmeticException should precede catching Exception In the TestMultipleCatchBlock1 class, the main method demonstrates this principle by attempting to access an out-of-bounds index in an array and performing a division by zero.

} catch(Exception e){System.out.println("Task chung duoc hoan thanh");} catch(ArithmeticException e){System.out.println("Task1 duoc hoan thanh");} catch(ArrayIndexOutOfBoundsException e){System.out.println("Task2 duoc hoan thanh");}

System.out.println("Phan code con lai ");

Chạy chương trình trên sẽ cho một lỗi compile time error

Lồng khối try trong Java

Việc một khối try bên trong một khối try khác thì được gọi là các khối try được lồng vào nhau, hay là lồng các khối try trong Java

Sử dụng các khối try lồng nhau trong Java rất quan trọng khi một phần của mã có thể gây ra lỗi khác nhau Trong những trường hợp như vậy, cần phải lồng các Exception Handler để xử lý các lỗi một cách hiệu quả.

Ví dụ về các khối try lồng nhau trong Java class Excep6{ public static void main(String args[]){ try{ try{

System.out.println("Thuc hien phep chia"); int b 9/0;

}catch(ArithmeticException e){System.out.println(e);} try{ int a[]=new int[5]; a[5]=4;

}catch(ArrayIndexOutOfBoundsException e){System.out.println(e);}

System.out.println("Lenh khac");

}catch(Exception e){System.out.println("Da xu ly");}

System.out.println("Luong chuan ");

Chương trình sẽ cho kết quả sau:

Thuc hien phep chia java.lang.ArithmeticException: / by zero java.lang.ArrayIndexOutOfBoundsException: 5

Khối finally là một phần quan trọng trong lập trình, được sử dụng để thực thi các đoạn mã cần thiết như đóng kết nối hoặc đóng stream Đặc biệt, khối finally sẽ luôn được thực hiện, bất kể việc xử lý exception có thành công hay không Để sử dụng khối finally, nó phải được đặt sau khối try hoặc khối catch.

Ghi chú:nếu bạn không xử lý ngoại lệ trước khi kết thúc chương trình, JVM sẽ thực thi khối finally (nếu bạn không có).

Sự sử dụng khối finally trong Java

Bạn theo dõi các tình huống khác nhau mà khối try trong Java có thể được sử dụng

Tình huống 1: ở đây exeption không xuất hiện class TestFinallyBlock{ public static void main(String args[]){ try{ int data%/5;

} catch(NullPointerException e){System.out.println(e);} finally{System.out.println("Khoi finally luon luon duoc thuc thi");}

System.out.println("Phan code con lai ");

Chương trình trên sẽ cho kết quả:

Khoi finally luon luon duoc thuc thi

Tình huống 2: exception xuất hiện và không được xử lý class TestFinallyBlock1{ public static void main(String args[]){ try{ int data%/0;

} catch(NullPointerException e){System.out.println(e);} finally{System.out.println("Khoi finally luon luon duoc thuc thi");}

System.out.println("Phan code con lai ");

Chương trình trên sẽ cho kết quả:

Khoi finally luon luon duoc thuc thi

Exception in thread "main" java.lang.ArithmeticException: / by zero

Tình huống 3: exception xảy ra và được xử lý public class TestFinallyBlock2{ public static void main(String args[]){ try{ int data%/0;

} catch(ArithmeticException e){System.out.println(e);} finally{System.out.println("Khoi finally luon luon duoc thuc thi");}

System.out.println("Phan code con lai ");

Chương trình trên sẽ cho kết quả: java.lang.ArithmeticException: / by zero

Khoi finally luon luon duoc thuc thi

Qui tắc: Với một khối try thì có thể có 0 hoặc nhiều khối catch, nhưng chỉ có một khối finally

Ghi chú: Khối finally sẽ không được thực thi nếu chương trình thoát ra (hoặc bởi gọi

System.exit() hoặc bởi gây ra một lỗi nghiêm trọng Fatal Error mà làm ngừng tiến trình).

Phân biệt final, finally, và finalize trong Java

Bảng dưới đây liệt kê và miêu tả các điểm khác nhau giữa final, finally và finalize trong Java: final finally finalize

Lớp, phương thức và biến được đánh dấu là final có những đặc điểm quan trọng: lớp final không thể kế thừa, phương thức final không thể bị ghi đè, và giá trị của biến final không thể thay đổi.

Finally được sử dụng để đặt các code quan trọng, nó sẽ được thực thi dù exception có được xử lý hay không

Finalize được sử dụng để thực hiện tiến trình dọn sạch

Final là một từ khóa Finally là một khối Finalize là một phương thức

Ví dụ final trong Java class ViduFinal{ public static void main(String[] args){ final int x0; x 0;//Compile Time Error

Ví dụ finally trong Java class ViduFinally{ public static void main(String[] args){ try{ int x00;

}catch(Exception e){System.out.println(e);} finally{System.out.println("Khoi finally duoc thuc thi");}

Ví dụ finalize trong Java class ViduFinalize{ public void finalize(){System.out.println("finalize duoc goi");} public static void main(String[] args){

ViduFinalize f2=new ViduFinalize(); f1=null; f2=null;

Từ khóa throw trong Java

Từ khóa "throw" trong Java được sử dụng để ném một exception một cách rõ ràng, cho phép lập trình viên ném cả Checked Exception và Unchecked Exception Chủ yếu, từ khóa này được dùng để ném các Custom Exception, tức là các exception do lập trình viên tự định nghĩa Nội dung về Custom Exception sẽ được khám phá trong chương riêng.

Cú pháp của từ khóa throw trong Java như sau: throw exception;

Cùng theo dõi ví dụ đơn giản để ném IOException: throw new IOException("Xin loi: device error);

Ví dụ từ khóa throw trong Java

Trong ví dụ này, chúng ta đã xây dựng phương thức validate nhận tham số là một giá trị nguyên tuổi Nếu tuổi nhỏ hơn 18, phương thức sẽ ném ra một ngoại lệ ArithmeticException với thông báo "Không hợp lệ" Ngược lại, nếu tuổi từ 18 trở lên, hệ thống sẽ in ra thông báo chào mừng: "Chào mừng bạn đến bầu phiếu".

System.out.println("Chao mung ban den bo phieu");

} public static void main(String args[]){ validate(13);

System.out.println("Phan code con lai ");

Chương trình Java trên sẽ cho kết quả:

Exception in thread "main" java.lang.ArithmeticException: Khong hop le

Quá trình lan truyền exception trong Java bắt đầu khi một exception được ném từ đầu Stack Nếu exception không được bắt, nó sẽ di chuyển xuống dưới Call Stack tới phương thức trước đó Nếu không được xử lý tại đó, exception tiếp tục di chuyển xuống các phương thức trước đó cho đến khi nó được bắt hoặc chạm đáy của Call Stack.

Qui tắc: Theo mặc định, Unchecked Exception được lan truyền trong Calling Chain

Ví dụ về quá trình lan truyền của exception: class TestExceptionPropagation1{ void m(){ int dataP/0;

}catch(Exception e){System.out.println("Exception duoc xu ly");}

} public static void main(String args[]){

TestExceptionPropagation1 obj=new TestExceptionPropagation1(); obj.p();

System.out.println("Luong chuan ");

Từ khóa throws trong Java

Từ khóa "throw" trong Java được sử dụng để khai báo một ngoại lệ (Exception) Nó thông báo cho lập trình viên rằng có khả năng xảy ra một ngoại lệ, từ đó yêu cầu họ cung cấp mã để xử lý ngoại lệ, nhằm duy trì luồng thực thi chuẩn của chương trình.

Xử lý ngoại lệ (Exception Handling) chủ yếu được áp dụng để quản lý các Checked Exception Đồng thời, cần lưu ý rằng có thể xảy ra các Unchecked Exception trong quá trình thực thi.

NullPointerException, thì đó là lỗi của lập trình viên vì họ đã không thực hiện kiểm tra code trước khi sử dụng

Cú pháp của từ khóa throws trong Java kieu_tra_ve ten_phuong_thuc() throws ten_lop_exception{

//phan code cua phuong thuc

Câu hỏi: Kiểu Exception nên được khai báo?

Chỉ dành cho Checked Exception, bởi vì:

Unchecked Exception: dưới sự điều khiển của bạn bằng việc kiểm tra và sửa lỗi code

Error: Vượt quá tầm kiểm soát của bạn, ví dụ: bạn không thể làm điều gì nếu xuất hiện

Lợi thế của từ khóa throws trong Java

Bằng cách sử dụng từ khóa "throws", các Checked Exception có thể được lan truyền trong Call Stack, cung cấp thông tin cho người gọi phương thức về loại Exception đã xảy ra.

Ví dụ về throws trong Java

The Java program demonstrates the use of the "throws" keyword to illustrate how Checked Exceptions can propagate through the Call Stack In the example, an IOException is thrown with the message "device error," showcasing the handling of checked exceptions within the code.

}catch(Exception e){System.out.println("Exception duoc xu ly");}

} public static void main(String args[]){

Testthrows1 obj=new Testthrows1(); obj.p();

System.out.println("Luong chuan ");

Chương trình Java trên sẽ cho kết quả:

Qui tắc: Nếu bạn đang gọi một phương thức mà khai báo một exception, bạn phải hoặc bắt hoặc khai báo exception đó

Trường hợp 1: Bạn bắt exception (sử dụng try-catch để xử lý exception đó)

Trường hợp 2: Bạn khai báo exception (xác định từ khóa throws với phương thức đó)

Trường hợp 1: Bạn xử lý exception

Trong trường hợp này, mã sẽ được thực thi một cách hiệu quả bất kể có xuất hiện ngoại lệ hay không Ví dụ, trong đoạn mã Java sau, phương thức "method" ném ra một IOException với thông báo "lỗi thiết bị".

} public class Testthrows2{ public static void main(String args[]){ try{

}catch(Exception e){System.out.println("Exception duoc xu ly");}

System.out.println("Luong chuan ");

Chương trình Java trên sẽ cho kết quả:

Trường hợp 2: Bạn khai báo exception

Nếu exception không xuất hiện, code sẽ được thực thi tốt

Nếu exception xuất hiện, một exception sẽ được ném tại runtime bởi vì throws không xử lý exception đó.

Chương trình ví dụ nếu exception không xuất hiện

import java.io.*; class M{ void method()throws IOException{

System.out.println("Thiet bi hoat dong tot");

} class Testthrows3{ public static void main(String args[])throws IOException{//Khai bao exception

System.out.println("Luong chuan ");

Chương trình Java trên sẽ cho kết quả:

Thiet bi hoat dong tot

Chương trình ví dụ nếu exception xuất hiện

import java.io.*; class M{ void method()throws IOException{ throw new IOException("device error");

} class Testthrows4{ public static void main(String args[])throws IOException{//Khai bao exception

System.out.println("Luong chuan ");

Chương trình Java trên sẽ cho Runtime Error

Câu hỏi: Chúng ta có thể tái ném một exception không?

Có, bằng cách ném cùng exception đó trong khối catch

Phân biệt throw và throws trong Java

Có nhiều điểm khác nhau giữa hai từ khóa throw và throws Bảng dưới liệt kê các điểm khác nhau này throw throws

Từ khóa throw được sử dụng để ném tường minh một exception

Từ khóa throws được sử dụng để khai báo một exception

Checked Exception không thể được lan truyền chỉ bởi sử dụng throw

Checked Exception không thể được lan truyền với throws

Throw được theo sau bởi một instance Throws được theo sau bởi một lớp

Throw được sử dụng bên trong một phương thức

Throws được sử dụng với khai báo phương thức

Bạn có thể ném nhiều exception Bạn có thể khai báo nhiều exception, ví dụ public void phuong_thuc()throws IOException,SQLException

Ví dụ về throw trong Java void m(){ throw new ArithmeticException("sorry");

Ví dụ về throws trong Java void m()throws ArithmeticException{

//Phan code cua phuong thuc

Ví dụ về throw và throws trong Java void m()throws ArithmeticException{ throw new ArithmeticException("sorry");

3.6 ExceptionHandling và Ghi đè phương thức trong Java

Có một số qui tắc bạn nên biết khi nói đến ghi đè phương thức với xử lý ngoại lệ Đó là:

Nếu phương thức trong lớp cha không khai báo bất kỳ exception nào, thì phương thức ghi đè trong lớp con không được phép khai báo Checked Exception, nhưng có thể khai báo Unchecked Exception.

Qui tắc 1: Nếu phương thức của lớp cha không khai báo một ngoại lệ, thì phương thức ghi đè của lớp con không được phép khai báo Checked Exception Ví dụ, trong Java, lớp Parent có phương thức msg() không khai báo ngoại lệ, do đó lớp con không thể khai báo Checked Exception trong phương thức ghi đè của nó.

} class TestExceptionChild extends Parent{ void msg()throws IOException{

} public static void main(String args[]){

Chạy chương trình sẽ cho Compile Time Error

Rule 2: If a parent class method does not declare an exception, the overriding method in the child class cannot declare a Checked Exception but may declare an Unchecked Exception For example, in Java, a parent class method called `msg()` simply prints "parent."

} class TestExceptionChild1 extends Parent{ void msg()throws ArithmeticException{

} public static void main(String args[]){

Chạy chương trình sẽ cho kết quả: child

Nếu phương thức của lớp cha khai báo một exception, thì phương thức ghi đè của lớp con có thể khai báo cùng exception đó, hoặc khai báo một exception khác, hoặc không khai báo exception nào Tuy nhiên, phương thức ghi đè không được phép khai báo exception của lớp cha.

1.Ví dụ trường hợp phương thức ghi đè của lớp con khai báo exception cha import java.io.*; class Parent{ void msg()throws ArithmeticException{System.out.println("parent");}

} class TestExceptionChild2 extends Parent{ void msg()throws Exception{System.out.println("child");} public static void main(String args[]){

Parent p=new TestExceptionChild2(); try{ p.msg();

Chạy chương trình sẽ cho Compile Time Error

2.Ví dụ trường hợp phương thức ghi đè của lớp con khai báo cùng exception đó import java.io.*; class Parent{ void msg()throws Exception{System.out.println("parent");}

} class TestExceptionChild3 extends Parent{ void msg()throws Exception{System.out.println("child");} public static void main(String args[]){

Parent p=new TestExceptionChild3(); try{ p.msg();

Chạy chương trình sẽ cho kết quả: child

In the context of method overriding in Java, consider a scenario where a subclass declares an exception that is also defined in its parent class For instance, the `Parent` class includes a method `msg()` that throws a general `Exception`, demonstrating the concept of exception handling and inheritance in object-oriented programming.

} class TestExceptionChild4 extends Parent{ void msg()throws ArithmeticException{System.out.println("child");} public static void main(String args[]){

Parent p=new TestExceptionChild4(); try{ p.msg();

Chạy chương trình sẽ cho kết quả: child

3.Ví dụ trường hợp phương thức ghi đè của lớp con không khai báo exception nào import java.io.*; class Parent{ void msg()throws Exception{System.out.println("parent");}

} class TestExceptionChild5 extends Parent{ void msg(){System.out.println("child");} public static void main(String args[]){

Parent p=new TestExceptionChild5(); try{ p.msg();

Chạy chương trình sẽ cho kết quả: child

Custom Exception là loại ngoại lệ do người dùng tự định nghĩa trong Java, cho phép tùy biến theo nhu cầu cụ thể Việc sử dụng Custom Exception giúp bạn tạo ra kiểu và thông điệp ngoại lệ riêng, mang lại sự linh hoạt và phù hợp hơn với yêu cầu của ứng dụng.

Bạn theo dõi chương trình Java minh họa về Custom Exception sau: class InvalidAgeException extends Exception{

- class TestCustomException1{ static void validate(int age)throws InvalidAgeException{ if(age s3)

System.out.println(s3.compareTo(s1));//-1(boi vi s3 < s1 )

Nối chuỗi trong Java

Trong Java, nối chuỗi tạo nên một chuỗi mới mà là chuỗi tổ hợp của nhiều chuỗi Có hai cách để nối chuỗi trong Java, đó là:

Bởi toán tử nối chuỗi +

Nối chuỗi bởi toán tử + trong Java

Toán tử + trong Java được sử dụng để nối hai chuỗi Ví dụ: class Noichuoi1{ public static void main(String args[]){

System.out.println(s);//in ra ket qua Vietjack Team

Trình biên dịch Compiler chuyển đổi code trên thành dạng:

String s=(new StringBuilder()).append("Vietjack").append(" Team).toString();

Trong Java, việc nối chuỗi được thực hiện thông qua lớp StringBuilder (hoặc StringBuffer) và phương thức append của nó Toán tử nối chuỗi tạo ra một chuỗi mới bằng cách thêm toán hạng thứ hai vào cuối toán hạng đầu tiên Ngoài việc nối các chuỗi, toán tử này còn cho phép nối các giá trị từ các kiểu dữ liệu gốc Ví dụ: class Noichuoi2{ public static void main(String args[]){

System.out.println(s);//in ra ket qua 80Vietjack4040

Ghi chú: Sau một String Literal, tất cả toán tử + sẽ được đối xử như là toán tử nối chuỗi

Nối chuỗi bởi phương thức concat() trong Java

Phương thức concat() trong Java nối chuỗi đã cho vào phần cuối của chuỗi hiện tại Cú pháp: public String concat(String khac)

Bạn theo dõi ví dụ sau về phương thức concat(): class Noichuoi3{ public static void main(String args[]){

System.out.println(s3);//in ra ket qua Vietjack Team

Chuỗi con trong Java

Chuỗi con (substring) là một phần của chuỗi lớn hơn, được định nghĩa là tập con của chuỗi đó Trong việc xác định chuỗi con, startIndex được tính là bao gồm (inclusive), trong khi endIndex được tính là không bao gồm (exclusive).

Ghi chú: Chỉ mục bắt đầu tính từ 0

Bạn có thể lấy chuỗi con từ đối tượng String thông qua hai phương thức: Phương thức đầu tiên, `public String substring(int startIndex)`, trả về chuỗi con bắt đầu từ chỉ mục startIndex (bao gồm chỉ mục này) Phương thức thứ hai, `public String substring(int startIndex, int endIndex)`, trả về chuỗi con từ chỉ mục startIndex (bao gồm) đến chỉ mục endIndex (không bao gồm).

Bạn theo dõi ví dụ sau để hiểu startIndex và endIndex:

System.out.println(s.substring(0,2));//he

Trong chuỗi con trên, 0 trỏ tới h nhưng 2 trỏ tới e (bởi vì chỉ mục kết thúc là exclusive)

Do đó, chương trình trên sẽ in ra từ "he"

Ví dụ về chuỗi con trong Java

Dưới đây là ví dụ đơn giản về chuỗi con trong Java: public class Chuoicon{ public static void main(String args[]){

System.out.println(s.substring(5));//Vietjack

System.out.println(s.substring(0,5));//Trang

Phương thức của lớp String trong Java

Lớp java.lang.String cung cấp nhiều phương thức hữu ích cho việc thao tác và xử lý chuỗi Nhờ vào các phương thức này, người dùng có thể thực hiện các hoạt động như cắt, nối, chuyển đổi, so sánh và thay thế chuỗi một cách dễ dàng.

Java String là một khái niệm quan trọng, vì mọi thứ trong các ứng dụng trên nền tảng window, web và di động đều được xử lý như một String Dưới đây, chúng tôi sẽ giới thiệu một số phương thức quan trọng của lớp String trong Java.

Phương thức toUpperCase() và toLowerCase() của lớp String trong Java

Phương thức toUpperCase() để chuyển đổi chuỗi thành chữ hoa và phương thức toLowerCase() để chuyển đổi chuỗi thành chữ thường Ví dụ:

System.out.println(s.toUpperCase());//Chuyen doi thanh VIETJACK

System.out.println(s.toLowerCase());//Chuyen doi thanh vietjack

System.out.println(s);//Vietjack(khong co thay doi nao)

Chương trình trên sẽ cho kết quả:

Phương thức trim() của lớp String trong Java

Phương thức trim() trong Java loại bỏ các khoảng trống trắng ở trước và sau chuỗi (leading và trailing) Ví dụ:

System.out.println(s);//in ra chuoi nhu ban dau Vietjack (van con khoang trang whitespace)

System.out.println(s.trim());//in ra chuoi sau khi da cat cac khoang trong trang Vietjack

Phương thức startWith() và endsWith() của lớp String trong Java

System.out.println(s.startsWith("Vi"));//true

System.out.println(s.endsWith("k"));//true

Phương thức charAt() của lớp String trong Java

Phương thức charAt() trả về ký tự tại chỉ mục đã cho Ví dụ:

System.out.println(s.charAt(0));//tra ve V

System.out.println(s.charAt(3));//tra ve t

Phương thức length() của lớp String trong Java

Phương thức length() trả về độ dài của chuỗi Ví dụ:

System.out.println(s.length());//tra ve do dai la 7

Phương thức intern của lớp String trong Java

Ban đầu, Pool của các chuỗi được duy trì riêng cho lớp String và thường là trống Khi phương thức intern được gọi, nếu Pool đã chứa một chuỗi tương đương với đối tượng String (theo phương thức equals(object)), chuỗi từ Pool sẽ được trả về Ngược lại, nếu không có, đối tượng String mới sẽ được thêm vào Pool và một tham chiếu tới đối tượng này sẽ được trả về.

System.out.println(s2);//tra ve Vietjack

Phương thức valueOf() của lớp String trong Java

Phương thức valueOf() chuyển đổi các kiểu dữ liệu như int, long, float, double, Boolean, char và mảng char thành chuỗi Ví dụ, khi sử dụng valueOf() với một biến int, nó sẽ trả về biểu diễn chuỗi của giá trị đó.

System.out.println(s+10); //In ra ket qua la 1010

Phương thức replace() của lớp String trong Java

Phương thức replace() thay thế tất cả sự xuất hiện của dãy ký tự đầu bởi dãy ký tự thứ hai Ví dụ:

String s1="Java la mot ngon ngu lap trinh Java la mot nen tang Java la mot hon dao.";

String replaceString=s1.replace("Java","HaLong");//thay the tat ca su xuat hien cua

Chương trình trên sẽ cho kết quả dạng:

HaLong la mot ngon ngu lap trinh HaLong la mot nen tang HaLong la mot hon dao.

Lớp StringBuffer trong Java

Lớp StringBuffer trong Java cho phép tạo ra chuỗi có thể sửa đổi, khác với lớp String, vốn là bất biến StringBuffer mang lại tính linh hoạt trong việc thao tác với chuỗi, giúp cải thiện hiệu suất khi thực hiện các thay đổi liên tục.

Lớp StringBuffer được thiết kế để an toàn trong môi trường đa luồng (Thread-safe), cho phép nhiều Thread không thể truy cập đồng thời Điều này đảm bảo rằng kết quả trả về luôn chính xác và theo thứ tự nhất quán.

Các Constructor quan trọng của lớp StringBuffer trong Java

StringBuffer(): tạo một bộ đệm chuỗi trống với dung lượng capacity ban đầu là 16

StringBuffer(String str): tạo một bộ đệm chuỗi với chuỗi đã xác định

StringBuffer(int capacity): tạo một bộ đệm chuỗi trống với dung lượng capacity đã cho

Các phương thức quan trọng của lớp StringBuffer trong Java

1 public synchronized StringBuffer append(String s): được sử dụng để phụ thêm (append) chuỗi đã cho với chuỗi này Phương thức append() được nạp chồng giống dạng append(char), append(boolean), append(int), append(float), append(double)

2 public synchronized StringBuffer insert(int offset, String s): được sử dụng để chèn chuỗi đã cho với chuỗi này tại vị trí đã cho Phương thức insert() được nạp chồng giống dạng insert(int, char), insert(int, boolean), insert(int, int), insert(int, float), insert(int, double)

3 public synchronized StringBuffer replace(int startIndex, int endIndex, String str): được sử dụng để thay thế chuỗi từ chỉ mục ban đầu startIndex và chỉ mục kết thúc endIndex đã cho

4 public synchronized StringBuffer delete(int startIndex, int endIndex): được sử dụng để xóa chuỗi từ chỉ mục startIndex và endIndex đã cho

5 public synchronized StringBuffer reverse(): được sử dụng để đảo ngược chuỗi

6 public int capacity(): được sử dụng để trả về dung lượng capacity hiện tại

7 public void ensureCapacity(int minimumCapacity): được sử dụng để bảo đảm rằng capacity ít nhất bằng với minimum đã cho

8 public char charAt(int index): được sử dụng để trả về ký tự tại vị trí đã cho

9 public int length(): được sử dụng để trả về độ dài của chuỗi (chẳng hạn như tổng số ký tự)

10 public String substring(int beginIndex): được sử dụng để trả về chuỗi con từ chỉ mục bắt đầu beginIndex đã cho

11 public String substring(int beginIndex, int endIndex): được sử dụng để trả về chuỗi con từ beginIndex đến endIndex đã cho

Chuỗi dạng mutable là gì?

Một chuỗi mà có thể sửa đổi được xem như là chuỗi dạng mutable Các lớp StringBuffer và StringBuilder được sử dụng để tạo các chuỗi dạng mutable

Phương thức append() của lớp StringBuffer trong Java

Phương thức append() được sử dụng để nối chuỗi tham số đã cho với chuỗi này Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuffer sb=new StringBuffer("Hello "); sb.append("Java");//bay gio chuoi ban dau bi thay doi

System.out.println(sb);//in ra ket qua la Hello Java

Phương thức insert() của lớp StringBuffer trong Java

Phương thức insert() chèn chuỗi đã cho vào chuỗi này tại vị trí đã cho Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuffer sb=new StringBuffer("Hello "); sb.insert(1,"Java");//bay gio chuoi ban dau bi thay doi

System.out.println(sb);//in ra ket qua la HJavaello

Phương thức replace() của lớp StringBuffer trong Java

Phương thức replace() thay thế chuỗi đã cho bắt đầu từ chỉ mục beginIndex tới endIndex

Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuffer sb=new StringBuffer("Hello"); sb.replace(1,3,"Java");

System.out.println(sb);//in ra ket qua la HJavalo

Phương thức delete() của lớp StringBuffer trong Java

Phương thức delete() xóa chuỗi bắt đầu từ chỉ mục beginIndex tới endIndex đã cho Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuffer sb=new StringBuffer("Hello"); sb.delete(1,3);

System.out.println(sb);//in ra ket qua la Hlo

Phương thức reverse() của lớp StringBuffer trong Java

Phương thức reverse() đảo ngược chuỗi hiện tại Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuffer sb=new StringBuffer("Hello"); sb.reverse();

System.out.println(sb);//in ra ket qua la olleH

Phương thức capacity() của lớp StringBuffer trong Java

Phương thức capacity() trả về dung lượng hiện tại của bộ đệm, với dung lượng mặc định là 16 Khi số ký tự vượt quá dung lượng hiện tại, bộ đệm sẽ tăng dung lượng theo công thức (oldcapacity*2)+2 Chẳng hạn, nếu dung lượng ban đầu là 16, nó sẽ trở thành (16*2)+2.

System.out.println(sb.capacity());//mac dinh la 16 sb.append("Hello");

System.out.println(sb.capacity());//bay gio la 16 sb.append("Java la mot ngon ngu lap trinh manh me");

System.out.println(sb.capacity());//bay gio la (16*2)+24 vi du cua cong thuc (oldcapacity*2)+2

Phương thức ensureCapacity() của lớp StringBuffer trong Java

The ensureCapacity() method ensures that the capacity is at least equal to the specified minimum If the new capacity exceeds the current capacity, it increases the capacity using the formula (oldCapacity * 2) + 2 For instance, if the current capacity is 16, the new capacity will be (16 * 2) + 2.

System.out.println(sb.capacity());//mac dinh la 16 sb.append("Hello");

System.out.println(sb.capacity());//bay gio la 16 sb.append("Java la mot ngon ngu lap trinh manh me");

System.out.println(sb.capacity());//bay gio la (16*2)+24 vi du cua cong thuc (oldcapacity*2)+2 sb.ensureCapacity(10);//bay gio khong phai thay doi

System.out.println(sb.capacity());//bay gio la 34 sb.ensureCapacity(50);//bay gio la (34*2)+2

System.out.println(sb.capacity());//bay gio la 70

StringBuilder trong Java

Lớp StringBuilder trong Java cho phép tạo ra chuỗi có thể thay đổi, khác với lớp StringBuffer, StringBuilder không đồng bộ Lớp này đã được giới thiệu từ JDK 1.5, mang lại sự linh hoạt trong việc thao tác với chuỗi.

Các Constructor quan trọng của lớp StringBuilder trong Java

StringBuilder(): tạo một Builder trống với dung lượng capacity ban đầu là 16

StringBuilder(String str): tạo một Builder với chuỗi đã xác định

StringBuilder(int capacity): tạo một Builder trống với dung lượng capacity đã cho

Các phương thức quan trọng của lớp StringBuffer trong Java

Bảng dưới đây liệt kê và miêu tả chi tiết một số phương thức quan trọng của lớp StringBuffer trong Java:

The StringBuilder class in Java provides several methods for manipulating strings The `append(String s)` method adds the specified string to the current StringBuilder instance and is overloaded to support various data types such as char, boolean, int, float, and double The `insert(int offset, String s)` method allows for inserting a string at a specified position, also supporting multiple data types To replace a substring, the `replace(int startIndex, int endIndex, String str)` method is used, while the `delete(int startIndex, int endIndex)` method removes a specified range of characters The `reverse()` method reverses the characters in the StringBuilder, and `capacity()` returns the current capacity To ensure a minimum capacity, the `ensureCapacity(int minimumCapacity)` method is utilized Additionally, the `charAt(int index)` method retrieves the character at a specified index, and `length()` returns the total length of the string.

Phương thức `public String substring(int beginIndex)` được sử dụng để trả về chuỗi con bắt đầu từ chỉ mục `beginIndex` đã cho Trong khi đó, phương thức `public String substring(int beginIndex, int endIndex)` cho phép trả về chuỗi con từ chỉ mục `beginIndex` đến `endIndex` đã chỉ định.

Phương thức append() của lớp StringBuffer trong Java

Phương thức append() được sử dụng để nối chuỗi tham số đã cho với chuỗi này Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuilder sb=new StringBuilder("Hello "); sb.append("Java");//bay gio chuoi ban dau bi thay doi

System.out.println(sb);//in ra ket qua la Hello Java

Phương thức insert() của lớp StringBuffer trong Java

Phương thức insert() chèn chuỗi đã cho vào chuỗi này tại vị trí đã cho Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuilder sb=new StringBuilder("Hello "); sb.insert(1,"Java");//bay gio chuoi ban dau bi thay doi

System.out.println(sb);//in ra ket qua la HJavaello

Phương thức replace() của lớp StringBuffer trong Java

Phương thức replace() thay thế chuỗi đã cho bắt đầu từ chỉ mục beginIndex tới endIndex

Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuilder sb=new StringBuilder("Hello"); sb.replace(1,3,"Java");

System.out.println(sb);//in ra ket qua la HJavalo

Phương thức delete() của lớp StringBuffer trong Java

Phương thức delete() xóa chuỗi bắt đầu từ chỉ mục beginIndex tới endIndex đã cho Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuilder sb=new StringBuilder("Hello"); sb.delete(1,3);

System.out.println(sb);//in ra ket qua la Hlo

Phương thức reverse() của lớp StringBuffer trong Java

Phương thức reverse() đảo ngược chuỗi hiện tại Ví dụ: class VIETJACK{ public static void main(String args[]){

StringBuilder sb=new StringBuilder("Hello"); sb.reverse();

System.out.println(sb);//in ra ket qua la olleH

Phương thức capacity() của lớp StringBuffer trong Java

Phương thức capacity() trả về dung lượng hiện tại của bộ đệm, với dung lượng mặc định là 16 Khi số ký tự vượt quá dung lượng hiện tại, bộ đệm sẽ tăng dung lượng theo công thức (oldcapacity*2)+2 Ví dụ, nếu dung lượng hiện tại là 16, dung lượng mới sẽ là (16*2)+2, tương đương 34.

System.out.println(sb.capacity());//mac dinh la 16 sb.append("Hello");

System.out.println(sb.capacity());//bay gio la 16 sb.append("Java la mot ngon ngu lap trinh manh me");

System.out.println(sb.capacity());//bay gio la (16*2)+24 vi du cua cong thuc (oldcapacity*2)+2

Phương thức ensureCapacity() của lớp StringBuffer trong Java

The ensureCapacity() method ensures that the capacity is at least equal to the specified minimum If the new capacity exceeds the current capacity, it increases the capacity using the formula (oldCapacity * 2) + 2 For instance, if the current capacity is 16, the new capacity will be (16 * 2) + 2.

System.out.println(sb.capacity());//mac dinh la 16 sb.append("Hello");

System.out.println(sb.capacity());//bay gio la 16 sb.append("Java la mot ngon ngu lap trinh manh me");

System.out.println(sb.capacity());//bay gio la (16*2)+24 vi du cua cong thuc (oldcapacity*2)+2 sb.ensureCapacity(10);//bay gio khong phai thay doi

System.out.println(sb.capacity());//bay gio la 34 sb.ensureCapacity(50);//now (34*2)+2

System.out.println(sb.capacity());//bay gio la 70

So sánh lớp String và StringBuffer trong Java

Có nhiều điểm khác nhau giữa lớp String và StringBuffer trong Java Bảng dưới liệt kê các điểm khác nhau này:

Lớp String là không thể thay đổi (immutable) Lớp

StringBuffer là có thể thay đổi (mutable)

Lớp String là chậm và tiêu thụ nhiều bộ nhớ hơn khi bạn nối nhiều chuỗi bởi vì mỗi khi nối chuỗi, nó tạo instance mới

StringBuffer là nhanh và tiêu thụ ít bộ nhớ hơn khi bạn nối các chuỗi

Lớp String ghi đè phương thức equals() của lớp Object Vì thế bạn có thể so sánh các nội dung của hai chuỗi bởi phương thức equals()

Lớp StringBuffer không ghi đè phương thức equals() của lớp Object

Kiểm tra hiệu suất của lớp String và StringBuffer trong Java public class Test1{ public static String concatWithString() {

String t = "Java"; for (int i=0; i

Ngày đăng: 08/05/2021, 12:19