Bối cảnh và vấn đề nghiên cứu

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Java là một trong những ngôn ngữ lập trình phổ biến, có tính ứng dụng cao và đóng vai trò quan trọng trong việc xây dựng các hệ thống hiện đại. Báo cáo bài tập lớn Tuần 1 của đồ án môn học Công nghệ Java do Nhóm 11 (sinh viên Khoa Công nghệ Thông tin, Trường Đại học Kiến trúc Hà Nội) thực hiện dưới sự hướng dẫn của TS. Trần Trung vào năm 2023, xuất phát từ yêu cầu củng cố kiến thức nền tảng về lập trình hướng đối tượng, làm chủ môi trường phát triển trên hệ điều hành mở và nghiên cứu các cấu trúc dữ liệu cốt lõi trong Java.

Mục tiêu tổng quát của đồ án là thiết lập môi trường lập trình chuẩn hóa, tiếp cận và chuyển ngữ tài liệu chuyên ngành chuẩn quốc tế, đồng thời áp dụng lý thuyết vào thực hành giải quyết các bài toán cụ thể. Các nhiệm vụ nghiên cứu và thực hiện của nhóm được xác định gồm 3 nội dung chính:

  1. Thực hiện cài đặt OpenJDK 17 và nền tảng lập trình Eclipse trên hệ điều hành Ubuntu Linux thông qua môi trường máy ảo.
  2. Đọc, nghiên cứu và biên dịch sang tiếng Việt phần Book 4 ("Chuỗi, mảng và bộ sưu tập") của cuốn tài liệu chuyên ngành "Java All-in-One For Dummies".
  3. Thực hiện 30 bài tập bằng ngôn ngữ lập trình Java tương ứng với nội dung nghiên cứu của Book 4 và báo cáo kèm mã nguồn chương trình hoàn chỉnh.

Đối tượng nghiên cứu của đồ án là ngôn ngữ lập trình Java, các kỹ thuật xử lý chuỗi ký tự, cấu trúc mảng và cấu trúc dữ liệu bộ sưu tập. Phạm vi không gian của đề tài gắn liền với môi trường học tập tại Khoa Công nghệ Thông tin, Trường Đại học Kiến trúc Hà Nội; phạm vi thời gian là đợt đánh giá tuần 1 của môn học Công nghệ Java trong năm 2023.

Cơ sở lý thuyết và phương pháp

Đồ án sử dụng khung lý thuyết và kiến thức chuyên môn từ tài liệu chuẩn "Java All-in-One For Dummies" (tập trung vào Book 4: Strings, Arrays, and Collections). Các khái niệm, cơ chế và mô hình kỹ thuật trọng tâm bao gồm:

  • Kiểu tham chiếu (reference types) và kiểu nguyên thủy (primitive types).
  • Mô hình bất biến (Immutable Pattern) áp dụng cho lớp String.
  • Kiến trúc bộ đệm thay đổi kích thước của StringBuilder và StringBuffer, phân biệt cơ chế an toàn đa luồng (thread-safety).
  • Giao diện trừu tượng CharSequence và các phương thức cốt lõi.
  • Khái niệm mảng một chiều, mảng hai chiều, mảng đa chiều và mảng không đều (ragged/jagged arrays).
  • Lớp tiện ích java.util.Arrays với các thuật toán xử lý mảng (sắp xếp, tìm kiếm nhị phân, sao chép vùng nhớ).

Phương pháp nghiên cứu và triển khai thực tế bao gồm:

  • Phương pháp biên dịch và tổng hợp tài liệu chuyên ngành: Đối chiếu thuật ngữ Anh - Việt, hệ thống hóa lý thuyết về cú pháp, hành vi bộ nhớ và phân tích các trường hợp ngoại lệ (như StringIndexOutOfBoundsException).
  • Phương pháp cấu hình và thiết lập hệ thống: Ảo hóa phần cứng bằng phần mềm máy ảo, cài đặt hệ điều hành Linux và triển khai các gói phần mềm phát triển thông qua dòng lệnh Linux Terminal.
  • Phương pháp cài đặt thuật toán và thực nghiệm kiểm thử: Nhóm tự xây dựng mã nguồn, thiết kế các lớp đối tượng phụ trợ, chạy thử nghiệm trên máy tính để thu thập dữ liệu đầu ra và tự động nghiệm, kiểm thử kỹ thuật nhằm đảm bảo tính đúng đắn của mã nguồn.

Nguồn dữ liệu sử dụng trong đồ án bao gồm tệp ảnh ISO hệ điều hành Ubuntu Linux Desktop 64-bit, gói cài đặt VMware Workstation 17 Pro, gói nhị phân OpenJDK 17 (openjdk-17-jre-headless), bộ cài Eclipse IDE for Enterprise Java and Web Developers (phiên bản 2023-09/R) và các đoạn mã nguồn thực nghiệm do nhóm tự triển khai.

Thiết kế và triển khai

Là một đồ án môn học kỹ thuật thuộc chuyên ngành Công nghệ thông tin, đồ án tập trung vào hai mảng triển khai kỹ thuật: thiết lập hạ tầng môi trường phát triển và hiện thực hóa các giải thuật xử lý dữ liệu.

1. Cấu hình môi trường phát triển phần mềm

Quy trình thiết lập môi trường được thực hiện tuần tự qua 3 giai đoạn:

  • Ảo hóa hệ điều hành: Sử dụng phần mềm VMware Workstation 17 Pro trên máy chủ Windows để tạo máy ảo cấu hình "Ubuntu 64-bit", sau đó nạp tệp ảnh ISO Ubuntu Desktop (bản 22.04 / 22.3 amd64) để tiến hành cài đặt hoàn chỉnh hệ điều hành Ubuntu Linux.
  • Cài đặt bộ công cụ máy ảo Java (JDK): Trên giao diện dòng lệnh Terminal của Ubuntu, kiểm tra trạng thái ban đầu bằng lệnh java -version. Khi hệ thống thông báo chưa tìm thấy, tiến hành cài đặt gói thực thi Java tiêu chuẩn bằng lệnh: sudo apt install openjdk-17-jre-headless Sau khi hoàn tất, kiểm tra lại bằng lệnh java -version để xác nhận máy ảo Java 17 đã hoạt động.
  • Triển khai môi trường phát triển tích hợp (IDE): Tải gói lưu trữ nén eclipse-inst-jre-linux64.gz từ trang chủ Eclipse, giải nén trong thư mục Downloads, chạy trình cài đặt eclipse-inst và lựa chọn gói phát triển "Eclipse IDE for Enterprise Java and Web Developers". Thiết lập thư mục không gian làm việc (workspace) và kích hoạt môi trường làm việc.

2. Thiết kế và cài đặt thuật toán

Đồ án triển khai các giải thuật giải quyết hai bài toán kinh điển bằng mã nguồn Java cụ thể:

  • Bài toán tủ khóa học đường (Bobo and the Lockers): Nhóm thiết kế giải thuật mô phỏng 1.000 tủ khóa bằng mảng boolean[] lockers = new boolean[1001] nhằm sử dụng chỉ mục trực tiếp từ 1 đến 1000 (bỏ qua phần tử 0). Dùng hai vòng lặp lồng nhau: vòng lặp ngoài đại diện cho bước nhảy skip (từ 1 đến 1000), vòng lặp trong duyệt qua các tủ có chỉ mục chia hết cho skip và đảo trạng thái đóng/mở bằng toán tử đảo bit logic (!).
  • Ứng dụng tính toán nước đi quân mã cờ vua (KnightMoves): Nhóm xây dựng cấu trúc bàn cờ 8x8 (int[8][8]) biểu diễn hàng (rank) và cột (file). Tám hướng di chuyển hợp lệ của quân mã theo hình chữ L được mô hình hóa bằng mảng hằng số tĩnh kích thước 8x2: static int[][] moves = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}}; Thuật toán định nghĩa lớp Pos chứa tọa độ (x, y), xây dựng các hàm chuyển đổi tọa độ chuẩn bàn cờ convertSquareToPos (nhận chuỗi như "e4" thành x=4, y=3), convertPosToSquare, hàm calculateNewPos kiểm tra điều kiện biên để loại bỏ nước đi ra khỏi bàn cờ (tọa độ nhỏ hơn 0 hoặc lớn hơn 7), và hàm printBoard in biểu diễn đồ họa bàn cờ dạng văn bản với các ký hiệu trực quan: quân mã (X), ô có thể đến (?) và ô trống (-).

Nội dung chính theo từng chương

Báo cáo được cấu trúc thành ba chương theo tiến trình triển khai thực tế của nhóm:

Chương 1: Thực hiện cài đặt Open JDK 17 và nền tảng lập trình Eclipse trên Ubuntu Linux

Chương này ghi lại chi tiết các bước thiết lập môi trường lập trình từ hệ thống vật lý đến phần mềm ứng dụng:

  • Cài đặt máy ảo VMware và Ubuntu Linux: Trình bày 10 bước thao tác, bao gồm tải VMware Workstation 17 Pro, chạy file cài đặt, tải tệp ISO Ubuntu Linux 64-bit, cấu hình máy ảo, liên kết tệp ISO và khởi chạy cài đặt giao diện đồ họa người dùng của Ubuntu.
  • Cài đặt OPEN JDK17: Hướng dẫn 4 bước thao tác trên Terminal, sử dụng tổ hợp phím Ctrl + Alt + T, gõ lệnh kiểm tra phiên bản, chạy lệnh cài đặt quyền quản trị sudo apt install openjdk-17-jre-headless và xác thực kết quả cài đặt thành công.
  • Cài đặt nền tảng lập trình Eclipse: Hướng dẫn 4 bước từ tải gói cài đặt Linux dạng .tar.gz, giải nén, chọn phiên bản Eclipse dành cho Enterprise Java and Web Developers, chọn thư mục lưu trữ và khởi chạy màn hình chính của IDE.

Chương 2: Biên dịch sang tiếng Việt Book 4 cuốn “Java All-in-One For Dummies”

Chương này chiếm dung lượng lý thuyết trọng tâm của báo cáo, dịch và hệ thống hóa toàn bộ các chủ đề về chuỗi, mảng và các cấu trúc dữ liệu liên quan:

Biên dịch sang tiếng Việt Chương 1: Xử lý chuỗi

  • Bản chất của chuỗi và mô hình bất biến: Xác định String là kiểu dữ liệu tham chiếu. Java hỗ trợ string literals và các chuỗi thoát (escape sequences: \n, \t, \b, \r, \f, \', \", \\). Phân biệt rõ chuỗi ký tự (String, dùng dấu ngoặc kép) và ký tự đơn (char, dùng dấu nháy đơn). Phân tích mô hình đối tượng bất biến (Immutable): khi một đối tượng String đã được tạo ra, trạng thái bên trong không bao giờ có thể bị sửa đổi. Mọi thao tác ghép chuỗi hoặc biến đổi đều sinh ra đối tượng mới. Để so sánh chuỗi, văn bản nhấn mạnh việc sử dụng equals() và equalsIgnoreCase() thay vì toán tử so sánh địa chỉ ==.
  • Hệ thống phương thức của lớp String: Khảo sát chi tiết bảng phương thức bao gồm: charAt(), compareTo(), contains(), endsWith(), equals(), indexOf(), lastIndexOf(), length(), replace(), replaceAll(), replaceFirst(), split(), startsWith(), substring(), toCharArray(), toLowerCase(), toUpperCase(), trim(), và valueOf().
  • Ứng dụng thực hành xử lý chuỗi: Minh họa các ví dụ mã nguồn như chương trình CountVowels (duyệt từng ký tự bằng charAt() và đếm 5 nguyên âm A, E, I, O, U cả hoa lẫn thường), chương trình MarkVowels (thay thế nguyên âm bằng dấu hoa thị * sử dụng hàm cắt ghép chuỗi substring()), chương trình ListWords (sử dụng biểu thức chính quy \s+ kết hợp phương thức split() để tách các từ riêng lẻ bất kể số lượng khoảng trắng phân cách), và phương thức replaceAll() để đổi từ "cat" thành "dog".
  • Lớp StringBuilder và StringBuffer: Phân tích nguyên nhân suy giảm hiệu năng khi ghép chuỗi thông thường: ví dụ 4 câu lệnh nối chuỗi có thể tạo ra 5 đối tượng String độc lập trong bộ nhớ. Giới thiệu giải pháp dùng StringBuilder và StringBuffer có bộ đệm (buffer) khả biến với hai thuộc tính length (chiều dài chuỗi hiện thời) và capacity (dung lượng bộ đệm, mặc định bằng độ dài chuỗi ban đầu cộng thêm 16 ký tự). So sánh sự khác nhau: StringBuffer an toàn đa luồng nhưng hiệu năng thấp hơn, trong khi StringBuilder không đồng bộ hóa luồng nhưng có tốc độ xử lý nhanh hơn. Trình bày chương trình StringBuilderApp sử dụng phương thức setCharAt() trực tiếp trên bộ đệm để tối ưu hóa việc thay thế ký tự.
  • Giao diện CharSequence: Phân tích giao diện chung mà String, StringBuilder, StringBuffer cùng hiện thực hóa, cho phép các phương thức nhận tham số đa hình linh hoạt với 4 phương thức chuẩn: charAt(int), length(), subSequence(int, int), và toString().

Biên dịch sang tiếng Việt Chương 2: Sử dụng mảng

  • Cấu trúc mảng cơ bản: Định nghĩa mảng trong Java là một đối tượng chứa tập hợp các phần tử cùng kiểu, chỉ mục bắt đầu từ 0 đến length - 1. Chiều dài mảng là cố định và được xác định qua thuộc tính length. Hướng dẫn hai cách khai báo (type[] name hoặc type name[]), khởi tạo bằng từ khóa new hoặc dùng khối khởi tạo hằng số {...}.
  • Vòng lặp và thuật toán trên mảng: Hướng dẫn duyệt mảng bằng vòng lặp for thông thường và vòng lặp for nâng cao (enhanced for loop / for-each, giới thiệu từ Java 1.5). Trình bày chi tiết lời giải bài toán "Bobo and the lockers", chứng minh thực nghiệm rằng trong số 1.000 tủ khóa, có chính xác 31 tủ mở tại các vị trí số chính phương (1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961).
  • Mảng hai chiều, mảng không đều và mảng đa chiều:
    • Mảng hai chiều: Mô hình hóa bảng dữ liệu doanh số bán hàng qua 5 năm (2004 đến 2008) tại 4 khu vực (North, South, East, West) qua khai báo double[][] sales = new double[5][4]. Phân tích tầm quan trọng của thứ tự lồng vòng lặp for khi kết xuất dữ liệu theo dòng hoặc theo cột.
    • Mảng không đều (ragged array): Cấu trúc mảng hai chiều trong đó các mảng con có kích thước khác nhau, minh họa bằng dữ liệu 4 đội thể thao A, B, C, D có số lượng thành viên là 2 hoặc 3 người.
    • Mảng đa chiều: Khai báo mảng 3 chiều int[][][] threeD = new int[3][3][3] với cấu trúc khối lập phương 27 phần tử, khởi tạo bằng vòng lặp hoặc khối hằng số lồng nhau.
  • Ứng dụng phức tạp - Bàn cờ vua: Trình bày mã nguồn hoàn chỉnh của chương trình KnightMoves (Dòng 1 đến 183), phân tích cách chuyển đổi ký hiệu ô cờ sang hệ tọa độ số, tính toán nước đi bằng ma trận độ lệch, loại trừ các nước đi ra ngoài biên bàn cờ và vẽ bàn cờ trực quan ra màn hình console.
  • Lớp tiện ích java.util.Arrays: Giới thiệu các phương thức tĩnh hỗ trợ thao tác mảng: fill() (điền giá trị ban đầu), copyOf() và copyOfRange() (sao chép mảng sang kích thước mới, tự động điền giá trị 0 nếu kích thước mới lớn hơn), sort() (sắp xếp tăng dần), binarySearch() (tìm kiếm nhị phân phần tử trên mảng đã sắp xếp), equals() và deepEquals() (so sánh bằng nhau cho mảng một chiều và đa chiều).

Các chương tiếp theo của Book 4 (theo mục lục văn bản)

Văn bản báo cáo liệt kê các chương kế tiếp trong cấu trúc tài liệu Book 4 bao gồm:

  • Biên dịch sang tiếng việt Chương 3: Sử dụng lớp ArrayList
  • Biên dịch sang tiếng việt Chương 4: Sử dụng lớp LinkedList
  • Biên dịch sang tiếng việt Chương 5: Tạo các lớp Bộ sưu tập Thông số hóa
  • Biên dịch sang tiếng việt Chương 6: Dùng các Thao tác Dữ liệu Đại lượng với Bộ sưu tập

Chương 3: Thực hiện bài tập bằng Java

Theo mục lục và phần tóm tắt của đồ án, chương này (bắt đầu từ trang 85 của văn bản gốc) dành cho việc trình bày lời giải và mã nguồn thực thi của 30 bài tập lập trình bằng ngôn ngữ Java tương ứng với nội dung lý thuyết đã nghiên cứu trong Book 4.

Kết quả và đóng góp

Đồ án ghi nhận các kết quả kỹ thuật và số liệu thực tế được rút ra từ các thực nghiệm và nội dung biên dịch:

1. Bảng số liệu kỹ thuật và kết quả đo đạc từ văn bản

Nội dung thực nghiệm / Khảo sát Thông số / Dữ liệu thực tế ghi nhận trong đồ án
Phần mềm máy ảo VMware Workstation 17 Pro for Windows
Hệ điều hành khách Ubuntu Linux Desktop bản 22.04 / 22.3 (kiến trúc amd64)
Phiên bản máy ảo Java OpenJDK 17 (openjdk-17-jre-headless)
Môi trường phát triển Eclipse IDE 2023-09/R (Enterprise Java and Web Developers)
Số đối tượng sinh ra khi nối chuỗi 5 đối tượng String phát sinh trong bộ nhớ từ 4 dòng lệnh gán ghép chuỗi
Dung lượng đệm mặc định StringBuilder Bằng chiều dài chuỗi ban đầu cộng thêm 16 ký tự (length + 16)
Kết quả bài toán Bobo and the Lockers Chính xác 31 tủ mở trên tổng số 1.000 tủ khóa; tất cả đều là số chính phương
Kích thước ma trận bàn cờ vua 8 hàng x 8 cột (int[8][8])
Số nước đi tối đa của quân mã 8 nước đi khả dĩ; ma trận độ lệch bước nhảy kích thước 8x2
Dữ liệu mảng doanh số khảo sát 5 năm (2004 - 2008) x 4 khu vực (North, South, East, West)
Số phần tử mảng khối 3 chiều 27 phần tử (int[3][3][3]), giá trị khởi tạo từ 1 đến 27
Khối lượng bài tập lập trình thực hiện 30 bài tập bằng ngôn ngữ Java kèm mã nguồn

2. Các giải pháp và đóng góp của đồ án

  • Xây dựng quy trình hướng dẫn trực quan từng bước (kèm ảnh chụp màn hình minh họa và câu lệnh cụ thể) giúp người học thiết lập môi trường lập trình Java chuẩn trên Linux.
  • Đóng góp một bản dịch kỹ thuật chuyên ngành hoàn chỉnh cho hai chương nền tảng của cuốn "Java All-in-One For Dummies", chuyển đổi chính xác các thuật ngữ trừu tượng về chuỗi, mảng và quản lý bộ nhớ sang tiếng Việt.
  • Hiện thực hóa thành công các thuật toán mô phỏng logic phức tạp (bài toán toán học trường học và bài toán bàn cờ vua) bằng mã nguồn Java hoàn chỉnh, có xử lý ngoại lệ, kiểm tra biên dữ liệu và trực quan hóa kết quả trên console.

Hạn chế và hướng nghiên cứu tiếp

Dựa trên phạm vi và nội dung văn bản báo cáo:

  • Hạn chế: Báo cáo thuộc giai đoạn "Tuần 1" của học phần Đồ án môn học Công nghệ Java. Toàn bộ phần nội dung chi tiết trong văn bản được cung cấp tập trung vào Chương 1 và Chương 2 của Book 4 (Chuỗi và Mảng); các chương từ Chương 3 đến Chương 6 của Book 4 (ArrayList, LinkedList, Generic Collections, Stream API) và phần mã nguồn chi tiết của 30 bài tập tại Chương 3 mới dừng lại ở việc định hình tiêu đề trong cấu trúc mục lục.
  • Hướng phát triển tiếp theo: Đồ án đề ra lộ trình tiếp tục hoàn thiện bản dịch chi tiết cho các chương cấu trúc dữ liệu Collections nâng cao, triển khai đầy đủ mã nguồn và kết quả kiểm thử cho 30 bài tập thực hành theo đúng kế hoạch của các tuần học tiếp theo.

Giá trị tham khảo

Báo cáo đồ án môn học này là tài liệu tham khảo thiết thực cho:

  • Sinh viên chuyên ngành Công nghệ thông tin và Kỹ thuật phần mềm: Đặc biệt là sinh viên đang theo học học phần Công nghệ Java, Lập trình hướng đối tượng hoặc Cấu trúc dữ liệu và giải thuật.
  • Người tự học lập trình Java: Những người cần hướng dẫn chi tiết về cách cấu hình môi trường lập trình Linux chuẩn mực (Ubuntu + OpenJDK 17 + Eclipse) thay vì môi trường Windows thông thường.
  • Phần giá trị nhất: Mục phân tích chuyên sâu về tính bất biến của lớp String, bảng đối chiếu hiệu năng giữa String và StringBuilder, cấu trúc mảng không đều, cùng toàn bộ mã nguồn bài toán bàn cờ vua KnightMoves với kỹ thuật xử lý ma trận và tách hàm module hóa rõ ràng.

Câu hỏi thường gặp

1. Môi trường phát triển phần mềm trong đồ án được cài đặt cụ thể trên các phiên bản nào?

Môi trường thực thi được triển khai trên máy ảo VMware Workstation 17 Pro, chạy hệ điều hành Ubuntu Linux Desktop 64-bit (phiên bản 22.04 / 22.3). Gói máy ảo Java được cài đặt là OpenJDK 17 headless (openjdk-17-jre-headless) thông qua lệnh sudo apt install. Nền tảng lập trình tích hợp là Eclipse IDE phiên bản 2023-09/R, gói Enterprise Java and Web Developers.

2. Tại sao lớp String trong Java được thiết kế theo mô hình bất biến và khi nào cần dùng StringBuilder?

Lớp String là đối tượng không thể thay đổi (immutable): sau khi được khởi tạo, trạng thái bên trong không thể bị sửa đổi; mọi thao tác nối chuỗi hoặc thay đổi ký tự đều sinh ra một đối tượng String mới trên bộ nhớ heap. Điều này dẫn đến sự lãng phí tài nguyên bộ nhớ khi thực hiện các phép toán lặp nối chuỗi lớn. Trong các ứng dụng xử lý chuỗi phức tạp và liên tục, StringBuilder được khuyến nghị sử dụng vì nó duy trì một bộ đệm khả biến, cho phép sửa đổi trực tiếp dữ liệu mà không cấp phát đối tượng mới, giúp tối ưu hóa hiệu năng.

3. Quy luật và kết quả cuối cùng của bài toán Bobo and the Lockers được chứng minh như thế nào?

Sau khi cho Bobo đi qua 1.000 tủ khóa với các bước nhảy từ 1 đến 1.000, chương trình BoboAndTheLockers xác định có đúng 31 tủ khóa còn mở. Các tủ mở mang số thứ tự là bình phương hoàn hảo (số chính phương): 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961. Số 31 chính là số nguyên lớn nhất có bình phương nhỏ hơn 1.000 ($31^2 = 961$).

4. Thuật toán kiểm tra nước đi của quân mã trong chương trình KnightMoves hoạt động ra sao?

Thuật toán sử dụng mảng hằng số 8x2 biểu diễn 8 bước nhảy tương đối của quân mã. Khi người dùng nhập một ô cờ (ví dụ "e4"), hàm convertSquareToPos chuyển chuỗi này thành đối tượng Pos với tọa độ x (cột) và y (hàng). Sau đó, hàm calculateNewPos cộng dồn độ lệch vào vị trí ban đầu và kiểm tra điều kiện biên: nếu tọa độ x hoặc y nhỏ hơn 0 hoặc lớn hơn 7, nước đi sẽ bị loại bỏ (trả về null). Các nước đi hợp lệ sẽ được đánh dấu giá trị 2 trên ma trận bàn cờ 8x8 và hiển thị bằng dấu ? trên giao diện console.

5. Giao diện CharSequence trong Java có vai trò gì và bao gồm các phương thức nào?

Giao diện CharSequence được triển khai bởi cả ba lớp String, StringBuilder và StringBuffer. Giao diện này cho phép các phương thức nhận tham số chuỗi tổng quát để xử lý đồng nhất bất kể kiểu đối tượng truyền vào. CharSequence định nghĩa 4 phương thức cốt lõi: charAt(int index) (lấy ký tự tại vị trí chỉ định), length() (lấy độ dài chuỗi), subSequence(int start, int end) (trích xuất chuỗi con), và toString() (chuyển đổi đối tượng thành biểu diễn chuỗi).

Kết luận

Báo cáo bài tập lớn Tuần 1 của Nhóm 11 là một công trình học thuật thực hành hoàn chỉnh, kết hợp chặt chẽ giữa việc cấu hình hạ tầng phát triển trên Linux với nghiên cứu lý thuyết chuyên sâu và lập trình thuật toán thực nghiệm bằng Java. Đồ án đã chuẩn hóa các kiến thức cốt lõi về tính bất biến của chuỗi, cấu trúc mảng đa chiều và kỹ thuật tối ưu hóa bộ nhớ, đồng thời cung cấp các giải thuật mẫu có giá trị ứng dụng cao cho việc học tập môn Công nghệ Java. Toàn bộ nội dung và mã nguồn trong báo cáo phản ánh trung thực quá trình nghiên cứu, dịch thuật và kiểm thử độc lập của nhóm sinh viên Trường Đại học Kiến trúc Hà Nội.