GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Collection So sánh HashSet, LinkedHashSet và TreeSet trong Java

So sánh HashSet, LinkedHashSet và TreeSet trong Java

Đăng vào 16/11/2017 Được đăng bởi GP Coder 13054 Lượt xem

Trong các bài viết trước, tôi đã giới thiệu với các bạn HashSet, LinkedHashSet và TreeSet. Trong bài này, tôi sẽ so sánh sự giống nhau, khác nhau của 3 collection này.

Nội dung

  • 1 Giống nhau của HashSet, LinkedHashSet và TreeSet
  • 2 Khác nhau của HashSet, LinkedHashSet và TreeSet

Giống nhau của HashSet, LinkedHashSet và TreeSet

  • Cả ba không cho phép các phần tử trùng lặp.
  • Cả ba không được đồng bộ (non-synchronized).
  • Cả ba đều cài đặt interface Cloneable và Serializable.
  • Cả ba đều là fail-fast. Bạn sẽ nhận được ConcurrentModificationException nếu chúng được sửa đổi sau khi tạo đối tượng Iterator.

Ví dụ:

package com.gpcoder.collection.set.linkedhashset;

public class Student {
	private int id;
	private String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}
}
package com.gpcoder.collection.set.linkedhashset;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetExample3 {
	public static void main(String[] args) {
		// Create list
		Set<Student> students = new LinkedHashSet<>();
		// Add element to list
		Student student1 = new Student(1, "myname1");
		Student student2 = new Student(2, "myname2");
		Student student3 = new Student(3, "myname3");
		students.add(student1);
		students.add(student2);
		students.add(student3);

		// Show list student
		Iterator<Student> it = students.iterator();
		students.remove(student2); // You will get ConcurrentModificationException
							// if they are modified after the creation of Iterator object.
		while (it.hasNext()) {
			Student s = (Student) it.next();
			System.out.println(s);
		}
	}
}

Thực thi chương trình trên, bạn sẽ nhận được lỗi như sau:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
	at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742)
	at com.gpcoder.collection.set.linkedhashset.LinkedHashSetExample3.main(LinkedHashSetExample3.java:24)

Khác nhau của HashSet, LinkedHashSet và TreeSet

HashSetLinkedHashSetTreeSet
Cách thức làm việc?HashSet sử dụng HashMap nội bộ để lưu trữ các phần tử.LinkedHashSet sử dụng LinkedHashMap nội bộ để lưu trữ các phần tử.TreeSet sử dụng TreeMap nội bộ để lưu trữ các phần tử.
Thứ tự của các phần tử (Order Of Elements)HashSet không duy trì bất kỳ thứ tự các phần tử được thêm vào.LinkedHashSet duy trì thứ tự chèn của các phần tử. Các phần tử được lưu trữ đúng như thứ tự chúng được chèn vào.TreeSet duy trì thứ tự các phần tử theo bộ so sánh được cung cấp (Comparator). Nếu không có bộ so sánh được cung cấp, các phần tử sẽ được đặt theo thứ tự tăng dần tự nhiên của chúng.
Hiệu suất (Performance)HashSet cho hiệu suất tốt hơn so với LinkedHashSet và TreeSet.Hiệu suất của LinkedHashSet nằm giữa HashSet và TreeSet. Hiệu suất của nó hầu như tương tự như HashSet. Nhưng hơi chậm hơn vì nó cũng duy trì LinkedList nội bộ để duy trì trình tự chèn các phần tử.TreeSet cho hiệu suất thấp hơn HashSet và LinkedHashSet vì nó phải sắp xếp các phần tử sau mỗi lần chèn và loại bỏ.
Thao tác thêm (Insertion), xóa (Removal) và truy xuất (Retrieval) phần tửHashSet cho hiệu suất của lệnh O(1) để chèn, loại bỏ và truy xuất phần tử.LinkedHashSet cũng cho hiệu suất của lệnh O(1) để chèn, loại bỏ và truy xuất phần tử.TreeSet cho hiệu suất của lệnh O(log (n)) cho các thao tác chèn, loại bỏ và truy xuất phần tử.
So sánh các phần tửHashSet sử dụng các phương thức equals() và hashCode() để so sánh các phần tử và do đó loại bỏ các phần tử có thể trùng lặp.LinkedHashSet cũng sử dụng phương thức equals() và hashCode() để so sánh các phần tử.TreeSet sử dụng phương pháp compare() hoặc compareTo() để so sánh các phần tử và do đó loại bỏ các phần tử có thể trùng lặp. Nó không sử dụng các phương thức equals () và hashCode () để so sánh các phần tử.
Phần tử NullHashSet cho phép tối đa một phần tử null.LinkedHashSet  cũng cho phép tối đa một phần tử null.TreeSet không cho phép chứa phần tử null. Nếu bạn cố gắng để chèn null thành phần TreeSet, nó ném NullPointerException.
Sử dụng bộ nhớHashSet đòi hỏi ít bộ nhớ hơn LinkedHashSet và TreeSet vì nó chỉ sử dụng HashMap nội bộ để lưu trữ các phần tử của nó.LinkedHashSet yêu cầu bộ nhớ nhiều hơn HashSet vì nó cũng duy trì LinkedList cùng với HashMap để lưu trữ các phần tử của nó.TreeSet cũng yêu cầu bộ nhớ nhiều hơn HashSet vì nó cũng duy trì bộ so sánh để sắp xếp các phần tử cùng với TreeMap.
Khi nào sử dụng?Sử dụng HashSet nếu bạn muốn danh sách không chứa phần tử trùng và không cần duy trì bất kỳ thứ tự các phần tử được chèn vào.Sử dụng LinkedHashSet nếu bạn muốn danh sách không chứa phần tử trùng và muốn duy trì thứ tự chèn của các phần tử.Sử dụng TreeSet nếu bạn muốn danh sách không chứa phần tử trùng và muốn sắp xếp các phần tử theo một số so sánh.
5.0
20
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!

Shares

Chuyên mục: Collection Được gắn thẻ: Collection

TreeSet và sử dụng Comparable, Comparator trong java
Map Interface trong java

Có thể bạn muốn xem:

  • So sánh ArrayList và LinkedList trong Java (12/11/2017)
  • So sánh ArrayList và Vector trong Java (21/11/2017)
  • HashMap trong Java hoạt động như thế nào? (17/11/2017)
  • So sánh HashMap và HashSet trong Java (19/11/2017)
  • Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8? (24/02/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020
  • Sử dụng Alternate Exchange trong RabbitMQ 10/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (65882 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (64371 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (60598 lượt xem)
  • Giới thiệu Design Patterns (57266 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (53776 lượt xem)

Nội dung bài viết

  • 1 Giống nhau của HashSet, LinkedHashSet và TreeSet
  • 2 Khác nhau của HashSet, LinkedHashSet và TreeSet

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP Performance PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2023 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Google
Hacker News
Line
LinkedIn
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
Xing
Yahoo! Mail

Copy short link

Copy link