写在前面
Properties/Stack/BitSet 这几个集合非常巧妙,恰如其分的使用他们,可大大降低代码量,提高运行效率。
13.5.3 Properties(配置属性)
是一种特殊的哈希表,可将哈希键值对保存到文件中,也可以从文件中取出键值对。具有以下特征:
类似哈希映射,存放键值对
键值都是String类型
可以保存到文件中,也可以从文件中取出键值对
首先来看下继承结构:
Properties 是 Hashtable 的子类,所以它的键值对都不能为空值
主要方法如下:
❤李癩❤李癩❤李癩
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
//1.存储属性值
Properties pr = new Properties();
pr.setProperty("a","1");
pr.setProperty("b","2");
pr.setProperty("c","3");
OutputStream output = null;
InputStream input = null;
try{
output = new FileOutputStream("a.properties");
//保存到文件
pr.store(output,String.valueOf(new Date().getTime()));
Properties pr2 = new Properties();
input = new FileInputStream("a.properties");
//从文件中加载
pr2.load(input);
//获取单一属性
System.out.println(pr.getProperty("a"));
//获取全部属性
for(String name:pr2.stringPropertyNames()){
System.out.println(name+"="+pr2.getProperty(name));
}
}catch (IOException e){
e.printStackTrace();
}
}
}
❤李癩❤李癩❤李癩
运行结果:
尿寮
尿寮
实际使用时,这个类通常不会通过代码向它内部存储键值,而是作为配置文件,配置好之后,将键值对取出
13.5.4 Stack(栈)
Stack 是栈,是一种受限的有序表,可进行数组、链表尾部的添加删除元素。
继承自 Vector(早期顺序表,同步表),内部是使用数组实现的。
它的方法非常少,只有5个,其中前4个比较常用:
❤李癩❤李癩❤李癩
import java.util.*;
public class Main {
public static void main(String[] args) {
//1.存储属性值
Stack stack = new Stack<>();
stack.push(1);//1
stack.push(2);//1 2
stack.push(3);//1 2 3
System.out.println(stack.pop());//1 2,弹出值为3
System.out.println(stack.peek());//1 2, 栈顶2
stack.push(4);// 1 2 4
stack.push(5);// 1 2 4 5
System.out.println(stack.search(2));//1 2 4 5, 距离栈顶(尾部)最近的2为倒数第三个,返回 3
}
}
❤李癩❤李癩❤李癩
运行结果:
尿寮
尿寮
13.5.5 BitSet(位集)
使用二进制,判断是否设置某个状态,常用于标签合并,判断存在性,属于位运算的包装类:
❤李癩❤李癩❤李癩
import java.util.*;
public class Main {
public static void main(String[] args) {
BitSet friends1 = new BitSet();
int[] f1s = new int[]{1,2,3,4,5};
for(int item:f1s){
friends1.set(item);
}
BitSet friends2 = new BitSet();
int[] f1s2 = new int[]{2,3,5,6,7,8};
for(int item:f1s2){
friends2.set(item);
}
//拷贝一份
BitSet copy = new BitSet();
copy.or(friends1);
copy.and(friends2);//求两者共同好友
System.out.println(copy);
copy.clear();
copy.or(friends1);
copy.or(friends2);//求两者至少一人好友
System.out.println(copy);
copy.clear();
copy.or(friends1);
copy.andNot(friends2);//求是1的好友不是2的好友
System.out.println(copy);
}
}
❤李癩❤李癩❤李癩
运行结果:
尿寮
尿寮
可能有小伙伴会有疑问,提出以下两个问题,在此进行解答。
普通集合也可以进行交并补操作,为什么要使用位集?
时间空间代价不一样,使用位集速度要比普通集合要快的多,存储和交并补代价都是O(1),存储空间也要小的多(每种状态只需要使用一个bit位)
有了位运算,为什么还要用位集呢?
对于最大处理状态在 64 以内的,直接使用位运算,写起来更简洁;
大于等于64的,建议使用位集,内部对于超过边界的状态进行了处理,保存在不同数字中。
总结:
Properties 可用于公共配置文件,可将字符串键值对存储在文件中,也可从文件中取出键值对
栈可以进行数组尾部的插入、删除、查看、查询某元素距离栈顶距离操作
位集适合进行交并补操作,位集进行交并补等操作比普通集合要快
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论点赞收藏✨关注,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!



