Java CopyOnWriteArraySet Class - Java 147

Java CopyOnWriteArraySet Class – Java 147

Java CopyOnWriteArraySet Class

實作了 Set 接口,是其中所有修改像是:新增、刪除等,都是透過建立新副本來實現的,位於 java.util.concurrent 套件中,是為在並發環境中使用而建立的資料結構,使用起來成本很高,因為每次更新操作都會建立一個新的副本,因此,如果頻繁操作是讀取操作,那麼是最好的選擇,CopyOnWriteArraySet Class 介紹常見的 contains 、 sort 、 stream 等方法,了解陣列 Set 的不同操作和方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- set
       |                   +- copyonwritearrayset
       |                       +- CopyOnWriteArraySetClassTest.java   

單元測試

CopyOnWriteArraySet Class 提供檢查包含、排序、串流操作 Set 中的元素。

contains

建立一個 CopyOnWriteArraySet ,增加三個元素,檢查包含指定的元素。

	@Test
	public void contains() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");

		boolean contains = set.contains("Longan");
		System.out.println(contains);
		assertTrue(contains);

		contains = set.contains("Grape");
		System.out.println(contains);
		assertFalse(contains);
	}
true
false

containsAll

CopyOnWriteArraySet Class Java 建立一個 CopyOnWriteArraySet ,內有三個元素,檢查包含所有指定的元素。

	@Test
	public void containsAll() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");

		Set<String> set2 = new CopyOnWriteArraySet<>();
		set2.add("Longan");
		set2.add("Tomato");

		boolean contains = set.containsAll(set2);
		System.out.println(contains);
		assertTrue(contains);

		contains = set2.containsAll(set);
		System.out.println(contains);
		assertFalse(contains);
	}
true
false

sort

CopyOnWriteArraySet Class Java 建立一個 CopyOnWriteArraySet ,內有三個元素,排序元素。

	@Test
	public void sort() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");
		List<String> list = new ArrayList<>(set);
		Collections.sort(list, Comparator.naturalOrder());
		System.out.println(list);

		set.add("Grape");
		list = new ArrayList<>(set);
		Collections.sort(list, Comparator.reverseOrder());
		System.out.println(list);
	}
[Longan, Pear, Tomato]
[Tomato, Pear, Longan, Grape]

stream

CopyOnWriteArraySet Class in Java 建立一個 CopyOnWriteArraySet ,內有三個元素,執行串流,取得長度小於 6 的元素。

	@Test
	public void stream() {
		int expectedSize = 1;
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");
		set = set.stream().filter(e -> e.length() < 6).collect(Collectors.toSet());
		System.out.println(set);
		assertEquals(expectedSize, set.size());
	}
[Pear]

parallelStream

CopyOnWriteArraySet Class in Java 建立一個 CopyOnWriteArraySet ,內有三個元素,並行執行串流。

	@Test
	public void parallelStream() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");
		set.parallelStream().forEach(System.out::println);
		System.out.println("----------");
		set.parallelStream().forEachOrdered(System.out::println);
	}
Tomato
Pear
Longan
----------
Longan
Tomato
Pear

retainAll

Java CopyOnWriteArraySet Class Example 建立兩個 CopyOnWriteArraySet ,內各有三個元素,只保留相同元素 。

	@Test
	public void retainAll() {
		int expectedSize = 1;
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");

		Set<String> set2 = new CopyOnWriteArraySet<>();
		set2.add("Longan");
		set2.add("Lemon");
		set2.add("Mango");

		set.retainAll(set2);
		System.out.println(set);
		assertEquals(expectedSize, set.size());
	}
[Longan]

CopyOnWriteArraySetClassTest.java

CopyOnWriteArraySet Class in Java 新增單元測試,驗證是否符合預期。

package org.ruoxue.java_147.set.copyonwritearrayset;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;

import org.junit.Test;

public class CopyOnWriteArraySetClassTest {

	@Test
	public void contains() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");

		boolean contains = set.contains("Longan");
		System.out.println(contains);
		assertTrue(contains);

		contains = set.contains("Grape");
		System.out.println(contains);
		assertFalse(contains);
	}

	@Test
	public void containsAll() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");

		Set<String> set2 = new CopyOnWriteArraySet<>();
		set2.add("Longan");
		set2.add("Tomato");

		boolean contains = set.containsAll(set2);
		System.out.println(contains);
		assertTrue(contains);

		contains = set2.containsAll(set);
		System.out.println(contains);
		assertFalse(contains);
	}

	@Test
	public void sort() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");
		List<String> list = new ArrayList<>(set);
		Collections.sort(list, Comparator.naturalOrder());
		System.out.println(list);

		set.add("Grape");
		list = new ArrayList<>(set);
		Collections.sort(list, Comparator.reverseOrder());
		System.out.println(list);
	}

	@Test
	public void stream() {
		int expectedSize = 1;
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");
		set = set.stream().filter(e -> e.length() < 6).collect(Collectors.toSet());
		System.out.println(set);
		assertEquals(expectedSize, set.size());
	}

	@Test
	public void parallelStream() {
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");
		set.parallelStream().forEach(System.out::println);
		System.out.println("----------");
		set.parallelStream().forEachOrdered(System.out::println);
	}

	@Test
	public void retainAll() {
		int expectedSize = 1;
		Set<String> set = new CopyOnWriteArraySet<>();
		set.add("Longan");
		set.add("Tomato");
		set.add("Pear");

		Set<String> set2 = new CopyOnWriteArraySet<>();
		set2.add("Longan");
		set2.add("Lemon");
		set2.add("Mango");

		set.retainAll(set2);
		System.out.println(set);
		assertEquals(expectedSize, set.size());
	}
}

心得分享

Java CopyOnWriteArraySet Class Example 使用場景,當讀多寫少,如:白名單,黑名單,商品類目的訪問和更新場景,因為寫的時候會複製新集合,此外當集合不大,因為寫的時候會複製新集合,最後即時性要求不高,因為有可能會讀取到舊的集合資料,提供了幾種 CopyOnWriteArraySet 常見方法的操作範例, CopyOnWriteArraySet Class in Java 在應用上相當廣泛,熟悉這些方法的操作,能夠提高開發效率,節省維護上的成本。

發佈留言