一、引言
BitSet是Java中的一个用于存储二进制位的集合类。它有很多实用的方法,例如可以用来检查或设置特定位的值,进行逻辑位操作,或者进行集合的操作(交、并、补)等。在本文中,我们将介绍BitSet的基本用法以及它在实际应用中的一些例子。
二、基本用法
1. 创建一个BitSet对象
我们可以使用默认构造函数来创建一个BitSet对象。默认情况下,所有的位都被设置为0:
BitSet bits = new BitSet();
我们也可以使用指定的大小来创建一个BitSet对象,例如:
BitSet bits = new BitSet(8); // 创建一个大小为8的BitSet对象
2. 设置和清除特定位的值
我们可以使用set()方法来设置指定位的值为1,或者使用clear()方法来将指定位的值清除为0。例如:
bits.set(0); // 设置第0位的值为1 bits.clear(1); // 将第1位的值清0
我们也可以使用set(int start, int end)方法来设置指定范围内的所有位的值为1。例如:
bits.set(0, 4); // 将第0位到第3位的值设置为1
注意:在Java中,BitSet对象中的位是从右往左数的,即第一位的下标为0,第二位的下标为1,以此类推。
3. 获取指定位的值
我们可以使用get()方法来获取指定位的值。例如:
bits.set(2); // 设置第2位的值为1 boolean value = bits.get(2); // 获取第2位的值
在上面的代码中,value的值将为true。
4. 进行逻辑位操作
BitSet类还提供了一些进行逻辑位操作的方法,例如and、or、xor、andNot等。例如:
BitSet bits1 = new BitSet(); BitSet bits2 = new BitSet(); bits1.set(0); bits1.set(2); bits2.set(1); bits2.set(2); bits1.and(bits2); // 进行and操作 System.out.println(bits1); // 输出 "{2}"
在上面的代码中,我们创建了两个BitSet对象bits1和bits2,并对其进行了设置。然后我们调用了bits1的and方法,将其与bits2进行and操作,并输出了结果。
5. 进行集合操作
除了进行逻辑位操作外,BitSet还可以进行集合操作,例如求交、并、补等。例如:
BitSet bits1 = new BitSet(); BitSet bits2 = new BitSet(); bits1.set(0); bits1.set(2); bits2.set(1); bits2.set(2); bits1.or(bits2); // 进行or操作 System.out.println(bits1); // 输出 "{0, 1, 2}"
在上面的代码中,我们同样创建了两个BitSet对象bits1和bits2,并对其进行了设置。然后我们调用了bits1的or方法,将其与bits2进行并操作,并输出了结果。
三、在实际应用中的例子
1. 使用BitSet判断两个字符串是否由相同的字符组成
假设我们有两个字符串str1和str2,希望判断它们是否由相同的字符组成。我们可以使用BitSet来解决这个问题。具体做法是,对于每个字符串中的字符,将其对应的ASCII码值减去'a'(或者'A'),然后将这个值作为BitSet的下标,将该位置的值设置为1。最后,我们再将两个BitSet对象进行and操作,如果其结果为0,则说明这两个字符串由不同的字符组成。
public static boolean checkSameChars(String str1, String str2){ BitSet bs1 = stringToBitSet(str1); BitSet bs2 = stringToBitSet(str2); bs1.and(bs2); return bs1.cardinality() == bs2.cardinality(); } private static BitSet stringToBitSet(String str){ BitSet bs = new BitSet(); // 默认都是0 for(int i=0; i<str.length(); i++){ int index = str.charAt(i) - 'a'; // 字符对应的ASCII码值减去'a',作为下标 bs.set(index); } return bs; }
2. 使用BitSet进行字符串匹配
我们可以使用BitSet进行字符串匹配。具体做法是,将模式串(可以是一个字符串,也可以是多个字符串,用分隔符分开)中的每个字符按照其ASCII码值减去'a'(或者'A'),作为BitSet的下标,将对应位置的值设置为1。然后,对于文本串中的每个位置,也按照相同的方法,建立一个BitSet对象,将其与模式串的BitSet进行and操作,如果结果为模式串的BitSet,则表示该位置匹配成功。
public static ListmatchString(String text, String pattern, char separator){ String[] patterns = pattern.split(String.valueOf(separator)); List result = new ArrayList<>(); BitSet bitSet = stringToBitSet(patterns[0]); int shift = 0; for(int i=0; i<text.length();i++){ BitSet bs = stringToBitSet(String.valueOf(text.charAt(i))); bs.and(bitSet); if(bs.equals(bitSet)){ // 匹配成功 boolean flag = true; for(int j=1;j<patterns.length;j++){ if(i+shift+j >= text.length()) { flag = false; break; } BitSet bs2 = stringToBitSet(String.valueOf(text.charAt(i+shift+j))); bs2.and(bitSet); if(!bs2.equals(bitSet)) { shift += j-1; flag = false; break; } } if(flag == true) result.add(i); } } return result; } private static BitSet stringToBitSet(String str){ BitSet bs = new BitSet(); // 默认都是0 for(int i=0; i<str.length(); i++){ int index = str.charAt(i) - 'a'; // 字符对应的ASCII码值减去'a',作为下标 bs.set(index); } return bs; }
四、结论
BitSet是Java中用于存储二进制位的集合类。它提供了许多实用的方法,例如可以用来检查或设置特定位的值,进行逻辑位操作,或者进行集合的操作。在实际应用中,BitSet也有很多用处,例如可以用来判断字符串是否由相同的字符组成,或者用来进行字符串匹配等。通过学习本文,你应该可以初步了解BitSet的基本用法,并可以通过一些简单的例子来使用它。