第13章 集合(12)Properties/Stack/BitSet
写在前面
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);//1stack.push(2);//1 2stack.push(3);//1 2 3System.out.println(stack.pop());//1 2,弹出值为3System.out.println(stack.peek());//1 2, 栈顶2 stack.push(4);// 1 2 4 stack.push(5);// 1 2 4 5System.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》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!