Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

460/11.885 câuCòn 11.425
ATo define the structure of a webpage
BTo style web content
CTo collect user input
DTo display images
Lời giải
Đáp án đúng: "To collect user input". Thẻ form gom các ô nhập rồi gửi lên server theo phương thức và đường dẫn đã khai: trình duyệt đóng gói dữ liệu thành các cặp tên và giá trị, còn phía servlet đọc lại đúng bằng tên ô qua phương thức lấy tham số của request, nên form chính là cầu đưa dữ liệu từ người dùng vào mã Java. Lựa chọn "To define the structure of a webpage" là việc của HTML nói chung với các thẻ bố cục; form chỉ là một phần nhỏ nằm trong bố cục đó. Lựa chọn "To style web content" là việc của CSS, form không quy định màu sắc, phông chữ hay khoảng cách. Lựa chọn "To display images" là việc của thẻ ảnh; form có thể chứa ô chọn tệp để tải ảnh lên nhưng bản thân nó không hiển thị ảnh nào.
Mở trang câu hỏi này →
442What is the correct way to forward a request4 lựa chọncó code
Đề bài
using RequestDispatcher? RequestDispatcher rd = request.getRequestDispatcher("dashboard.jsp");
Ard.forward(response, request);
Brd.include(request, response);
Crd.forward(request, response);
Dresponse.sendRedirect("dashboard.jsp");
Lời giải

Đáp án đúng: "rd.forward(request, response); ". Phương thức forward nhận đúng thứ tự tham số là request rồi mới tới phần trả về, và nó chuyển hẳn quyền xử lý sang tài nguyên đích ngay trong cùng một lượt request, nên mọi thuộc tính đã đặt vào request vẫn dùng được ở trang đích và thanh địa chỉ của trình duyệt không đổi. Lựa chọn "rd.forward(response, request); " đảo thứ tự hai tham số nên không khớp chữ ký phương thức và mã không biên dịch được. Lựa chọn "rd.include(request, response); " là lời gọi hợp lệ nhưng khác nghĩa: nó chèn kết quả của tài nguyên kia vào chỗ đang xử lý rồi trả điều khiển về servlet gọi, không phải chuyển tiếp. Lựa chọn "response.sendRedirect("dashboard.jsp"); " không dùng tới bộ điều phối request: nó trả mã chuyển hướng cho trình duyệt, sinh một request mới, URL đổi và dữ liệu trong phạm vi request cũ mất.

Mở trang câu hỏi này →
ATo define the structure of HTML pages.
BTo handle HTTP requests and responses.
CTo map a servlet to a URL pattern, specifying the URL at which the servlet will respond.
DTo configure and define filters that can intercept requests and responses in the web application.
ENone of the others
Lời giải
Đáp án đúng: "To configure and define filters that can intercept requests and responses in the web application.". Khối filter trong mô tả triển khai khai báo một filter: tên dùng để tham chiếu, lớp cài giao diện Filter, kèm các tham số khởi tạo; nhờ đó container biết nạp lớp nào, rồi khối ánh xạ filter mới nối tên ấy với mẫu URL hay với tên servlet. Lựa chọn "To define the structure of HTML pages." nhầm sang phần hiển thị, mô tả triển khai không chứa bố cục trang. Lựa chọn "To handle HTTP requests and responses." mô tả việc của mã lúc chạy, còn mô tả triển khai chỉ là khai báo cấu hình chứ không tự xử lý request nào. Lựa chọn "To map a servlet to a URL pattern, specifying the URL at which the servlet will respond." là việc của khối ánh xạ servlet; với filter thì phần ánh xạ cũng tách sang khối riêng chứ không nằm trong khối khai báo này. Lựa chọn "None of the others" không dùng được vì đã có một mô tả đúng trong danh sách.
Mở trang câu hỏi này →
ATo initialize the filter.
BTo define the filter's URL mapping.
CTo perform the actual filtering of requests and responses.
DTo destroy the filter.
Lời giải
Đáp án đúng: "To perform the actual filtering of requests and responses.". Phương thức doFilter là chỗ duy nhất trong vòng đời filter thực sự nằm trên đường đi của request: nó nhận cả request và phần trả về, được phép xem và sửa chúng, rồi gọi chuỗi để chuyển cho filter kế tiếp hoặc tài nguyên đích, và phần mã viết sau lời gọi đó chạy trên đường về nên xử lý được cả nội dung trả về. Lựa chọn "To initialize the filter." là việc của init, chạy một lần khi container tạo filter và nhận cấu hình để đọc tham số khởi tạo. Lựa chọn "To define the filter's URL mapping." không phải việc của mã trong doFilter mà do khối ánh xạ filter trong mô tả triển khai hoặc thuộc tính của annotation filter quyết định. Lựa chọn "To destroy the filter." là việc của destroy, chạy một lần khi ứng dụng dừng để giải phóng tài nguyên.
Mở trang câu hỏi này →
AMyWebPro.xml MyWebPro
Bweb.xml in MyWebPro
CMyWebPro.xml in MyWebPro /WEB-INF
Dweb.xml in MyWebPro /WEB-INF
Lời giải
Đáp án đúng: "web.xml in MyWebPro /WEB-INF". Mô tả triển khai của một ứng dụng web luôn mang đúng tên web.xml và phải nằm trong thư mục WEB-INF của ứng dụng đó, ở đây là thư mục MyWebPro; container chỉ đọc đúng vị trí ấy, và WEB-INF còn được bảo vệ nên trình duyệt không tải trực tiếp được tệp cấu hình. Lựa chọn "MyWebPro.xml MyWebPro" sai cả tên tệp lẫn chỗ đặt, vì tên thư mục ứng dụng không trở thành tên tệp cấu hình. Lựa chọn "web.xml in MyWebPro" đúng tên nhưng đặt ngay ở gốc ứng dụng; ở đó container không nạp nó như mô tả triển khai và tệp lại phơi ra cho người ngoài tải. Lựa chọn "MyWebPro.xml in MyWebPro /WEB-INF" đặt đúng thư mục nhưng sai tên: đổi tên tệp đi thì nó không còn được nhận là mô tả triển khai nữa.
Mở trang câu hỏi này →
446What is NOT the use of filter in JSP?5 lựa chọn
AAuthentication blocking request based on user identity.
BLogging and auditing - Tracking uses of a web application.
CImage Conversion - Scaling maps and so on.
DLink to my bootstrap.min.css in a JSP file
EData Compression - Making downloads smaller
Lời giải
Đáp án đúng: "Link to my bootstrap.min.css in a JSP file". Nhúng một tệp CSS vào trang là việc của thẻ liên kết trong phần đầu của HTML do trang JSP sinh ra, rồi trình duyệt tự tải tệp đó bằng một request riêng; không bước nào trong chuỗi filter tham gia việc khai báo liên kết ấy. Lựa chọn "Authentication blocking request based on user identity." lại đúng là việc filter hay làm nhất, vì doFilter kiểm tra phiên rồi quyết định gọi tiếp chuỗi hay chuyển hướng về trang đăng nhập. Lựa chọn "Logging and auditing - Tracking uses of a web application." cũng khả thi vì mã trong filter chạy cả trước và sau tài nguyên đích nên ghi lại được đường dẫn, thời gian và kết quả. Lựa chọn "Image Conversion - Scaling maps and so on." là ví dụ kinh điển của filter biến đổi nội dung trả về. Lựa chọn "Data Compression - Making downloads smaller" cũng là filter bọc phần trả về để nén dữ liệu.
Mở trang câu hỏi này →
ATagSupport
BSimpleTagSupport
CBodyTagSupport
DCustomTagSupport
Lời giải
Đáp án đúng: "SimpleTagSupport". Lớp này cài sẵn giao diện thẻ đơn giản và lo hết phần việc lặp lại, nên viết một thẻ tuỳ biến chỉ còn là kế thừa nó rồi ghi đè doTag, dùng bối cảnh trang có sẵn để ghi ra luồng xuất và lấy thân thẻ qua phương thức trả về đoạn thân. Lựa chọn "TagSupport" thuộc mô hình thẻ cổ điển: phải ghi đè doStartTag cùng doEndTag rồi trả về các hằng số điều khiển để bảo container bỏ qua hay xử lý thân thẻ, nhiều việc hơn hẳn. Lựa chọn "BodyTagSupport" còn nặng hơn vì thêm phần đệm và xử lý lại thân thẻ, chỉ cần khi thẻ phải đọc hoặc lặp nội dung bên trong nhiều lần. Lựa chọn "CustomTagSupport" không có trong thư viện của JSP, đây là tên nghe hợp lý nhưng không tồn tại nên không thể kế thừa.
Mở trang câu hỏi này →
ATo provide metadata about custom tags.
BTo define the tag handlers for custom tags.
CTo specify the tag's attributes and their types.
DTo declare the location of the JSP file that uses the tag.
Lời giải
Đáp án đúng: "To provide metadata about custom tags.". Phần mô tả trong tệp TLD là siêu dữ liệu dành cho người đọc và cho công cụ: nó giải thích thẻ dùng để làm gì, hiện ra trong gợi ý của trình soạn mã hay tài liệu sinh tự động, và xoá nó đi thì thẻ vẫn chạy y nguyên vì container không dựa vào mô tả để xử lý thẻ. Lựa chọn "To define the tag handlers for custom tags." là việc của khối khai lớp xử lý thẻ trong cùng tệp, chứ không phải của phần mô tả. Lựa chọn "To specify the tag's attributes and their types." là việc của các khối thuộc tính, mỗi khối nêu tên, kiểu dữ liệu và việc thuộc tính có bắt buộc hay nhận giá trị động hay không. Lựa chọn "To declare the location of the JSP file that uses the tag." đi ngược chiều phụ thuộc: trang JSP khai báo thư viện thẻ mà nó muốn dùng, còn tệp mô tả thư viện không biết và không cần biết trang nào dùng thẻ.
Mở trang câu hỏi này →
AIt is used to create complex tags with body content.
BIt simplifies custom tag creation by providing a simple handle to tag processing.
CIt handles HTTP requests and responses for the tag.
DIt manages the lifecycle of JSP pages.
Lời giải
Đáp án đúng: "It simplifies custom tag creation by providing a simple handle to tag processing.". Mô hình này thu gọn vòng đời thẻ về một phương thức doTag duy nhất: container tạo mới thể hiện handler cho mỗi lần dùng thẻ, truyền sẵn bối cảnh trang và thân thẻ dưới dạng một đoạn JSP gọi lại được, nên người viết thẻ không phải trả về các hằng số điều khiển như trong mô hình cổ điển. Lựa chọn "It is used to create complex tags with body content." mô tả hướng của giao diện và lớp hỗ trợ thân thẻ cũ, vốn cho phép đệm rồi xử lý đi xử lý lại thân; mô hình đơn giản vẫn gọi được thân thẻ nhưng điểm nhấn của nó là giảm việc, không phải phục vụ ca phức tạp. Lựa chọn "It handles HTTP requests and responses for the tag." nhầm vai sang servlet, vì thẻ chỉ ghi nội dung ra luồng xuất của trang. Lựa chọn "It manages the lifecycle of JSP pages." cũng nhầm vai: vòng đời trang do container quản, giao diện thẻ chỉ chi phối vòng đời của chính thể hiện thẻ.
Mở trang câu hỏi này →
A`web.xml`
B`index.html`
C`taglib.tld`
D`deployment.descriptor`
Lời giải
Đáp án đúng: "`taglib.tld`". Tệp mô tả thư viện thẻ đặt trong WEB-INF là nơi mỗi thẻ tuỳ biến được khai báo bằng một khối gồm tên thẻ, lớp xử lý thẻ, kiểu thân thẻ và danh sách thuộc tính; nhờ khối đó container biết gặp tên thẻ nào thì nạp lớp handler nào. Lựa chọn "`web.xml`" là mô tả triển khai của ứng dụng, nó chỉ có thể khai một khối thư viện thẻ để nối một uri với đường dẫn tới tệp mô tả thư viện, còn việc ánh xạ từng thẻ sang lớp vẫn nằm trong tệp mô tả đó. Lựa chọn "`index.html`" là trang nội dung tĩnh gửi cho trình duyệt, không phải tệp cấu hình nào. Lựa chọn "`deployment.descriptor`" không phải tên tệp có thật trong ứng dụng web; cụm mô tả triển khai là tên gọi chung cho loại tệp cấu hình đó, không phải một tệp mang đuôi như vậy.
Mở trang câu hỏi này →
A<fmt:parseDate> turns a date into text, and <fmt:formatDate> turns text into a date
B<fmt:parseDate> turns text into a date, and <fmt:formatDate> turns a date into text.
CThey do the same thing.
D<fmt:parseDate> is for calculations, and <fmt:formatDate> is for showing dates.
Lời giải
Đáp án đúng: "<fmt:parseDate> turns text into a date, and <fmt:formatDate> turns a date into text.". Hai thẻ này ngược chiều nhau đúng theo nghĩa của từ: phân tích là đọc chuỗi do người dùng hay cơ sở dữ liệu đưa vào rồi dựng thành đối tượng ngày để so sánh và tính toán, còn định dạng là lấy đối tượng ngày đem xuất ra chuỗi cho người đọc. Lựa chọn "<fmt:parseDate> turns a date into text, and <fmt:formatDate> turns text into a date" đảo đúng hai vai đó nên cả hai vế đều sai. Lựa chọn "They do the same thing." sai vì đầu vào và đầu ra của hai thẻ khác hẳn nhau, một thẻ cần khuôn để hiểu chuỗi đầu vào, thẻ kia cần khuôn để sinh chuỗi đầu ra. Lựa chọn "<fmt:parseDate> is for calculations, and <fmt:formatDate> is for showing dates." đúng một nửa ở vế sau, nhưng thẻ phân tích không tự làm phép tính nào, nó chỉ chuyển chuỗi thành kiểu ngày để mã khác tính được.
Mở trang câu hỏi này →
A<fmt:setLocale>
B<fmt:setTimeZone>
C<fmt:formatDate>
D<fmt:message>
Lời giải
Đáp án đúng: "<fmt:setLocale>". Thẻ này đặt locale cho phần còn lại của trang, nên mọi thẻ định dạng hay phân tích chuỗi đứng sau nó sẽ lấy locale đã đặt làm cơ sở thay vì dựa vào thông tin ngôn ngữ do trình duyệt gửi lên. Lựa chọn "<fmt:setTimeZone>" cũng là thẻ thiết lập bối cảnh nhưng đặt múi giờ dùng khi hiển thị thời gian, nó không đổi quy ước ngôn ngữ, cách viết số hay thứ tự ngày tháng. Lựa chọn "<fmt:formatDate>" là thẻ tiêu thụ chứ không phải thẻ thiết lập: nó xuất một đối tượng ngày thành chuỗi theo khuôn và theo locale đang hiệu lực. Lựa chọn "<fmt:message>" tra một chuỗi trong tập tài nguyên theo khoá; nó chịu ảnh hưởng của locale đã đặt chứ không phải chỗ để đặt locale.
Mở trang câu hỏi này →
Đề bài
    <p>${user.name}</p>
</c:forEach>
<p>End of list</p>
AIt will display all user names followed by "End of list".
BIt will throw a NullPointerException because userList is empty.
CIt will only print "End of list".
DThe page will crash due to an iteration error.
Lời giải
Đáp án đúng: "It will only print "End of list".". Thẻ forEach lặp theo số phần tử của tập được truyền vào thuộc tính items, nên danh sách rỗng nghĩa là không có lượt nào và thân thẻ không sinh ra đoạn văn bản nào; dòng nằm sau vòng lặp không phụ thuộc vòng lặp nên vẫn được in bình thường. Lựa chọn "It will display all user names followed by "End of list"." chỉ đúng khi danh sách có phần tử, còn ở đây không có tên nào để hiển thị. Lựa chọn "It will throw a NullPointerException because userList is empty." sai ở hai mức: danh sách rỗng khác với null, và ngay cả khi biến không tồn tại thì biểu thức trả về null còn forEach coi null là tập rỗng nên cũng không ném ngoại lệ. Lựa chọn "The page will crash due to an iteration error." sai vì lặp không phần tử là trạng thái hợp lệ của forEach, trang vẫn dịch được và chạy trọn tới cuối.
Mở trang câu hỏi này →
Đề bài
var="item" value="5"/> <c:forEach var="item" begin="1" end="1"> <c:out value="${item}"/> </c:forEach>
A1
B5
CNo output
DError
Lời giải
Đáp án đúng: "1". Thẻ set tạo biến item ở phạm vi trang với giá trị 5, nhưng thẻ forEach lại khai biến vòng lặp cũng mang tên item, và trong thân vòng lặp biến vòng lặp che mất biến cũ; vòng lặp đếm từ giá trị begin đến giá trị end là từ 1 đến 1 nên chạy đúng một lượt với item bằng 1, vì vậy thẻ out in ra 1. Lựa chọn "5" chỉ đúng nếu đọc biến item ở ngoài vòng lặp, còn thẻ out ở đây nằm trong thân nên luôn thấy giá trị của biến vòng lặp. Lựa chọn "No output" sai vì begin và end đều bằng 1 nên khoảng lặp không rỗng và thân vẫn chạy một lượt. Lựa chọn "Error" sai vì chỉ thị taglib của thư viện core đã có mặt với tiền tố c, mọi thẻ đều dùng đúng tiền tố đó, và việc trùng tên biến giữa set với forEach không bị coi là lỗi ở pha dịch trang.
Mở trang câu hỏi này →
AContext initialization
BSession creation
CSession destruction
DRequest handling
Lời giải
Đáp án đúng: "Session destruction". Phương thức sessionDestroyed là callback container gọi khi một phiên hết hiệu lực, do mã gọi huỷ phiên hoặc do quá thời gian chờ không hoạt động; đây là chỗ hợp lý để giải phóng tài nguyên gắn với phiên hay giảm bộ đếm người đang đăng nhập. Lựa chọn "Context initialization" thuộc contextInitialized của ServletContextListener, xảy ra một lần ở mức ứng dụng và không liên quan phiên nào. Lựa chọn "Session creation" do phương thức còn lại của chính giao diện này là sessionCreated xử lý, tức là mốc đối lập trong vòng đời phiên. Lựa chọn "Request handling" là việc của servlet, hoặc của ServletRequestListener nếu chỉ cần bắt mốc một request bắt đầu và kết thúc, chứ không phải việc của sessionDestroyed.
Mở trang câu hỏi này →
AServletContextAttributeListener
BServletRequestListener
CHttpSessionListener
DServletContextListener
Lời giải
Đáp án đúng: "ServletContextListener". Nạp JDBC driver là việc chỉ cần làm một lần cho cả ứng dụng và phải xong trước khi có request đầu tiên, nên đúng chỗ là contextInitialized của giao diện này: container gọi phương thức đó ngay sau khi ngữ cảnh ứng dụng được tạo và trước khi bất kỳ servlet nào phục vụ, còn contextDestroyed là nơi dọn dẹp khi ứng dụng dừng. Lựa chọn "ServletContextAttributeListener" chỉ được gọi khi có thuộc tính của ngữ cảnh ứng dụng bị thêm, thay hoặc xoá; nếu không ai đặt thuộc tính thì nó không chạy lần nào. Lựa chọn "ServletRequestListener" chạy theo từng request, nên driver bị nạp lặp lại vô ích và vẫn muộn hơn thời điểm khởi động ứng dụng. Lựa chọn "HttpSessionListener" gắn với vòng đời phiên người dùng, mà ứng dụng có thể phục vụ nhiều request không tạo phiên nào, khi đó driver có thể không bao giờ được nạp.
Mở trang câu hỏi này →
AA component responsible for managing database connections.
BA mechanism for intercepting and reacting to lifecycle events of a web application.
CA module for handling HTTP requests and generating responses.
DA tool for optimizing server performance and resource utilization.
Lời giải
Đáp án đúng: "A mechanism for intercepting and reacting to lifecycle events of a web application.". Server listener là lớp do ta viết, cài một giao diện listener của đặc tả servlet rồi khai báo bằng annotation listener hoặc bằng khối listener trong mô tả triển khai; container tự gọi các phương thức callback đúng lúc sự kiện vòng đời xảy ra, chẳng hạn ServletContextListener nhận contextInitialized khi ứng dụng vừa nạp xong và contextDestroyed khi ứng dụng bị tháo, HttpSessionListener nhận mốc tạo và huỷ phiên, ServletRequestListener nhận mốc request bắt đầu và kết thúc. Lựa chọn "A component responsible for managing database connections." mô tả một nguồn dữ liệu hay bể kết nối; listener chỉ là nơi thuận tiện để khởi tạo bể đó chứ bản thân nó không quản lý kết nối. Lựa chọn "A module for handling HTTP requests and generating responses." chính là định nghĩa của servlet, vì servlet mới nằm trên đường xử lý request và sinh nội dung trả về. Lựa chọn "A tool for optimizing server performance and resource utilization." nói về công cụ tinh chỉnh hiệu năng, không phải cơ chế bắt sự kiện vòng đời.
Mở trang câu hỏi này →
AA component responsible for handling HTTP requests in application
BA mechanism for managing database connections
CAn interface for intercepting events that occur in a web application
DA tool for compressing and decompressing web resources
Lời giải
Đáp án đúng: "An interface for intercepting events that occur in a web application". Listener là nhóm giao diện do đặc tả Servlet định nghĩa để chặn các sự kiện trong vòng đời ứng dụng: khai bằng thẻ listener trong web.xml hoặc bằng annotation tương ứng, rồi container gọi phương thức của ta khi ứng dụng khởi động và khi bị gỡ, khi một phiên được tạo hay bị huỷ, khi một thuộc tính trong phạm vi nào đó được đặt, thay hoặc xoá; nhờ đó ta có chỗ mở sẵn tài nguyên lúc bật và đóng gọn lúc dừng, hay đếm số người đang trực tuyến. "A component responsible for handling HTTP requests in application" là mô tả của servlet, thứ nhận và trả lời yêu cầu HTTP, còn listener không nằm trên đường đi của một yêu cầu cụ thể. "A mechanism for managing database connections" sai vì việc quản lý kết nối thuộc về nguồn dữ liệu và pool; listener nhiều lắm chỉ là nơi khởi tạo chúng lúc ứng dụng bật, bản thân nó không phải cơ chế quản lý. "A tool for compressing and decompressing web resources" sai vì nén hay giải nén nội dung trả về là việc của filter hoặc của cấu hình máy chủ.
Mở trang câu hỏi này →
A${myList[0]}
B${myList.getFirst()}
C${myList.first}
D${myList.getFirst}
Lời giải

Đáp án đúng: "${myList[0]}". Cách duy nhất EL định nghĩa để lấy phần tử theo vị trí là toán tử ngoặc vuông kèm chỉ số, nên biểu thức này trả về phần tử đầu của danh sách; EL còn tự ép chuỗi số viết trong ngoặc về số nguyên khi tập là danh sách hay mảng. "${

Lời giải
myList.getFirst()
}
"

dựa vào việc gọi một phương thức mang tên đó trên danh sách, trong khi thứ cần ở đây là chỉ số, và danh sách dùng trong JSP không được lấy phần tử đầu theo kiểu gọi phương thức như vậy. "${myList.first}" dùng dấu chấm nên EL hiểu là đọc một thuộc tính tên first theo quy ước bean, tức đi tìm phương thức đọc tương ứng; danh sách không có thuộc tính như thế nên biểu thức báo không tìm thấy thuộc tính. "${myList.getFirst}" còn xa hơn: viết sau dấu chấm nên nó bị hiểu là tên một thuộc tính bắt đầu bằng get, EL sẽ tìm phương thức đọc của chính thuộc tính ấy và cũng không có.

Mở trang câu hỏi này →
ABy using the dot operator directly on the collection
BBy iterating over the collection using a loop in EL
CBy accessing elements using square brackets with the index
DBy converting the collection to a string and then accessing elements
Lời giải
Đáp án đúng: "By accessing elements using square brackets with the index". EL quy định toán tử ngoặc vuông là cách lấy phần tử của một tập có thứ tự hay của một map: viết tên biến rồi ngoặc vuông kèm chỉ số thì EL lấy phần tử ở vị trí đó của danh sách hoặc mảng, còn kèm một chuỗi khoá thì nó tra map; chỉ số có thể là biểu thức nên dùng được ngay trong biến đếm của thẻ lặp. "By using the dot operator directly on the collection" sai với tập có chỉ số vì dấu chấm được hiểu là đọc thuộc tính theo quy ước bean, nó đi tìm phương thức đọc mang tên đứng sau dấu chấm chứ không nhận một số làm vị trí. "By iterating over the collection using a loop in EL" sai vì EL là ngôn ngữ biểu thức, nó không có câu lệnh lặp; việc duyệt tập phải nhờ thẻ lặp của thư viện thẻ chuẩn hoặc vòng lặp trong mã Java. "By converting the collection to a string and then accessing elements" sai vì đổi tập thành chuỗi chỉ cho ra phần mô tả văn bản của đối tượng, mất luôn khả năng lấy đúng phần tử và sai cả kiểu dữ liệu trả về.
Mở trang câu hỏi này →