Kinh Nghiệm Hướng dẫn So sánh Array và LinkedList Mới Nhất

Quý khách đang tìm kiếm từ khóa So sánh Array và LinkedList được Update vào lúc : 2022-03-07 14:19:20 . Với phương châm chia sẻ Bí kíp Hướng dẫn trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi đọc Post vẫn ko hiểu thì hoàn toàn có thể lại phản hồi ở cuối bài để Tác giả lý giải và hướng dẫn lại nha.

ArrayList và LinkedList là 2 implementation nổi tiếng của List interface, chúng được sinh ra với những mục tiêu sử dụng rất khác nhau mà trong nội dung bài viết này toàn bộ chúng ta sẽ cùng nhau tìm hiểu.

Nội dung chính

    Thêm phần tửTruy cập theo indexXoá  thành phần tại vị trí indexỨng dụng và hạn chếThêm phần tửTruy cập theo indexXoá thành phần tại vị trí indexỨng dụngVideo liên quan

ArrayList

Nội bộ bên trong ArrayList sử dụng một array để triển khai List interface. Vì array có kích thước cố định và thắt chặt nên ArrayList sẽ tại một array với kích thước cố định và thắt chặt ban đầu. Trong quy trình sử dụng nếu số lượng thành phần cần phải lưu vượt quá kích thước của array thì nó sẽ tạo một array mới với kích thước to nhiều hơn để tàng trữ.

Thêm thành phần

Khi toàn bộ chúng ta khởi tạo một ArrayList rỗng, nó sẽ tạo một array nội bộ bên trong (gọi là backing array) với kích thước mặc định là 10.

Khi thêm một thành phần vào ArrayList mảng backing array vẫn còn đấy chỗ tiềm ẩn thì cung việc đơn thuần và giản dị chỉ là thêm nó vào vị trí tiếp theo liền kề vị trí ở đầu cuối được thêm vào backing array.

backingArray[size] = newItem;
size++;

Vì vậy trong trường hợp tốt nhất và trung bình thì time complexity là O(1). khá nhanh. Tuy nhiên, khi backing array trở nên nên đầy thì việc thêm thành phần trở nên phức tạp hơn.

Để thêm một thành phần mới, toàn bộ chúng ta cần khởi tạo một backing array mới với dung tích to nhiều hơn, tiếp theo đó sao chép toàn bộ thành phần từ backing array cũ sang backing array mới. Cuối cùng là thêm thành phần mới vào backing array mới. Vì thế trong trường hợp này việc thêm thành phần có time complexity là O(n).

Truy cập theo index

Việc truy xuất những thành phần theo index trong ArrayList là một điều tuyệt vời, toàn bộ chúng ta chỉ tốn O(1) để lấy một thành phần tại vị trí index được chỉ định.

Xoá  thành phần tại vị trí index

Giả sử toàn bộ chúng ta muốn xoá thành phần tại vị trí index 6 ra khởi ArrayList. Quá trình này sẽ trình làng như hình phía dưới.

Sau khi xoá thành phần tại vị trí index 6, toàn bộ chúng ta phải du chuyển những thành phần ngay tiếp theo đó về phía bên trái một cty.Vì vậy, time complexity là O(1) ở trường hợp tốt nhất và O(n) ở tại mức trung bình và trường hợp xấu nhất.

Ứng dụng và hạn chế

hông thường, ArrayList là lựa chọn mặc định cho nhiều nhà tăng trưởng khi họ cần List implementation. Thực tế thì nó sẽ là một lựa chọn tốt khi những hoạt động và sinh hoạt giải trí sinh hoạt đọc tài liệu trình làng nhiều hơn nữa số lần ghi.

Đôi khi toàn bộ chúng ta cần đọc và ghi thường xuyên như nhau. Nếu toàn bộ chúng ta có ước tính về số lượng thành phần tối đa hoàn toàn có thể, thì việc sử dụng ArrayList vẫn vẫn đang còn ý nghĩa. Nếu đúng như vậy, toàn bộ chúng ta hoàn toàn có thể khởi tạo ArrayList với dung tích ban đầu:

int possibleUpperBound = 10_000;
List items = new ArrayList(possibleUpperBound);

Việc này sẽ hỗ trợ toàn bộ chúng ta giảm thiểu tối đa việc phải phân loại lại array khi kích thước của nó không hề đủ để tàng trữ.

Ngoài ra, array được đánh chỉ mục với giá trị kiểu int trong Java, vì vậy số lượng thành phần tối đa được tàng trữ bên trong ArrayList không vượt quá 2^32.

LinkedList

LinkedList, như tên thường gọi thì nó sử dụng những node link để tàng trữ và truy xuất những thành phần. Ví dụ

Mỗi node chứa 2 con trỏ, trỏ đến thành phần liền trước và liền sau nó, cấu trúc tài liệu này còn được gọi là doubly linked.

Thêm thành phần

Để thêm một thành phần trong LinkedList, toàn bộ chúng ta chỉ việc trỏ last element đến thành phần được thêm mới.

Và tiếp theo đó update con trỏ last.

Trải qua 2 hoạt động và sinh hoạt giải trí trên, time complexity để thêm một thành phần trên Linkedlist luôn là O(1).

Truy cập theo index

Không in như ArrayList, để truy vấn một thành phần tại vị trí index toàn bộ chúng ta cần trải qua lần lượt từng thành phần trước đó đến khi đi đến được vị trí của thành phần cần truy xuất. Vì vậy trong trường hợp trung bình và xấu nhất thì time complexity là O(n).

Xoá thành phần tại vị trí index

Để xoá một thành phần trong Linkedlist, toàn bộ chúng ta cũng cần phải duyệt qua những thành phần cho tới lúc gặp được thành phần cần xoá và tiếp theo đó ngắt lên kết giữa node bị xoá với node trước và sau nó. Vì vậy trong trường hợp trung bình và xấu nhất thì time complexity là O(n).

Ứng dụng

LinkedList thích hợp hơn ArrayList khi những hoạt động và sinh hoạt giải trí sinh hoạt thêm thành phần xẩy ra thường xuyên hơn là đọc. Ngoài ra, nó hoàn toàn có thể được sử dụng trong những trường hợp việc đọc tài liệu hầu hết là đọc thành phần thứ nhất và ở đầu cuối.

Nguồn

://.baeldung/java-arraylist-linkedlist

Chiều 30 tết thời gian ở thời gian cuối năm, rảnh viết nốt bài để tiếp tết con Heo ?

Tiếp tục là một trong bài về so sánh những thứ trong Java, cái này thi thoảng cũng gặp khi phỏng vấn nhưng bài này mình yêu thích giúp những bạn hoàn toàn có thể làm rõ hơn về bản chất để sử dụng hợp lý hơn, đảm bảo hiệu năng tốt hơn.

Trước tiên mình yêu thích đề cập Array mô tả 1 cấu trúc tài liệu mảng cơ bản từ C/C++. Array được tàng trữ trong một dãy những ô nhớ liền nhau trong bộ nhớ và hoàn toàn có thể truy xuất trực tiếp đến từng thành phần thông qua số thứ tự (index) của thành phần trong mảng. Không có những tiện ích sẵn để add/get/remove… thành phần mà chỉ có thuộc tính length để lấy kích thước. Kích thước của Arraycố định và thắt chặt và buộc phải định nghĩa khi khai báo.

Còn ArrayList LinkedListVector, cả 3 cái này đều là class implement List, trong số đó List là một trong collection trong Java được thiết kế có khá đầy đủ những method cơ bản như get, add, remove, sort,… vì vậy ArrayList LinkedListVector implement lại List đều mang khá đầy đủ những tiện ích này từ List. List được tàng trữ dưới dạng những ô nhớ rải rác trong bộ nhớ trỏ đến nhau thông qua địa chỉ ô nhớ. Việc này nhằm mục đích tối ưu về bộ nhớ hoàn toàn có thể tận dụng những ô nhớ ở những vị trí rất khác nhau không nhất thiết phải liền nhau, nhưng lại gây ra việc không thể truy xuất trực tiếp đến 1 phần từ bất kỳ mà phải duyệt từ trên đầu List để tìm.

Tìm làm rõ ràng hơn.

LinkedList là class implement List và cũng mang khá đầy đủ tiện ích của List và được tương hỗ update thêm những tiện ích của Deque tối ưu cho những thao tác add/remove phần từ, hay những tiện ích của AbstractSequentialList giúp tối ưu khi duyệt thành phần bằng Iterator. Nhưng lại không được tối ưu cho việc truy xuất ngẫu nhiên qua số thứ tự thành phần nên ít khi được sử dụng. Kích thước list là động và được tăng mọi khi tương hỗ update thành phần.

ArrayList là class implement List, được mang thêm tiện ích của RandomAccess giúp tối ưu việc truy xuất ngẫu nhiên qua số thứ tự, nhưng lại không được implement Deque nên những thao tác add/remove không nhanh như LinkedList (mình sẽ có được ví dụ test performce rõ ràng ở dưới). Kích thước ArrayList là cố định và thắt chặt tại 1 thời gian, nhưng hoàn toàn có thể resize thêm 50% mọi khi đạt không số lượng giới hạn hiện tại nên hoàn toàn có thể xem là kích thước động.

Vector là class implement giống hệt ArrayList nên mang khá đầy đủ tiện ích như ArrayList có, và hơn thế nữa được xây dựng thêm những method thao tác thành phần như addElement setElement removeElement insertElement …. và đặc biệt quan trọng những method của Vector đều được setup synchronized nghĩa là safe nhưng fail-fast, bảo vệ an toàn và uy tín cho tài liệu khi sử dụng trong đa luồng nhưng lại gây chậm xử lý. Kích thước của Vector tương tự như ArrayList chỉ khác là sẽ tăng 100% mọi khi đạt không số lượng giới hạn hiện tại.

Các bạn hoàn toàn có thể đọc thêm docs của java hoặc đơn thuần và giản dị là decompile jdk hoặc đọc trong source nén của jdk để thấy rõ hơn về những sự giống và khác lạ này.

Tổng hợp lại dưới dạng bảng từ đó rút ra xem xét sử dụng cái nào trong từng trường hợp rõ ràng.

Array
ArrayList
LinkedList
Vector
Là mảng nguyên thủy, chỉ có thuộc tính length
Là class implement List, có những method tương hỗ get/add/remove/…
Kích thước cố định và thắt chặt
Tăng 50% kích thước khi đạt số lượng giới hạn
Kích thước động
Tăng 100% kích thước khi đạt số lượng giới hạn
Lưu kiểu tài liệu nguyên thủy và đối tượng người dùng
Chỉ lưu kiểu tài liệu đối tượng người dùng, từ Java 5 kiểu nguyên thủy được tự động hóa quy đổi thành đối tượng người dùng để tàng trữ (auto-boxing)
Tốc độ tàng trữ và truy xuất nhanh
Tốc độ truy xuất theo index nhanh
Tốc độ truy xuất theo index chậm
Tốc độ truy xuất theo index nhanh
Rất kém trong việc insert/remove thành phần ở giữa mảng
Tốc độ insert/remove thành phần trong mảng trung bình
Tốc độ insert/remove thành phần trong mảng nhanh
Tốc độ insert/remove thành phần trong mảng trung bình
Không tương hỗ synchronized, dễ mất tài liệu khi xử lý đa luồng nhưng nhanh
Không tương hỗ synchronized, dễ mất tài liệu khi xử lý đa luồng nhưng nhanh
Không tương hỗ synchronized, dễ mất tài liệu khi xử lý đa luồng nhưng nhanh
Hỗ trợ synchronized, bảo vệ an toàn và uy tín tài liệu khi xử lý đa luồng nhưng chậm
Thường dùng với những thao tác tương hỗ update vào thời điểm cuối mảng và truy xuất thông thường, sử dụng khi trách nhiệm đơn thuần và giản dị ít tăng cấp
Sử dụng để tàng trữ và truy xuất tài liệu cơ bản, ít khi thay đổi
Sử dụng khi cần thao tác thay đổi tài liệu nhiều, cho những trách nhiệm phức tạp
Sử dụng khi cần thao tác với nhiều luồng xử lý

Dưới đấy là những đoạn test performance khi thực thi add/get/remove trên Array/ArrayList/LinkedList để xem trực quan hơn về sự việc khác lạ. Các kết quả hoàn toàn có thể sẽ không còn đúng chuẩn như ví dụ với từng lần chạy nhưng về cơ bản vẫn vẫn đang còn độ chênh lệch hoàn toàn có thể nhìn thấy

package net.tunghuynh.listcollection;

import org.apache.log4j.Logger;

import java.util.*;

/**
* net.tunghuynh.listcollection.Main
* by Tùng Huynh
* 04/02/2022 13:12 AM
*/
public class Main
static Logger logger = Logger.getLogger(Main.class);
static int n = 100000;
public static void main(String[] args)
arrayListVsLinkedList();

public static void arrayListVsLinkedList()
Integer[] array = new Integer[n];
List arrayList = new ArrayList();
List linkedList = new LinkedList();

logger.info(“==== Add ====”);
long start = System.nanoTime();
for (int i = 0; i < n; i++)
array[i] = i;

logger.info("Array : " + (System.nanoTime() – start)/1000000.0 + " ms");

start = System.nanoTime();
for (int i = 0; i < n; i++)
arrayList.add(i);

logger.info("ArrayList : " + (System.nanoTime() – start)/1000000.0 + " ms");

start = System.nanoTime();
for (int i = 0; i < n; i++)
linkedList.add(i);

logger.info("LinkedList: " + (System.nanoTime() – start)/1000000.0 + " ms");

logger.info("==== Get ====");
start = System.nanoTime();
for (int i = 0; i < n; i++)
Integer x = array[i];

logger.info("Array loop index : " + (System.nanoTime() – start)/1000000.0 + " ms");

start = System.nanoTime();
for (int i = 0; i < n; i++)
arrayList.get(i);

logger.info("ArrayList loop index : " + (System.nanoTime() – start)/1000000.0 + " ms");

start = System.nanoTime();
for (int i = 0; i =0; i–)
arrayList.remove(i);

logger.info(“ArrayList : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

start = System.nanoTime();
for (int i = 9999; i >=0; i–)
linkedList.remove(i);

logger.info(“LinkedList: ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

package net.tunghuynh.listcollection;

import org.apache.log4j.Logger;

* net.tunghuynh.listcollection.Main

    static Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) {

    public static void arrayListVsLinkedList() {

        Integer[] array = new Integer[n];

        List arrayList = new ArrayList();

        List linkedList = new LinkedList();

        logger.info(“==== Add ====”);

        long start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“Array     : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“ArrayList : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“LinkedList: ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        logger.info(“==== Get ====”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“Array loop index         : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“ArrayList loop index     : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“LinkedList loop index    : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (Object item : arrayList) {

        logger.info(“ArrayList loop interator : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (Object item : linkedList) {

        logger.info(“LinkedList loop interator: ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        logger.info(“==== Remove ====”);

        start = System.nanoTime();

        for (int i = 9999; i >=0; i–) {

        logger.info(“ArrayList : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 9999; i >=0; i–) {

        logger.info(“LinkedList: ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

Kết quả

2022-02-04 14:01:45 INFO Main:38 – ==== Add ====
2022-02-04 14:01:45 INFO Main:40 – Array : 10.467533 ms
2022-02-04 14:01:45 INFO Main:44 – ArrayList : 31.468273 ms
2022-02-04 14:01:45 INFO Main:51 – LinkedList: 38.454655 ms
2022-02-04 14:01:45 INFO Main:53 – ==== Get ====
2022-02-04 14:01:45 INFO Main:59 – Array loop index : 1.231587 ms
2022-02-04 14:01:45 INFO Main:59 – ArrayList loop index : 6.705990 ms
2022-02-04 14:01:56 INFO Main:66 – LinkedList loop index : 11606.559760 ms
2022-02-04 14:01:56 INFO Main:73 – ArrayList loop interator : 9.608840 ms
2022-02-04 14:01:56 INFO Main:80 – LinkedList loop interator: 9.868294 ms
2022-02-04 14:01:56 INFO Main:82 – ==== Remove ====
2022-02-04 14:01:57 INFO Main:88 – ArrayList : 981.452304 ms
2022-02-04 14:01:57 INFO Main:95 – LinkedList: 364.362477 ms

2022-02-04 14:01:45 INFO  Main:38 – ==== Add ====

2022-02-04 14:01:45 INFO  Main:40 – Array     : 10.467533 ms

2022-02-04 14:01:45 INFO  Main:44 – ArrayList : 31.468273 ms

2022-02-04 14:01:45 INFO  Main:51 – LinkedList: 38.454655 ms

2022-02-04 14:01:45 INFO  Main:53 – ==== Get ====

2022-02-04 14:01:45 INFO  Main:59 – Array loop index         : 1.231587 ms

2022-02-04 14:01:45 INFO  Main:59 – ArrayList loop index     : 6.705990 ms

2022-02-04 14:01:56 INFO  Main:66 – LinkedList loop index    : 11606.559760 ms

2022-02-04 14:01:56 INFO  Main:73 – ArrayList loop interator : 9.608840 ms

2022-02-04 14:01:56 INFO  Main:80 – LinkedList loop interator: 9.868294 ms

2022-02-04 14:01:56 INFO  Main:82 – ==== Remove ====

2022-02-04 14:01:57 INFO  Main:88 – ArrayList : 981.452304 ms

2022-02-04 14:01:57 INFO  Main:95 – LinkedList: 364.362477 ms

Lưu ý, những bạn hoàn toàn có thể sửa những đoạn logger.infor thành System.out.println để test.

Ta hoàn toàn có thể thấy array nhanh hơn quá nhiều khi thêm và truy xuất thành phần, những bộ test sau đấy thì phải setup phương thức thủ công nên mình ko đưa Array vào. Ở phần test get 1 thành phần trong mảng bằng vòng lặp for index thì LinkedList quá chậm so với ArrayList vì mỗi lần gọi get(i) là phải duyệt từ trên đầu list theo từng con trỏ next để tìm kiếm được thứ tự thích hợp, độ phức tạp của get(i) LinkedList sẽ là O(n) trong lúc của ArrayList chỉ là O(1).

Còn với test method get(i) bằng iterator thì cả ArrayListLinkedList đều sử dụng con trỏ next implement từ List nên kết quả hoàn toàn có thể xem là tương tự nhau.

Đến phần test remove thành phần thì ArrayList yếu thế hơn vì mỗi lần remove thì RandomAccess phải sắp xếp lại index từ vị trí remove đến cuối để được chuỗi liên tục nên thời hạn xử lý tăng thêm, trong lúc LinkedList chỉ việc ngắt con trỏ tại ví trí remove để trỏ đến ô nhớ tiếp theo là hoàn tất.

Tiếp theo, ta thử so sánh performance giữa ArrayListVector trong trường hợp đơn luồng

package net.tunghuynh.listcollection;

import org.apache.log4j.Logger;

import java.util.*;

/**
* net.tunghuynh.listcollection.Main
* by Tùng Huynh
* 04/02/2022 13:12 AM
*/
public class Main
static Logger logger = Logger.getLogger(Main.class);
static int n = 100000;
public static void main(String[] args)
arrayListVsVectorSingle();

public static void arrayListVsVectorSingle()
List arrayList = new ArrayList();
Vector vector = new Vector();
logger.info(“==== Add ====”);
long start = System.nanoTime();
for (int i = 0; i < n; i++)
arrayList.add(i);

logger.info("ArrayList: " + (System.nanoTime() – start)/1000000.0 + " ms");

start = System.nanoTime();
for (int i = 0; i < n; i++)
vector.add(i);

logger.info("Vector : " + (System.nanoTime() – start)/1000000.0 + " ms");

logger.info("==== Get ====");
start = System.nanoTime();
for (int i = 0; i < n; i++)
arrayList.get(i);

logger.info("ArrayList: " + (System.nanoTime() – start)/1000000.0 + " ms");

start = System.nanoTime();
for (int i = 0; i < n; i++)
vector.get(i);

logger.info("Vector : " + (System.nanoTime() – start)/1000000.0 + " ms");

package net.tunghuynh.listcollection;

import org.apache.log4j.Logger;

* net.tunghuynh.listcollection.Main

    static Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) {

        arrayListVsVectorSingle();

    public static void arrayListVsVectorSingle(){

        List arrayList = new ArrayList();

        Vector vector = new Vector();

        logger.info(“==== Add ====”);

        long start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“ArrayList: ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“Vector   : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        logger.info(“==== Get ====”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“ArrayList: ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

        start = System.nanoTime();

        for (int i = 0; i < n; i++) {

        logger.info(“Vector   : ” + (System.nanoTime() – start)/1000000.0 + ” ms”);

Kết quả đã cho toàn bộ chúng ta biết vận tốc xử lý của toàn bộ hai tạm xem là tương tự nhau do Vector có setup giống với ArrayList. Có sai khác thì phần lớn là vì môi trường tự nhiên vạn vật thiên nhiên và thời gian test.

2022-02-04 14:08:24 INFO Main:21 – ==== Add ====
2022-02-04 14:08:24 INFO Main:27 – ArrayList: 48.413265 ms
2022-02-04 14:08:24 INFO Main:34 – Vector : 31.740043 ms
2022-02-04 14:08:24 INFO Main:36 – ==== Get ====
2022-02-04 14:08:24 INFO Main:42 – ArrayList: 21.322051 ms
2022-02-04 14:08:24 INFO Main:49 – Vector : 12.971482 ms

2022-02-04 14:08:24 INFO  Main:21 – ==== Add ====

2022-02-04 14:08:24 INFO  Main:27 – ArrayList: 48.413265 ms

2022-02-04 14:08:24 INFO  Main:34 – Vector   : 31.740043 ms

2022-02-04 14:08:24 INFO  Main:36 – ==== Get ====

2022-02-04 14:08:24 INFO  Main:42 – ArrayList: 21.322051 ms

2022-02-04 14:08:24 INFO  Main:49 – Vector   : 12.971482 ms

Nếu thử với trường hợp đa luồng thì sao nhỉ

package net.tunghuynh.listcollection;

import org.apache.log4j.Logger;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* net.tunghuynh.listcollection.MultiThread
* by Tùng Huynh
* 04/02/2022 11:55 AM
*/
public class MultiThread
static Logger logger = Logger.getLogger(MultiThread.class);
public static void main(String[] args)
List arrayList = new ArrayList();
List vector = new Vector();

ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++)
executorService.execute(new CalRunnable(arrayList));

shutdownAndAwaitTermination(executorService);
logger.info("ArrayList: " + CalRunnable.time/1000000.0 + " ms");

executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
CalRunnable.time = 0;
for (int i = 0; i < 10; i++)
executorService.execute(new CalRunnable(vector));

shutdownAndAwaitTermination(executorService);
logger.info("Vector : " + CalRunnable.time/1000000.0 + " ms");

static void shutdownAndAwaitTermination(ExecutorService pool)
pool.shutdown();
try
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
pool.shutdownNow();
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");

catch (Exception e)

class CalRunnable implements Runnable
static long time = 0;
List lst;
public CalRunnable(List lst)
this.lst = lst;

@Override
public void run()
long time = System.nanoTime();
for (int i = 0; i < 100000; i++)
lst.add(i);

CalRunnable.time += (System.nanoTime() – time);

package net.tunghuynh.listcollection;

import org.apache.log4j.Logger;

import java.util.ArrayList;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

* net.tunghuynh.listcollection.MultiThread

public class MultiThread {

    static Logger logger = Logger.getLogger(MultiThread.class);

    public static void main(String[] args) {

        List arrayList = new ArrayList();

        List vector = new Vector();

        ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

        for (int i = 0; i < 10; i++) {

            executorService.execute(new CalRunnable(arrayList));

        shutdownAndAwaitTermination(executorService);

        logger.info(“ArrayList: ” + CalRunnable.time/1000000.0 + ” ms”);

        executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

        for (int i = 0; i < 10; i++) {

            executorService.execute(new CalRunnable(vector));

        shutdownAndAwaitTermination(executorService);

        logger.info(“Vector   : ” + CalRunnable.time/1000000.0 + ” ms”);

    static void shutdownAndAwaitTermination(ExecutorService pool) {

            if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {

                if (!pool.awaitTermination(60, TimeUnit.SECONDS))

                    System.err.println(“Pool did not terminate”);

class CalRunnable implements Runnable {

    public CalRunnable(List lst){

        long time = System.nanoTime();

        for (int i = 0; i < 100000; i++) {

        CalRunnable.time += (System.nanoTime() – time);

Kết quả khi thực thi

Exception in thread “pool-1-thread-6” java.lang.ArrayIndexOutOfBoundsException: Index 310465 out of bounds for length 240097
java.base/java.util.ArrayList.add(ArrayList.java:486)
java.base/java.util.ArrayList.add(ArrayList.java:498)
net.tunghuynh.listcollection.CalRunnable.run(MultiThread.java:68)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
java.base/java.lang.Thread.run(Thread.java:835)
2022-02-04 14:51:13 INFO MultiThread:29 – ArrayList: 972.733492 ms
2022-02-04 14:51:13 INFO MultiThread:37 – Vector : 1914.403079 ms

Exception in thread “pool-1-thread-6” java.lang.ArrayIndexOutOfBoundsException: Index 310465 out of bounds for length 240097

java.base/java.util.ArrayList.add(ArrayList.java:486)

java.base/java.util.ArrayList.add(ArrayList.java:498)

net.tunghuynh.listcollection.CalRunnable.run(MultiThread.java:68)

java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)

java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)

java.base/java.lang.Thread.run(Thread.java:835)

2022-02-04 14:51:13 INFO  MultiThread:29 – ArrayList: 972.733492 ms

2022-02-04 14:51:13 INFO  MultiThread:37 – Vector   : 1914.403079 ms

Ta hoàn toàn có thể thấy Vector chậm hơn quá nhiều so với ArrayList nhưng ArrayList lại xẩy ra xung đột khi nhiều thread cùng truy xuất vào thành phần. Các bạn hoàn toàn có thể thử lại với add hoặc remove để biết thêm những trường hợp khác.

Qua bài này kỳ vọng những bạn hoàn toàn có thể làm rõ hơn bản chất của những thứ rất cơ bản nhưng không nhiều người để ý và hoàn toàn có thể ứng dụng hợp lý nhất cho những đoạn code của tớ tương hỗ cho khối mạng lưới hệ thống hoạt động và sinh hoạt giải trí trơn tru hiệu suất cao hơn ?

://.youtube/watch?v=zbOtd5tLZ2w

4362

Review So sánh Array và LinkedList ?

Bạn vừa Read Post Với Một số hướng dẫn một cách rõ ràng hơn về Video So sánh Array và LinkedList tiên tiến và phát triển nhất

Share Link Cập nhật So sánh Array và LinkedList miễn phí

Người Hùng đang tìm một số trong những Chia Sẻ Link Down So sánh Array và LinkedList Free.

Hỏi đáp vướng mắc về So sánh Array và LinkedList

Nếu sau khi đọc nội dung bài viết So sánh Array và LinkedList vẫn chưa hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Admin lý giải và hướng dẫn lại nha
#sánh #Array #và #LinkedList