Lớp Vector xuất hiện từ JDK 1, trước cả khi xuất hiện Collections Framework từ JDK 2. Lớp Vector có tính năng như ArrayList. Khác biệt ở chỗ các phương thức của Vector được đồng bộ hóa, còn ArrayList thì không.
Tiếp tục đọcTag Archives: Java
ArrayList – Lớp ArrayList trong Java
Lớp ArrayList trong Java được xây dựng dựa trên cấu trúc dữ liệu dạng Array (mảng). Lớp ArrayList được sử dụng rộng rãi vì các chức năng và tính linh hoạt của nó. Hầu hết các lập trình viên chọn ArrayList hơn là chọn Array vì nó là một sự thay thế rất tốt cho các mảng truyền thống trong Java. Lớp ArrayList sử dụng một mảng động, có thể thay đổi kích thước, để lưu trữ các phần tử. Nó là một phần của Java Collections Framework.
Tiếp tục đọcLinkedList – Lớp LinkedList trong Java
Lớp LinkedList trong Java được cài đặt theo dạng Doubly Linked List (Danh sách liên kết đôi). Nó thừa kế lớp AbstractSequentialList và implements hai interfaces List và Deque. Nó là một phần của Java Collections Framework.
Tiếp tục đọcStack – Lớp Stack trong Java
Collection framework trong Java cung cấp một lớp Stack để mô hình hóa cấu trúc dữ liệu Stack. Lớp này cũng vẫn hoạt động dựa theo cơ chế LIFO (Last In First Out). Tức là, phần tử nào được thêm vào đầu tiên thì sẽ được lấy ra sau cùng.
Tiếp tục đọcArray – Mảng trong Java
Trong Java, một mảng (array) là một tập hợp các phần tử có cùng kiểu dữ liệu. Nếu kiểu dữ liệu là kiểu nguyên thủy thì các phần tử có địa chỉ liên tiếp nhau trên bộ nhớ (memory). Nếu kiểu dữ liệu là dạng đối tượng của lớp, thì các đối tượng thực tế được lưu trữ trên bộ nhớ heap. Mảng có số phần tử cố định và bạn không thể thay đổi kích thước của nó.
Tiếp tục đọc[Java Concurrency] Giới thiệu Fork/Join Framework và ForkJoinPool trong Java
Fork/Join Framework được thêm vào từ Java 7. Nó cung cấp các công cụ để tăng tốc độ xử lý song song, giúp nâng cao performance cho ứng dụng bằng cách cố gắng tận dụng tất cả các processors có sẵn. Việc này được thực hiện thông qua cách tiếp cận divide and conquer. Trái tim của Fork/Join Framework là class ForkJoinPool, nó là một phần mở rộng của class AbstractExecutorService
, nó được cài đặt dựa trên giải thuật work-stealing.
[Java Concurrency] ExecutorService và ScheduledExecutorService trong Java
Trong các ứng dụng Java, việc tạo và quản lý một số lượng nhỏ các threads (luồng) thì không khó. Nhưng với một ứng dụng lớn, khi mà số lượng các threads phải tạo để chạy các task đồng thời có thể lên tới hàng chục, thậm chí hàng trăm threads thì lại là một vấn đề lớn. Vì vậy, tách biệt việc tạo và quản lý các threads ra khỏi phần còn lại của ứng dụng là việc nên làm. Bên cạnh đó việc tạo một thread sẽ phải trả giá về cả performance và memory. Vì vậy nó là một ý tưởng tốt nếu chúng ta có thể re-use các thread đã tạo.
Tiếp tục đọc[Java Concurrency] Thread Pools
Thread Pools là một giải pháp khi bạn cần giới hạn số lượng threads chạy trong ứng dụng của bạn tại một thời điểm. Nếu chúng ta không có sự giới hạn này, thì mỗi khi có thread mới được tạo và cấp phát bộ nhớ stack cho chúng thì sẽ có vấn đề về performance.
Tiếp tục đọc[Java Concurrency] Blocking Queues
Một blocking queue là một hàng đợi sẽ được khóa lại khi bạn lấy phần tử từ hàng đợi nhưng nó đang bị rỗng (dequeue), hoặc khi bạn đẩy thêm phần tử vào hàng đợi nhưng nó đã bị đầy (enqueue).
Nếu một luồng cố gắng lấy phần tử từ một hàng đợi đang trống rỗng nó sẽ bị blocked lại cho tới khi có một luồng nào đó đẩy thêm phần tử vào hàng đợi. Nếu một luồng cố gắng đẩy phần từ vào một hàng đợi đã đầy nó sẽ bị blocked lại cho tới khi có một luồng nào đó lấy bớt phần tử ra khỏi hàng đợi hoặc xóa hàng đợi.
Tiếp tục đọc[Java Concurrency] Daemon Thread trong Java
Java chia threads làm hai loại: một loại thông thường và Daemon Thread. Chúng chỉ khác nhau ở cách thức ngừng hoạt động. Trong một chương trình các luồng thông thường và luồng Daemon chạy song song với nhau. Khi tất cả các luồng thông thường kết thúc, JVM sẽ tìm tất cả các luồng Daemon đang chạy và ngừng tất cả luồng Daemon lại bất kể nó đang làm việc gì.
Tiếp tục đọc