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);      // 读取失败,配置文件中没有该信息,获取到指定的默认值
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容