Java学习——day 13

主要内容

  • 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<Quest> q = new ArrayDeque<Quest>();

        // 分别将三个元素添加到队列中,三个元素的添加顺序是:
        // 当前是第1位客户在办理业务
        // 当前是第2位客户在办理业务
        // 当前是第3位客户在办理业务
        for (int i = 1; i < 4; i++) {
            final int num = i;
            ((ArrayDeque<Quest>) 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<T> {
    private Deque<T> container = new ArrayDeque<T>();
    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<String> c = new MyStack<String>(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<String> nameVector = new Vector<String>();
        
        nameVector.add("fengzhen");
        nameVector.add("Tom");
        nameVector.add("Jack");
        nameVector.add("Jane");
        
        // 需要注意的是:Vector类型对象的elements()方法返回一个Enumeration独享
        // 这一点和Iterator也是类似的
        Enumeration<String> 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);      // 读取失败,配置文件中没有该信息,获取到指定的默认值
    }
}

猜你喜欢

转载自blog.csdn.net/fengzhen8023/article/details/85984294
今日推荐