Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Wednesday, April 23, 2014

Đặc điểm của Vector, ArrayList trong Java


ArrayList và Vector trong java

Các lớp Vector và ArrayList được triển khai xây dựng dựa trên mảng Object[] dùng để lưu trữ các phần tử. Việc truy xuất đến các phần tử cũng đơn giản thông qua việc truy xuất theo chỉ mục(index) như trong mảng.

Đặc điểm của Vector và ArrayList là chúng ta có thể thêm những phần tử mới vào mà không gặp trở ngại về “sức chứa” như Array thông thường là phải định rõ độ lớn(chiều dài) của mảng.

Vậy, chúng “giãn nở” như thế nào ? Như đã nói ở trên Vector & ArrayList được xây dựng dựa trên mảng các Object[]. Mảng này có thể lớn hơn độ lớn các phần tử cấu thành lên Vector/ArrayList object nhằm giữ khả năng có thể thêm phần tử mới khi cần. Khi tận dụng hết khả năng sức chứa của mảng này thì Vector/ArrayList object phải tạo ra một mảng mới có độ lớn (sức chứa) hơn mảng cũ và những phần tử trước đó sẽ được sao chép chuyển sang mảng mới này. Về độ lớn của mảng mới tạo ra so với mảng cũ sẽ tùy thuộc vào các version SDK mà dao động trong khoảng 50 – 100 (%). 2 đoạn code dưới đây là một minh chứng :
public void ensureCapacity(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3) / 2 + 1;
        if (newCapacity < minCapacity) newCapacity = minCapacity;
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

public void ensureCapacity(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = Math.max(oldCapacity * 2, minCapacity);
        elementData = new Object[newCapacity];
        System.arrayscopy(oldData, 0, elementData, 0, size);
    }
}


Tính hiệu quả khi chèn phần tử mới vào Vector & ArrayList :
- Chèn vào vị trí index = 0 sẽ cho tính hiệu quả kém nhất (the worst performance) vì tất cả những phần tử trước đó sẽ phải dịch chuyển lên trên.
- Chèn vào vị trí sau phần tử đứng cuối cùng sẽ cho hiệu quả tốt nhât (the best performance) vì các phần tử trước đó vẫn giữ nguyên vị trí không có một sự xáo trộn nào xảy ra.
- Từ đây ta cũng có thể hiển được tính hiệu quả khi chèn vào vị trí bất kì nào khác 2 vị trí trên.


Điểm khác biệt chính giữa Vector và ArrayList là sử dụng cơ chế đồng bộ (synchronization). Ngoài 2 methods sử dụng serialize thì ArrayList không có một methods nào được đồng bộ hóa. Ngược lại với Vector, hầu hết các phương thức (method) của Vector được đồng bộ hóa. Vì thế Vector là thread-safe còn ArrayList thì không. Trong những ứng dụng đa luồng thì việc sử dụng Vector là hợp lý hơn vì tính đồng bộ của nó thích hợp cho việc giải quyết nhiều tương tác trong một thời điểm. Còn các phương thức của ArrayList sẽ cho tốc độ xử lý nhanh hơn trong trường hợp đơn giản không đòi hỏi xử lý nhiều tương tác trong một thời điểm. Sự cách biệt về tốc độ xử lý giữa 2 class này càng ngày càng được thu hẹp lại với những version JVMs (máy ảo Java) mới nhất.
(Sưu tầm)

Tuesday, January 7, 2014

Khái niệm về RMI trong Java

Lập trình đối tượng phân tán là một trong những vấn đề nóng bỗng của công nghệ phân tán phần mềm ngày nay. Java là ngôn ngữ đi tiên phong với RMI (Remote Method Invocation) – một kĩ thuật cài đặt các đối tượng phân tán vô cùng hiệu quả và linh động.
Thông thường các chương trình của chúng ta được viết dưới dạng thủ tục hoặc hàm và việc các hàm gọi lẫn nhau, truyền tham số hay kết quả cho nhau chỉ xảy ra ở máy cục bộ. Kỷ thuật RMI (Remote Method Invoke) – mang ý nghĩa triệu gọi phương thức từ xa – là cách thức giao tiếp giữa các đối tượng trong Java có mã lệnh cài đặt nằm trên các máy khác nhau có thể triệu gọi lẫn nhau.
rmi 1 [Java] Khái niệm về RMI trong Java
Để giải quyết một số vấn đề trong việc truyền thông giữa Client/Server. RMI không gọi trực tiếp mà thông qua lớp trung gian. Lớp này tồn tại ở cả hai phía Client và Server. Lớp ở máy Client gọi là Stub, lớp ở máy Server gọi là Skel (Skeletion).

CÁC ĐẶT TÍNH CỦA RMI

- RMI là mô hình đối tượng phân tán của Java, nó giúp cho việc truyền thông giữa các đối tượng phân tán được dễ dàng hơn.
- RMI là API bậc cao được xây dựng dựa trên lập trình Socket.
- RMI không những cho phép chúng ta truyền dữ liệu giữa các đối tượng trên các hệ thống máy tính khác nhau, mà còn triệu gọi các phương thức trong các đối tượng ở xa (Remote Object).
- Việc truyền dữ liệu giữa các máy khác nhau được xử lý một cách trong suốt bởi máy ảo Java (Java virtual machine).
- Tương tự như mô hình Client/Server, RMI vẫn lấy/duy trì khái niệm của Client và Server, tuy nhiên cách tiếp cận (approach) của RMI linh hoạt hơn, mềm dẻo hơn so với môt hình Client/Server.
- Một điều thuận lợi quan trong nhất của RMI là nó cung cấp cớ chế callbacks, nó cho phép Server triệu gọi các phương thức ở Client.

KIẾN TRÚC CƠ BẢN CỦA RMI

Remote interface: Nên extend từ java.rmi.remote.Nó khai báo tất cả các phương thức mà Client có thể triệu gọi. Tất cả các method trong interface này nên throw RemoteException
Remote implementation: Được thực thi từ Remote interface và mở rộng từ UnicastRemoteObject. Triển khai các method được khai báo trong Interface tại đây. Nó là một Remote Object thực sự. Phát sinh hai lớp trung gian Stub và Skel.
 Server class bao gồm:
- RMI registry: Bộ đăng kí này sẽ đăng kí một Remote object với Naming Registry. Giúp các Remote object được chấp nhận khi gọi các method từ xa.
- Các class thực thi trên server.
Client class: Truy vấn trên tên Remote object trên RMI registry, thông qua stub để gọi các phương thức trên server.
cach hoat dong cua rmi [Java] Khái niệm về RMI trong Java

CÁCH LÀM VIỆC CỦA RMI

- Các Đối tượng ở phía Server đăng kí với bộ đăng kí RMI registry.
- Client kiểm tra các đối tượng ở xa trong RMI Registry.
- Vị trí của một đối tượng ở xa được xác định trong RMI Registry. Một stub được trả về cho Client.
- Remote object có thể được sử dụng tương tự như Local object để truy xuất đến toàn bộ tài nguyên. Việc truyền thông giữa Client và Server được xử lý bởi Stub và Skel.
Tìm hiểu thêm về RMI tại Overview of RMI

Tuesday, December 10, 2013

Hiển thị ngày giờ hiện tại trong Java

1. Date() + SimpleDateFormat()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

2. Calender() + SimpleDateFormat()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

Saturday, October 5, 2013

Đa luồng trong java sử dụng Thread

Tạo 2 luồng, luồng T1 sinh ra 1 số nguyên ngẫu nhiên sau 1s, luồng T2 lấy số đó nhân với 20, không sử dụng sync


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package threadx2;
import java.util.Random;
/**
 *
 * @author Cuong
 */
public class EThread {
    private static int num;
    private static Random rd;
    public static void delay(int miliseconds) {
        try {
            Thread.sleep(miliseconds);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    // thread1 lay 1 so ngau nhien sau 1s
    static class Thread1 extends Thread {
        public void run() {
            rd = new Random();
            while (true) {
                num = rd.nextInt(100);
                System.out.println("T1: " + num);
                delay(1000);
            }
        }
    }
    // thread2 lay so num*20
    static class Thread2 extends Thread {
        public void run() {
            while (true) {
                System.out.println("T2: " + num + "*20=" + (num * 20));
                delay(1000);
            }
        }
    }
    public static void main(String[] args) {
        Thread1 th1 = new Thread1();
        Thread2 th2 = new Thread2();
        th1.start();
        th2.start();
    }
}