主要内容
- Java中的队列和堆栈
- enumeration
- Hashtable和HashMap的比较
- 引用的分类
- 资源配置文件的存储于读取
笔记详情
1. Java中的队列和堆栈
Java中的队列遵循 先进先出 的规则,一般情况下,往队列中添加元素,以及从队列中获取元素,会用到下面的方法:
作用 | 抛出异常 | 返回特殊值 |
---|---|---|
插入 | add(e) |
offer(e) |
移除(并返回元素) | remove() |
poll() |
获取 | element() |
peek() |
在上面的方法中,使用第二列的相关方法时,会抛出异常(比如:队列已经满时向里面添加元素、队列中没有元素的时候进行移除或者获取元素),但是如果使用第三列的方法,不会抛出异常,会返回特殊值(比如:false、true、null等)。
下面给出一个实例,体会一下队列的先进先出规则:
package others;
import java.util.ArrayDeque;
import java.util.Queue;
public class TestQueue {
public static void main(String[] args) {
Queue q = new ArrayDeque();
// 分别将三个元素添加到队列中,三个元素的添加顺序是:
// 当前是第1位客户在办理业务
// 当前是第2位客户在办理业务
// 当前是第3位客户在办理业务
for (int i = 1; i < 4; i++) {
final int num = i;
((ArrayDeque) q).offer(new Quest() {
@Override
public void current() {
System.out.println("当前是第" + num + "位客户在办理业务");
}
});
}
// 遍历队列中的元素,按照先进先出的规则,显示顺序是
// 当前是第1位客户在办理业务
// 当前是第2位客户在办理业务
// 当前是第3位客户在办理业务
Quest item = null;
while((item = q.poll())!= null){
item.current();
}
}
}
// 定义一个接口,方便显示队列中的元素顺序
interface Quest {
public void current();
}
以上是Java中的队列,除了队列,我们常见的数据结构还有堆栈。Java中没有直接提供堆栈,不过我们可以使用队列( 主要是双向队列 )来间接实现堆栈,首先我们先熟悉一下双向队列( Deque )常用的一些方法:
下面给出实例:
import java.util.ArrayDeque;
import java.util.Deque;
public class MyStack {
private Deque container = new ArrayDeque();
private int size;
public MyStack(int size) {
this.size = size;
}
// 想堆栈中添加元素
public boolean push(T i) {
if (size == container.size()) {
return false;
}
container.offerLast(i);
return true;
}
// 把元素从堆栈中移除并返回
public T pop() {
return container.pollLast();
}
// 从堆栈中获取元素
public T peek() {
return container.peekLast();
}
public static void main(String[] args) {
MyStack c = new MyStack(4);
c.push("fenzhen");
c.push("Tom");
c.push("Jack");
c.push("Jane");
String item = null;
while ((item = c.pop()) != null) {
System.out.println(item);
}
}
}
2. enumeration遍历
enumeration是Java中一个比较古老的接口,在现在的项目中用的较少,但是如果是维护之前的一些项目,可能会使用到这个接口。这个接口的使用非常简单,作用同 Iterator 类似,都是用来遍历数据的。该接口主要有两个方法: hasMoreElement()、nextElement()。用法同Iterator中的非常类似,这里就不做解释,直接给出一个实例:
import java.util.Enumeration;
import java.util.Vector;
public class MyEnumeration {
public static void main(String[] args) {
Vector nameVector = new Vector();
nameVector.add("fengzhen");
nameVector.add("Tom");
nameVector.add("Jack");
nameVector.add("Jane");
// 需要注意的是:Vector类型对象的elements()方法返回一个Enumeration独享
// 这一点和Iterator也是类似的
Enumeration item = nameVector.elements();
while (item.hasMoreElements()) {
System.out.println(item.nextElement());
}
}
}
说到Enumeration,这里还要提一下这个接口的一个实现类:StringTokenizer ,这个类的作用类似于String对象的 split()
方法,可以用来分割字符串。但是不同的是,该类不支持正则表达式。下面给出一个实例,体会一下它的用法:
import java.util.Enumeration;
import java.util.StringTokenizer;
public class TestStringTokenizer {
public static void main(String[] args) {
String nameStr = "fengzhen;Tom;Jack";
// 使用构造函数进行分割字符串并返回
StringTokenizer item = new StringTokenizer(nameStr, ";");
while (item.hasMoreElements()) {
System.out.println(item.nextElement());
}
}
}
3. Hashtable和HashMap的比较
异同点 | hashtable | HashMap |
---|---|---|
线程 | 线程安全、同步、效率相对低下 | 线程不安全、不同步、效率相对较高 |
父类 | Dictionary | AbstractMap |
null值问题 | 键与值都不能为null | 键最多只能有一个null,值可以有多个为null |
4. 引用的分类
类别 | 说明 |
---|---|
强引用 StrongReference | 指向引用对象,垃圾回收时不被回收 |
软引用 SoftReference | 垃圾回收的时候,可能回收(比如jvm不足时) |
弱引用 WeakReference | 垃圾回收的时候,立即被回收 |
虚引用 PhantomReference | 类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQueue)联合使用 |
5. 资源配置文件的存储和读取
Java中资源配置文件的存储和读取主要使用 Properties 类,该类继承自Hashtable,因为配置文件以字符串来存储,所以该类的键值对必须是String类型。下面给出 Properties 类中常用的方法:
方法 | 简介 |
---|---|
setProperty(String key,String value) |
设置资源配置文件的项目 |
getProperty(String key) |
获取配置选项,不存在返回空 |
getProperty(String key, String defaultValue) |
获取配置选项,不存在返回后面的默认值 |
store(OutputStream out, String comments) |
以输出流的格式将资源配置保存到 .properties 文件 |
store(Writer writer, String comments) |
以字符流的格式将资源配置保存到 .properties 文件 |
storeToXML(OutputStream os, String comment) |
以输出流的格式将资源配置保存到 .xml 文件,默认是UTF-8编码 |
storeToXML(OutputStream os, String comment, String encoding) |
以输出流的格式将资源配置保存到 .xml 文件,同时指定编码格式 |
load(InputStream inStream) |
以输入流的格式,从 .properties 文件中读取资源配置信息 |
load(Reader reader) |
以字符流的格式,从 .properties 文件中读取资源配置信息 |
loadFromXML(InputStream in) |
以输入流的格式,从 .xml 文件中读取资源配置信息 |
以上是 Properties类 中常用的方法,下面举出几个实例:
实例1: 资源配置文件的存储和读取
import java.util.Properties;
public class Demo01 {
public static void main(String[] args) {
Properties pro = new Properties();
// 资源配置文件的存储
pro.setProperty("driver","oracle.jdbc.driver.OracleDriver");
pro.setProperty("url","jdbc:oracle:thin:@localhost:1521:orcl");
pro.setProperty("name","Tom");
pro.setProperty("pwd","tiger");
// 资源配置文件的读取
String name = pro.getProperty("name");
String value = pro.getProperty("value","default value");
System.out.println(name); // 读取成功,获取配置文件中的信息
System.out.println(value); // 读取失败,配置文件中没有该信息,获取到指定的默认值
}
}
实例2: 将配置信息输出到外部文件中
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class Demo02 {
public static void main(String[] args) throws IOException {
Properties pro = new Properties();
// 资源配置文件的存储
pro.setProperty("driver", "oracle.jdbc.driver.OracleDriver");
pro.setProperty("url", "jdbc:oracle:thin:@localhost:1521:orcl");
pro.setProperty("name", "Tom");
pro.setProperty("pwd", "tiger");
// 资源配置文件的输出
pro.store(new FileOutputStream(new File("db.properties")), "db配置文件");
pro.storeToXML(new FileOutputStream(new File("src/others/db.xml")), "db配置文件");
}
}
实例3: 从外部文件中读取配置信息
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class Demo03 {
public static void main(String[] args) throws FileNotFoundException, IOException {
Properties pro = new Properties();
// 从外部文件中读取资源配置信息
// pro.load(new FileReader("db.properties"));
pro.loadFromXML(new FileInputStream("db.xml"));
// 读取配置信息
String name = pro.getProperty("name");
String value = pro.getProperty("value", "default value");
System.out.println(name); // 读取成功,获取配置文件中的信息
System.out.println(value); // 读取失败,配置文件中没有该信息,获取到指定的默认值
}
}