Java集合--集合扩展
内容学习于:edu.aliyun.com
1. Stack栈
在浏览器上存在有“后退”按钮,在Android手机上存在有一个“返回”,在开发工具上存在有“撤销"功能,会发现所有的操作都是最晚操作的功能永远都是最先恢复,而越早的操作越晚恢复,实际上这就属于一种栈的结构。
- public class Stack extends Vector
Stack类是Vector 的子类,但是需要记住的是,Vector 类的内部是利用数组的形式实现的,而Stack的操作不能够使用Vector类中定义的方法,而应该使用本类自己扩充的方法。
- 入栈:public E push(E item)
- 出栈:public E pop()
- 判断栈是否为空:public boolean empty()
需要记住的是,如果要想通过栈弹出所需要的数据,那么必须保证栈中的内容不为空,如果为空则会产生如下异常:
- Exception in thread “main” java.util.EmptyStackException
而后观察Stack中的源代码可以发现,在进行栈数据压入、弹出等操作的时候全部都有同步的操作支持,即:栈的默认实现都需要考虑到多线程的同步处理。
2. Properties属性操作
java.util.Properties是一个属性的操作类,实际上这个类的名字和之前讲解过的“*.properties"是相同的,Properties 类主要的功能是进行属性定义(属性的类型全部都是String), 同时也可以方便的通过输入流读取和写入输出流(“*.properties" 文件可以理解为一种文件的输入流和输出流),Properties 是Hashtable的子类,观察类的定义:
- public class Properties extends Hashtable<Object,Object>
在Properties继承Hashtable类的时候,所设置的泛型类型都是Object,因为Properties不需要考虑所设置的泛型,它所有的数据类型必须是字符串(String), Propertis 类中提供的常用方法有如下几个:
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
01 | public Properties() | 构造 | 创建properties实例,默认长度为8 |
02 | public Object setProperty(String key, String value) | 方法 | 设置属性内容 |
03 | public String getProperty(String key) | 方法 | 获取属性内容,如果不存在返回null |
04 | public String getProperty(String key, String defaultValue) | 方法 | 获取属性内容,如果不存在返回默认值 |
05 | public void list(PrintStream out) | 方法 | 列出全部属性 |
06 | public void list(PrintWriter out) | 方法 | 列出全部属性 |
07 | public void store(OutputStream out, String comments) throws IOException | 方法 | 向输出流输出全部内容 |
08 | public void load(InputStream inStream) throws IOException | 方法 | 向输入流读取数据 |
通过以上的方法可以发现,使用Properties实际上可以从任意的位置上进行属性内容的读取和输出。
Properties简单操作:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.setProperty("ZZ","郑州");
System.out.println("【查询的数据存在】" + pro.getProperty("ZZ"));
System.out.println("【查询的数据不存在】" + pro.getProperty("bj"));
System.out.println("【查询的数据不存在,有默认数据】" + pro.getProperty("bj","查询的数据不存在!!"));
}
}
结果:
【查询的数据存在】郑州
【查询的数据不存在】null
【查询的数据不存在,有默认数据】查询的数据不存在!!
如果有需要(一定有此需要)可以利用输出和输入流进行属性内容的保存和加载。
文件的保存和加载:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.setProperty("zz", "郑州");
pro.setProperty("bj", "北京");
pro.setProperty("wh", "武汉");
//保存properties文件
pro.store(new FileOutputStream(
new File("d:" + File.separator + "area.properties")),
"Area Info");
//加载资源文件
pro.load(new FileInputStream(
new File("d:" + File.separator + "area.properties")));
System.out.println(pro.getProperty("zz"));
}
}
结果:
郑州
比较:关于Properties与ResourceBundle区别?
- Properties实现的是一个属性操作,那么保存属性资源的可以是任意的文件后缀,并且在进行加载的时候,如果指定属性的key不存在,那么返回的是null;
- ResourceBundle主要加载的是“*.properties’资源文件,如果现在要查询的key不存在,则会产生异常,但是特别需要注意的是,ResourceBundle 可以与Local结合实现不同语言资源文件的加载。
在之前讲解JavaIO编程的时候写过一个代码:
- System. getProperties(). list (System.out) ;
实际上System类中的getPropertes(方法返回的就是一个Properties类的实例化对象,而list()方法里面只需要接收一个PrintStream或者是PrintWriter就可以实现指定位置的输出。
3. Collections工具类
java.uilCollctions提供的是一个类集操作的工具类,它可以弥补原始类集设计之中的一些缺陷,提供更加丰富的操作方法。
类结构如下图所示:
Collections操作:
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<>();
Collections.addAll(all,"Hello","MLDN","Everyone");
Collections.sort(all);//排序
System.out.println(Collections.binarySearch(all,"MLDN"));//二分查找
}
}
结果:
2
Java之中的Collections只是弥补了传统类集设计里面的一些功能的缺失,但是考虑到实际应用的场景下,这些缺失的功能未必都会经常性的使用到。