> 文档中心 > 第13章 集合(12)Properties/Stack/BitSet

第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》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!

新能源吧