tek4

Lớp Hashset trong Java

by - September. 25, 2021
Kiến thức
Học
Công nghệ
<p>Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ c&ugrave;ng t&igrave;m hiểu về lớp Hashset trong Java. Ch&uacute;ng ta sẽ t&igrave;m hiểu về c&aacute;c phương thức v&agrave; thao t&aacute;c kh&aacute;c nhau c&ugrave;ng với sự trợ gi&uacute;p của c&aacute;c v&iacute; dụ dẫn chứng.</p> <p>Lớp HashSet cung cấp c&aacute;c chức năng của cấu tr&uacute;c dữ liệu bảng băm. N&oacute; thực hiện triển khai cho Set Interface.</p> <h2>Tạo HashSet</h2> <p>Để tạo HashSet, trước ti&ecirc;n ch&uacute;ng ta phải th&ecirc;m g&oacute;i package java.util.HashSet. Sau đ&acirc;y l&agrave; c&aacute;ch ch&uacute;ng ta c&oacute; thể tạo HashSet trong Java.</p> <pre class="language-java"><code>HashSet&lt;Integer&gt; a = new HashSet&lt;&gt;(6, 0.67);</code></pre> <p>Ở đ&acirc;y, ch&uacute;ng ta đ&atilde; tạo một HashSet c&oacute; t&ecirc;n l&agrave; a.</p> <p>Ch&uacute; &yacute; biểu thức: new HashSet&lt;&gt;(6, 0.67)</p> <ul> <li>Ở đ&acirc;y, tham số đầu ti&ecirc;n l&agrave; dung lượng v&agrave; tham số thứ hai l&agrave; hệ số nạp đầy.</li> <li>Dung lượng của HashSet n&agrave;y l&agrave; 6. C&oacute; nghĩa l&agrave;, n&oacute; c&oacute; thể lưu trữ 6 phần tử.</li> <li>Hệ số nạp đầy của HashSet n&agrave;y l&agrave; 0,67. Điều n&agrave;y c&oacute; nghĩa l&agrave;, bất cứ khi n&agrave;o HashSet của ch&uacute;ng ta được lấp đầy bởi 67%, c&aacute;c phần tử sẽ được chuyển sang một bảng băm mới c&oacute; k&iacute;ch thước gấp đ&ocirc;i k&iacute;ch thước của bảng băm ban đầu.</li> <li>Nếu ta kh&ocirc;ng truyền c&aacute;c đối số n&agrave;y th&igrave; theo mặc định, <ul> <li>Dung lượng của HashSet sẽ l&agrave; 16.</li> <li>Hệ số nạp đầy sẽ l&agrave; 0,75.</li> </ul> </li> </ul> <h2>C&aacute;c phương thức của HashSet</h2> <h3>1. Ch&egrave;n c&aacute;c phần tử</h3> <ul> <li>Phương thức add(): Ch&egrave;n phần tử được chỉ định v&agrave;o tập hợp.</li> <li>Phương thức addAll(): Ch&egrave;n tất cả c&aacute;c phần tử của tập hợp được chỉ định v&agrave;o tập hợp.</li> </ul> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(52); tap_hop2.add(43); tap_hop2.addAll(tap_hop); System.out.println(tap_hop2); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] [34, 52, 43, 13]</code></pre> <h3>2. Truy cập c&aacute;c phần tử</h3> <p>Để truy cập c&aacute;c phần tử của HashSet, ch&uacute;ng ta c&oacute; thể sử dụng phương thức iterator(). Để sử dụng phương ph&aacute;p n&agrave;y, ch&uacute;ng ta phải th&ecirc;m g&oacute;i package java.util.Iterator.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(52); tap_hop2.add(43); tap_hop2.addAll(tap_hop); Iterator&lt;Integer&gt; phan_tu = tap_hop2.iterator(); while(phan_tu.hasNext()) { System.out.print(phan_tu.next()); System.out.print(" "); } } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] 34 52 43 13</code></pre> <h3>3. X&oacute;a c&aacute;c phần tử</h3> <ul> <li>Phương thức remove(): X&oacute;a phần tử được chỉ định khỏi tập hợp.</li> <li>Phương thức removeAll(): X&oacute;a tất cả c&aacute;c phần tử khỏi tập hợp.</li> </ul> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(52); tap_hop2.add(43); tap_hop2.addAll(tap_hop); boolean kq = tap_hop2.remove(11); System.out.println(kq); boolean kq2 = tap_hop2.removeAll(tap_hop2); System.out.println(kq2); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] false true</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, v&igrave; 11 kh&ocirc;ng c&oacute; trong tập hợp, do vậy khi ta thực hiện tap_hop2.remove(11) th&igrave; sẽ nhận được kết quả l&agrave; false</p> <h2>C&aacute;c thao t&aacute;c với Set</h2> <p><strong>1. Li&ecirc;n hợp</strong></p> <p>Ch&uacute;ng ta c&oacute; thể sử dụng phương thức addAll() để kết hợp c&aacute;c tập hợp với nhau.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(52); tap_hop2.add(43); System.out.println(tap_hop2); tap_hop2.addAll(tap_hop); System.out.println(tap_hop2); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] [52, 43] [34, 52, 43, 13]</code></pre> <p><strong>2. T&igrave;m tập giao của 2 tập hợp</strong></p> <p>Để thực hiện t&igrave;m phần giao nhau giữa hai tập hợp, ch&uacute;ng ta c&oacute; thể sử dụng phương thức retainAll().</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(52); tap_hop2.add(43); System.out.println(tap_hop2); tap_hop2.retainAll(tap_hop); System.out.println("Tap giao cua 2 tap hop: " + tap_hop2); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] [52, 43] Tap giao cua 2 tap hop: []</code></pre> <p><strong>3. T&iacute;nh ph&eacute;p hiệu của c&aacute;c tập hợp</strong></p> <p>Để t&iacute;nh to&aacute;n ph&eacute;p hiệu giữa hai tập hợp, ch&uacute;ng ta c&oacute; thể sử dụng phương thức removeAll().</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(13); tap_hop2.add(43); System.out.println(tap_hop2); tap_hop2.removeAll(tap_hop); System.out.println(tap_hop2); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] [43, 13] [43]</code></pre> <p><strong>4. Kiểm tra tập con</strong></p> <p>Để kiểm tra xem một tập hợp c&oacute; phải l&agrave; tập con của một tập hợp kh&aacute;c hay kh&ocirc;ng, ch&uacute;ng ta c&oacute; thể sử dụng phương thức containsAll().</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set&lt;Integer&gt; tap_hop = new HashSet&lt;&gt;(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set&lt;Integer&gt; tap_hop2 = new HashSet&lt;&gt;(); tap_hop2.add(13); tap_hop2.add(43); System.out.println(tap_hop2); boolean kq = tap_hop2.containsAll(tap_hop); String kq2; System.out.println("Tap hop 1 co phai la tap con cua tap hop 2 hay khong? " + (kq2 = (kq == false)? "Khong" : "Co")); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>[34, 13] [43, 13] Tap hop 1 co phai la tap con cua tap hop 2 hay khong? Khong</code></pre> <h3>C&aacute;c phương thức kh&aacute;c</h3> <table width="788"> <tbody> <tr> <td style="text-align: center;">Phương thức</td> <td style="text-align: center;">M&ocirc; tả</td> </tr> <tr> <td>clone()</td> <td>Tạo một bản sao ch&eacute;p của HashSet.</td> </tr> <tr> <td>contains()</td> <td>Trả về gi&aacute; trị kiểu boolean nếu tồn tại một phần tử c&oacute; trong tập hợp.</td> </tr> <tr> <td>isEmpty()</td> <td>Kiểm tra HashSet rỗng hay kh&ocirc;ng.</td> </tr> <tr> <td>size()</td> <td>Trả về k&iacute;ch thước của HashSet.</td> </tr> <tr> <td>clear()</td> <td>X&oacute;a hết tất cả c&aacute;c phần tử khỏi HashSet.</td> </tr> </tbody> </table> <h2>Tại sao n&ecirc;n sử dụng HashSet?</h2> <ul> <li>Trong Java, HashSet thường được sử dụng nếu ch&uacute;ng ta phải truy cập c&aacute;c phần tử một c&aacute;ch ngẫu nhi&ecirc;n. Đ&oacute; l&agrave; do c&aacute;c phần tử trong bảng băm được truy cập bằng m&atilde; băm.</li> <li>M&atilde; băm của một phần tử l&agrave; một định danh duy nhất gi&uacute;p x&aacute;c định phần tử trong bảng băm.</li> <li>HashSet kh&ocirc;ng được chứa c&aacute;c phần tử tr&ugrave;ng lặp. Do đ&oacute;, mỗi phần tử của HashSet c&oacute; một m&atilde; băm duy nhất.</li> </ul> <p><strong>Ch&uacute; &yacute;: HashSet kh&ocirc;ng được đồng bộ h&oacute;a. Nếu xảy ra trường hợp nhiều luồng thực thi c&ugrave;ng truy cập HashSet c&ugrave;ng một l&uacute;c v&agrave; một trong c&aacute;c luồng thực hiện sửa đổi tập hợp, th&igrave; sau đ&oacute;, n&oacute; phải được đồng bộ h&oacute;a ở b&ecirc;n ngo&agrave;i.</strong></p> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về lớp Hashset trong Java. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i tiếp theo tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p>