From 3433279c30d3d7fc15545259dce8407a3e2b0390 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Mon, 20 Jul 2020 20:04:15 +0430 Subject: [PATCH 1/4] A Guide to BitSet in Java --- .../core-java-collections-3/pom.xml | 6 + .../collections/bitset/BitSetUnitTest.java | 152 ++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml index b206cd61d2..a9a05f5092 100644 --- a/core-java-modules/core-java-collections-3/pom.xml +++ b/core-java-modules/core-java-collections-3/pom.xml @@ -16,6 +16,11 @@ + + org.openjdk.jol + jol-core + ${jol-core.version} + org.openjdk.jmh jmh-core @@ -37,6 +42,7 @@ 1.19 3.11.1 + 0.10 diff --git a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java new file mode 100644 index 0000000000..d6e5f23f4e --- /dev/null +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java @@ -0,0 +1,152 @@ +package com.baeldung.collections.bitset; + +import org.junit.Test; +import org.openjdk.jol.info.ClassLayout; +import org.openjdk.jol.info.GraphLayout; + +import java.util.BitSet; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BitSetUnitTest { + + @Test + public void givenBoolArray_whenMemoryLayout_thenConsumeMoreThanOneBit() { + boolean[] bits = new boolean[1024]; + + System.out.println(ClassLayout.parseInstance(bits).toPrintable()); + } + + @Test + public void givenBitSet_whenMemoryLayout_thenConsumeObeBitPerFlag() { + BitSet bitSet = new BitSet(1024); + + System.out.println(GraphLayout.parseInstance(bitSet).toPrintable()); + } + + @Test + public void givenBitSet_whenSetting_thenShouldBeTrue() { + BitSet bitSet = new BitSet(); + + bitSet.set(10); + assertThat(bitSet.get(10)).isTrue(); + + bitSet.set(20, 30); + for (int i = 20; i <= 29; i++) assertThat(bitSet.get(i)).isTrue(); + assertThat(bitSet.get(30)).isFalse(); + + bitSet.set(10, false); + assertThat(bitSet.get(10)).isFalse(); + + bitSet.set(20, 30, false); + for (int i = 20; i <= 30; i++) assertThat(bitSet.get(i)).isFalse(); + } + + @Test + public void givenBitSet_whenClearing_thenShouldBeFalse() { + BitSet bitSet = new BitSet(); + bitSet.set(42); + assertThat(bitSet.get(42)).isTrue(); + + bitSet.clear(42); + assertThat(bitSet.get(42)).isFalse(); + + bitSet.set(10, 20); + for (int i = 10; i < 20; i++) assertThat(bitSet.get(i)).isTrue(); + + bitSet.clear(10, 20); + for (int i = 10; i < 20; i++) assertThat(bitSet.get(i)).isFalse(); + + bitSet.set(10, 20); + bitSet.clear(); + for (int i = 0; i < 100; i++) assertThat(bitSet.get(i)).isFalse(); + } + + @Test + public void givenBitSet_whenGettingElements_thenShouldReturnRequestedBits() { + BitSet bitSet = new BitSet(); + bitSet.set(42); + + assertThat(bitSet.get(42)).isTrue(); + assertThat(bitSet.get(43)).isFalse(); + + bitSet.set(10, 20); + BitSet newBitSet = bitSet.get(10, 20); + for (int i = 0; i < 10; i++) assertThat(newBitSet.get(i)).isTrue(); + } + + @Test + public void givenBitSet_whenFlip_thenTogglesTrueToFalseAndViceVersa() { + BitSet bitSet = new BitSet(); + bitSet.set(42); + bitSet.flip(42); + assertThat(bitSet.get(42)).isFalse(); + + bitSet.flip(12); + assertThat(bitSet.get(12)).isTrue(); + + bitSet.flip(30, 40); + for (int i = 30; i < 40; i++) assertThat(bitSet.get(i)).isTrue(); + } + + @Test + public void givenBitSet_whenGettingTheSize_thenReturnsTheSize() { + BitSet defaultBitSet = new BitSet(); + assertThat(defaultBitSet.size()).isEqualTo(64); + + BitSet bitSet = new BitSet(1024); + assertThat(bitSet.size()).isEqualTo(1024); + + assertThat(bitSet.cardinality()).isEqualTo(0); + bitSet.set(10, 30); + assertThat(bitSet.cardinality()).isEqualTo(30 - 10); + + assertThat(bitSet.length()).isEqualTo(30); + bitSet.set(100); + assertThat(bitSet.length()).isEqualTo(101); + + assertThat(bitSet.isEmpty()).isFalse(); + bitSet.clear(); + assertThat(bitSet.isEmpty()).isTrue(); + } + + @Test + public void givenBitSet_whenSetOperations_thenShouldReturnAnotherBitSet() { + BitSet first = new BitSet(); + first.set(5, 10); + + BitSet second = new BitSet(); + second.set(7, 15); + + assertThat(first.intersects(second)).isTrue(); + + first.and(second); + assertThat(first.get(7)).isTrue(); + assertThat(first.get(8)).isTrue(); + assertThat(first.get(9)).isTrue(); + assertThat(first.get(10)).isFalse(); + } + + @Test + public void givenBitSet_whenStream_thenStreamsAllSetBits() { + BitSet bitSet = new BitSet(); + bitSet.set(15, 25); + + bitSet.stream().forEach(System.out::println); + } + + @Test + public void givenBitSet_whenNextOrPrev_thenReturnsTheNextClearOrSetBit() { + BitSet bitSet = new BitSet(); + bitSet.set(15, 25); + + assertThat(bitSet.nextSetBit(13)).isEqualTo(15); + assertThat(bitSet.nextSetBit(25)).isEqualTo(-1); + + assertThat(bitSet.nextClearBit(23)).isEqualTo(25); + + assertThat(bitSet.previousClearBit(24)).isEqualTo(14); + assertThat(bitSet.previousSetBit(29)).isEqualTo(24); + assertThat(bitSet.previousSetBit(14)).isEqualTo(-1); + } +} From bacce9abc8f57591dbb26d4309469a4388567078 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Mon, 20 Jul 2020 20:07:37 +0430 Subject: [PATCH 2/4] Polish. --- .../java/com/baeldung/collections/bitset/BitSetUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java index d6e5f23f4e..6c677e4b0e 100644 --- a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java @@ -18,7 +18,7 @@ public class BitSetUnitTest { } @Test - public void givenBitSet_whenMemoryLayout_thenConsumeObeBitPerFlag() { + public void givenBitSet_whenMemoryLayout_thenConsumeOneBitPerFlag() { BitSet bitSet = new BitSet(1024); System.out.println(GraphLayout.parseInstance(bitSet).toPrintable()); @@ -136,7 +136,7 @@ public class BitSetUnitTest { } @Test - public void givenBitSet_whenNextOrPrev_thenReturnsTheNextClearOrSetBit() { + public void givenBitSet_whenNextOrPrev_thenReturnsTheNextOrPrevClearOrSetBit() { BitSet bitSet = new BitSet(); bitSet.set(15, 25); From 030fa1b52340c0e08ad9bd60da14ac3c660388c7 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Mon, 20 Jul 2020 21:00:35 +0430 Subject: [PATCH 3/4] Polish. --- .../baeldung/collections/bitset/BitSetUnitTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java index 6c677e4b0e..74aa224a49 100644 --- a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java @@ -12,14 +12,14 @@ public class BitSetUnitTest { @Test public void givenBoolArray_whenMemoryLayout_thenConsumeMoreThanOneBit() { - boolean[] bits = new boolean[1024]; + boolean[] bits = new boolean[1024 * 1024]; System.out.println(ClassLayout.parseInstance(bits).toPrintable()); } @Test public void givenBitSet_whenMemoryLayout_thenConsumeOneBitPerFlag() { - BitSet bitSet = new BitSet(1024); + BitSet bitSet = new BitSet(1024 * 1024); System.out.println(GraphLayout.parseInstance(bitSet).toPrintable()); } @@ -125,6 +125,13 @@ public class BitSetUnitTest { assertThat(first.get(8)).isTrue(); assertThat(first.get(9)).isTrue(); assertThat(first.get(10)).isFalse(); + + first.clear(); + first.set(5, 10); + + first.xor(second); + for (int i = 5; i < 7; i++) assertThat(first.get(i)).isTrue(); + for (int i = 10; i < 15; i++) assertThat(first.get(i)).isTrue(); } @Test @@ -133,6 +140,7 @@ public class BitSetUnitTest { bitSet.set(15, 25); bitSet.stream().forEach(System.out::println); + assertThat(bitSet.stream().count()).isEqualTo(10); } @Test From a72f2f144cbd2d446e16860b72995f5f048b5e2c Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Wed, 22 Jul 2020 19:43:35 +0430 Subject: [PATCH 4/4] Switching the For Blocks! --- .../collections/bitset/BitSetUnitTest.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java index 74aa224a49..d9340f45c1 100644 --- a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/bitset/BitSetUnitTest.java @@ -32,14 +32,18 @@ public class BitSetUnitTest { assertThat(bitSet.get(10)).isTrue(); bitSet.set(20, 30); - for (int i = 20; i <= 29; i++) assertThat(bitSet.get(i)).isTrue(); + for (int i = 20; i <= 29; i++) { + assertThat(bitSet.get(i)).isTrue(); + } assertThat(bitSet.get(30)).isFalse(); bitSet.set(10, false); assertThat(bitSet.get(10)).isFalse(); bitSet.set(20, 30, false); - for (int i = 20; i <= 30; i++) assertThat(bitSet.get(i)).isFalse(); + for (int i = 20; i <= 30; i++) { + assertThat(bitSet.get(i)).isFalse(); + } } @Test @@ -52,14 +56,20 @@ public class BitSetUnitTest { assertThat(bitSet.get(42)).isFalse(); bitSet.set(10, 20); - for (int i = 10; i < 20; i++) assertThat(bitSet.get(i)).isTrue(); + for (int i = 10; i < 20; i++) { + assertThat(bitSet.get(i)).isTrue(); + } bitSet.clear(10, 20); - for (int i = 10; i < 20; i++) assertThat(bitSet.get(i)).isFalse(); + for (int i = 10; i < 20; i++) { + assertThat(bitSet.get(i)).isFalse(); + } bitSet.set(10, 20); bitSet.clear(); - for (int i = 0; i < 100; i++) assertThat(bitSet.get(i)).isFalse(); + for (int i = 0; i < 100; i++) { + assertThat(bitSet.get(i)).isFalse(); + } } @Test @@ -72,7 +82,9 @@ public class BitSetUnitTest { bitSet.set(10, 20); BitSet newBitSet = bitSet.get(10, 20); - for (int i = 0; i < 10; i++) assertThat(newBitSet.get(i)).isTrue(); + for (int i = 0; i < 10; i++) { + assertThat(newBitSet.get(i)).isTrue(); + } } @Test @@ -86,7 +98,9 @@ public class BitSetUnitTest { assertThat(bitSet.get(12)).isTrue(); bitSet.flip(30, 40); - for (int i = 30; i < 40; i++) assertThat(bitSet.get(i)).isTrue(); + for (int i = 30; i < 40; i++) { + assertThat(bitSet.get(i)).isTrue(); + } } @Test @@ -130,8 +144,12 @@ public class BitSetUnitTest { first.set(5, 10); first.xor(second); - for (int i = 5; i < 7; i++) assertThat(first.get(i)).isTrue(); - for (int i = 10; i < 15; i++) assertThat(first.get(i)).isTrue(); + for (int i = 5; i < 7; i++) { + assertThat(first.get(i)).isTrue(); + } + for (int i = 10; i < 15; i++) { + assertThat(first.get(i)).isTrue(); + } } @Test