Xem Nhiều 2/2023 #️ Sự Khác Nhau Giữa Linkedlist Và Arraylist Trong Java? # Top 10 Trend | Sansangdethanhcong.com

Xem Nhiều 2/2023 # Sự Khác Nhau Giữa Linkedlist Và Arraylist Trong Java? # Top 10 Trend

Cập nhật thông tin chi tiết về Sự Khác Nhau Giữa Linkedlist Và Arraylist Trong Java? mới nhất trên website Sansangdethanhcong.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất.

ArrayList và LinkedList là 2 implementations phổ biến nhất của interface List. Chúng đều là một phần của Java Collections Framework. Bài viết này sẽ nói về các điểm giống và khác nhau của 2 lớp này.

1. Điểm chung giữa ArrayList và LinkedList

Trước khi đi vào so sánh sự khác nhau giữa ArrayList và LinkedList, chúng ta sẽ cùng xem xét điểm giống nhau giữa 2 lớp này:

Cả ArrayList và LinkedList đều implements từ interface List.

Cả ArrayList và LinkedList đều cho phép các giá trị trùng lặp và null.

Cả ArrayList và LinkedList đều duy trì thứ tự insertion các phần tử. Tức là, phần tử đầu tiên sẽ được thêm vào vị trí đầu tiên.

Cả ArrayList và LinkedList đều không thread-safe. Tức là, bạn không thể share chúng giữa nhiều luồng (thread) mà không được đồng bộ hóa.

2. Sự khác nhau giữa ArrayList và LinkedList

Khác nhau về cấu trúc dữ liệu cơ sở: ArrayList dựa trên cấu trúc dữ liệu Array (mảng), trong khi LinkedList dựa trên cấu trúc dữ liệu Doubly Linked List (danh sách liên kết đôi). Điều này dẫn đến sự khác biệt về performance giữa 2 thằng.

LinkedList cài đặt interface Deque: Ngoài việc implements interface List, thì LinkedList còn implements interface Deque, điều này giúp LinkedList có thể được cài đặt như một queue (hàng đợi) và có thêm nhiều tính năng hơn ArrayList.

Về bộ nhớ tiêu thụ: LinkedList tiêu thụ nhiều bộ nhớ hơn ArrayList. Vì mỗi phần tử của nó cần lưu trữ các tham chiếu tới các phần tử trước và sau.

Thời gian để duyệt phần tử: Chỉ mất thời gian O(1) để truy cập 1 phần tử trong ArrayList. Nhưng phải mất thời gian O(n) để truy cập 1 phần tử trong LinkedList.

Việc thêm/xóa phần tử: Việc thêm hoặc xóa phần tử trong ArrayList thì chậm hơn trong LinkedList. Điều này bởi vì các phần tử trong ArrayList cần phải dịch chuyển nếu có một phần tử mới được thêm vào giữa ArrayList. ArrayList cũng có thể phải thay đổi kích thước để chứa phần tử mới. Tương tự với trường hợp xóa bỏ phần tử khỏi ArrayList.

Arraylist Và Linkedlist Trong Java

Với ArrayList số lượng phần tử có thể cắt giảm hay mở rộng là tùy thuộc yêu cầu sử dụng, sử dụng LinkedList khi cần làm việc với lượng phần tử lớn

ArrayList

Mảng cơ bản trong Java là cố định về số phần tử, nghĩa là sau khai báo chúng không thể mở rộng, hay cắt bớt số phần tử. Nếu muốn có thêm chức năng này thì dùng ArrayList trong package java.util

import java.util.ArrayList; ArrayList colors = new ArrayList();

Bạn cũng có thể khai báo chi ngay ra kiểu các phần tử mảng này lưu trữ

ArrayList colors = new ArrayList(10);

Nên nhớ ArrayList lưu giữ các phần tử là đối tượng, nên các kiểu nguyên thủy int, double, float … không dùng được. Thay vào đó hãy dùng các lớp tương ứng như Integer, Double, Float …

Một số phương thức ArrayList

add(Object o) thêm phần tử vào cuối

add(int index, Object element) chèn phần tử vào vị trí index

remove(int index) xóa phần tử có chỉ số index

clear() xóa mọi phần tử

contains(Object o) kiểm tra mảng có chứa phần tử

get(int index) lấy phần tủ có chỉ số index

indexOf(Object o) lấy chỉ số trong mảng của phần tử

size() lấy số phần tử

toArray() chuyển thành mảng

import java.util.ArrayList; public class MyClass { public static void main(String[ ] args) { colors.add("Red"); colors.add("Blue"); colors.add("Green"); colors.add("Orange"); colors.remove("Green"); colors.add("Pink"); colors.add("Yellow"); System.out.println(colors.get(1)); System.out.println(colors.contains("Orange")); System.out.println(colors.size()); System.out.println(colors); } } /* Output : Blue true 5 [Red,Blue,Orange,Pink,Yellow] */

LinkedList

LinkedList có cú pháp, khai báo rất giống với ArrayList, bạn dễ dàng đổi từ ArrayList sang LinkedList bằng cách thay kiểu đối tượng.

Điều khác biết giữa LinkedList và ArrayList là cách chúng lưu trữ dữ liệu. ArrayList tốt để lưu trữ và truy cập dữ liệu, nó gần giống với mảng thông thường. LinkedList thì tốt để tương quản lý dữ liệu, như chèn và xóa một lượng lớn phần tử.

import java.util.LinkedList; public class MyClass { public static void main(String[ ] args) { c.add("Red"); c.add("Blue"); c.add("Green"); c.add("Orange"); c.remove("Green"); for(String s: c) { System.out.println(s); } System .out.println ("*******************************************"); for(int i=0;i

ArrayList khi bạn cần truy cập nhanh dữ liệu

LinkedList khi cần làm việc với việc chèn / xóa lượng lớn phần tử

ArrayListLinkedListĐĂNG KÝ KÊNH, XEM CÁC VIDEO TRÊN XUANTHULAB

Sự Khác Nhau Giữa Abstract Class Và Interface Trong Java

Ở những bài trước, chúng ta đã biết đến tính trừu tượng, và đi song song đó là abstract class và interface để triển khai tính trừu tượng trong java.

Chúng ta cùng xem thử nó sẽ khác nhau ở điểm nào qua bảng liệt kê sau

1

Abstract class chỉ có thể thừa kế một class hoặc một abstract class khác.

Interface có thể thừa kế một hoặc nhiều interface khác.

2

Abstract class có thể chứa abstract method và method thông thường(method có thân hàm).

Interface chỉ có abstract method.

3

Abstract class có thể chứa protected hoặc public abstract method.

Interface chỉ có public abstract method.

4

Abstract class có thể chứa static, final hoặc static final biến.

Interface chỉ có public static final biến.

Abstract class chỉ có thể thừa kế một class hoặc một abstract class khác

public class Example1{ public void display1(){ System.out.println("method ex1"); } } public abstract class Example2 extends Example1{ abstract void display2(); } public class Example3 extends Example2{ public void display3(){ System.out.println("method ex3"); } } public class Main{ public static void main(String args[]){ Example3 obj=new Example3(); obj.display3(); } }

Output: method ex3

Interface có thể thừa kế một hoặc nhiều interface khác

public interface Example1{ public void display1(); } public interface Example2 { public void display2(); } public interface Example3 extends Example1,Example2{} public class Example4 implements Example3{ public void display1(){ System.out.println("method ex1"); } public void display2(){ System.out.println("method ex2"); } } public class Main{ public static void main(String args[]){ Example4 obj=new Example4(); obj.display1(); obj.display2(); } }

Output:

method ex1

method ex2

Abstract class có thể chứa abstract method và method thông thường(method có thân hàm)

public abstract class Example1 { abstract void display1(); public void display2(){ System.out.println("method" ex2); } } public class Example2 extends Example1{ public void display1(){ System.out.println("method ex1"); } } public class Main { public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); } }

Output:

method ex1

method ex2

Interface chỉ có abstract method

public interface Example1{ public abstract void display(); } public class Example2 implements Example1{ public void display(){ System.out.println("method dispaly="); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display(); } }

Output: display

Abstract class có thể chứa protected hoặc public abstract method

public abstract class Example1{ protected abstract void display1(); public abstract void display2(); public abstract void display3(); } class Example2 extends Example1{ public void display1(){ System.out.println("method ex1"); } public void display2(){ System.out.println("method ex2"); } public void display3(){ System.out.println("method ex3"); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); obj.display3(); } }

Output:

method ex1

method ex2

method ex3

Interface chỉ có public abstract method

public interface Example1{ void display1(); } public class Example2 implements Example1{ public void display1(){ System.out.println("method ex1"); } public void display2(){ System.out.println("method ex2"); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); } }

Output:

method ex1

method ex2

Abstract class có thể chứa static, final hoặc static final biến

public abstract class Example1{ private int num_1 = 1; protected final int num_2 = 2; public static final int num_ 3 = 3; public void display1(){ System.out.println("Num1="+num_1); } } public Example2 extends Example1{ public void display2(){ System.out.println("Num2="+num_2); System.out.println("Num3="+num_3); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); } }

Output:

1

2

3

Interface chỉ có public static final biến

public interface Example1{ int num_1=10; } public class Example2 implements Example1{ public void display1(){ System.out.println("Num1="+num_1); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); } }

Output: 10

Note:

Interface thường được dùng để mô tả một tập các chức năng. Một class thừa kế một interface A, ta nói rằng class đó có thể thực hiện các năng của interface A khai báo, mà chưa cần xem code.

Ví dụ: Chúng ta có Mail là một interface và MailImpl implements Mail

public class MailImpl implements Mail

Chúng ta sẽ hiểu rằng class MailImpl sẽ có thể thực hiện được các chứng năng mà Mail khai báo.

Abstract class thường được dùng trong mối quan hệ thừa kế, vì tính linh hoạt của nó có thể chứa abstract method và method thông thường. Dựa vào đó mà chúng ta có thể định nghĩa các khuôn mẫu hay triển khai những thuộc tính, method mà các class con có thể dùng chung.

Sự Khác Nhau Giữa Var, Let Và Const Trong Javascript

Với việc ra mắt ES6, hai từ khóa khá quan trọng trong JavaScript cũng được giới thiệu là let và const. Trước khi ra đời ES6, cách duy nhất để khai báo một biến trong JavaScript là sử dụng var. Nhưng sự khác biệt giữa var, let và const là gì? Và khi nào chúng ta sử dụng cho phạm vi nào?

1. Var

Như bạn có thể biết, cách thức cũ để khai báo một biến trong JavaScript là sử dụng từ khóa var.

var name = "NhiTT"; console.log(name);

Khi bạn log biến name trong console, đầu ra rõ ràng sẽ là NhiTT . Biến name hiện tại là biến có phạm vi global. Sẽ thú vị hơn khi chúng ta thêm một hàm.

function setup() { var name = "Benjamin"; } setup(); console.log(name);

Có thể sử dụng các biến có phạm vi toàn cầu bên trong một hàm. Điều này có nghĩa là biến age có thể được sử dụng bên trong hàm setup. Điều này sẽ in ra “NhiTT 16 tủi” trong console.

var age = 16; function setup() { var name = "NhiTT"; console.log(name + age + " tủi"); } setup();

Bạn chỉ có thể truy cập các biến có cùng phạm vi hoặc phạm vi cao hơn. Vì vậy, trong một chức năng, bạn có thể truy cập phạm vi toàn cầu. Nhưng, trên toàn cầu, bạn không thể truy cập vào một biến chỉ được tạo trong một hàm.

var age = 16; function setup() { var name = "Benjamin"; age = 15; } setup(); console.log(age);

Nó trở nên khó khăn hơn khi var được sử dụng trong một vòng lặp for hoặc trong một câu lệnh if. Vòng lặp for hoặc lệnh if sẽ không tạo ra các biến của riêng chúng.

Điều này có nghĩa là biến có thể truy cập rộng rãi hơn vòng lặp hoặc câu lệnh mà chúng được tạo. Trong ví dụ bên dưới, biến i có phạm vi toàn cục. Điều này sẽ in ra 10 trong console.

for (var i = 1; i <= 10; i++) {

2. Let

Let sử dụng phạm vi khối và không phạm vi từ vựng. Điều này có nghĩa là let không quan tâm đến toàn cầu hoặc cục bộ hoặc liệu bạn có ở trong một hàm hay không. Thay vào đó, let quan tâm đến khối bạn đang ở. Một khối về cơ bản là bất cứ thứ gì có dấu ngoặc nhọn. Đây có thể là một hàm, nhưng cũng là một vòng lặp for v hoặc một câu lệnh if.

let i = 5; for (let i = 1; i <= 10; i++) {

Trong ví dụ trên, biến i không được cập nhật trong phạm vi toàn cầu; do đó đầu ra sẽ là 5.

Let hữu ích khi bạn muốn có một biến trong phạm vi của nó. Có thể truy cập các biến từ một khối cao hơn, giống như var có thể truy cập các biến từ phạm vi cao hơn.

3. Const

Const hoạt động gần giống như let. Tuy nhiên, sự khác biệt duy nhất là một khi bạn đã gán một giá trị cho một biến const, bạn không thể gán lại nó cho một giá trị mới. Giống như từ khóa implies.

for (const i = 1; i <= 10; i++) {

Ví dụ trên sẽ đưa ra một lỗi cho bạn biết rằng bạn đang cố gán giá trị mới cho 1 const.

Const là hữu dụng với bất cứ khi nào bạn biết rằng bạn có một biến mà bạn sẽ cố định. Và bây giờ bạn tự hỏi, tại sao chúng ta lại lưu trữ một giá trị trong một biến có giá trị không thay đổi?

Một phần của điều đó là đúng. Mặt khác, bạn có thể sử dụng nếu để dễ đọc. Bạn có thể chọn hard code một số giá trị trong code của mình ở nhiều nơi, nhưng sử dụng một biến const làm cho mã của bạn dễ bảo trì hơn. Bất cứ khi nào giá trị mã hóa thay đổi, bạn chỉ phải thay đổi biến const, thay vì đi qua toàn bộ mã tìm kiếm giá trị mã hóa cứng đó.

const username = document.querySelect('input[name="username"]').value;

Điều tương tự áp dụng cho ví dụ tiếp theo. Bất cứ khi nào bạn đang xử lý các đối tượng lớn, bạn cũng có thể sử dụng const để cải thiện khả năng đọc.

const books = api.data.sources['library'].books;

Sử dụng const có thể giúp làm cho code sau này của bạn rõ ràng hơn. Điều này đặc biệt hữu ích khi bạn làm việc trong một nhóm. Nếu ai đó nhìn thấy một mã const, người đó biết rằng giá trị có lẽ không nên thay đổi.

4. Ngoại lệ: Sự kết hợp của const và các đối tượng

Các declaration const tạo ra một tham chiếu chỉ đọc đến một giá trị. Điều đó không có nghĩa là giá trị mà nó giữ là bất biến, chỉ là định danh biến không thể được gán lại.

Điều này có nghĩa là không thể thực hiện được những điều sau vì chúng tôi cố gắng gán lại cho tên người dùng cho biến const.

const user = { 'name': 'NhiTT'}; user = { 'name': 'Truong Thi Nhi'}; console.log(user);

Nhưng có thể thay đổi các thuộc tính của đối tượng này. Điều này là do giá trị mà một const nắm giữ không phải là bất biến.

const user = { 'name': 'NhiTT'};

5. Khi nào nên sử dụng loại biến nào?

Tôi nghĩ một trong những lý do duy nhất mà bạn nên sử dụng var là khi bạn làm việc trên một base code không hỗ trợ ES6.

Nói chung, let tốt hơn là var vì nó làm giảm phạm vi. Trong hầu hết các trường hợp, bạn sẽ có thể biến tất cả các câu lệnh var thành câu lệnh let mà không có bất kỳ thay đổi ngữ nghĩa nào.

Const được đánh giá là tốt hơn so với let. Từ góc độ kỹ thuật, const không bao giờ là bắt buộc. Mỗi const có thể được thay thế bằng một biến let, nhưng sử dụng const có thể làm cho mã sạch hơn. Trừ khi bạn cần thay đổi giá trị, hãy sử dụng const. Nó bao gồm tất cả lợi ích khi sử dụng let cùng với việc giảm sự hiện diện của các biến chưa được khởi tạo và làm cho mã dễ đọc và thiện cảm hơn. Nếu bạn không chắc chắn liệu mình có cần thay đổi giá trị hay không, hãy biến nó thành một const cho đến khi bạn cần thay đổi nó.

source:

https://medium.com/better-programming/javascript-variables-the-difference-between-var-let-and-const-10efef5d2728

Bạn đang xem bài viết Sự Khác Nhau Giữa Linkedlist Và Arraylist Trong Java? trên website Sansangdethanhcong.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!