集合工具类

Stack栈操作

  栈是一种先进后出的数据结构。例如:在文本编辑器上都有撤销功能,那么每次使用时可以发现,最后一次的编辑操作永远是最先撤销,那么这个功能就是利用栈来实现的,栈的基本操作形式如下:

Stack栈

  在Java程序中使用Stack来描述栈的操作,这个类的定义如下:

public class Stack<E> extends Vector<E>
Stack栈

可以发现Stack是Vector子类,但是它使用的并不是Vector类中所提供的方法,而是采用如下的两个方法:

  • 入栈:public E push​(E item)
  • 出栈:public E pop()

范例:实现栈的操作

import java.util.Stack;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Stack<String> all = new Stack<String> ();
        all.push("a");
        all.push("b");
        all.push("c");
        System.out.println(all.pop());//c
        System.out.println(all.pop());//b
        System.out.println(all.pop());//a
        System.out.println(all.pop());//Exception in thread "main" java.util.EmptyStackException
    }
}

通过上面的操作可以发现,所有保存的数据将按照倒序的形式弹出,如果栈已经空了,则会抛出空栈异常。

Queue队列

  Queue描述的是一个队列,而队列的主要特点是实现先进先出的操作形式。其基本的操作形式如下:

Queue

  如果将队列应用在多线程的“生产者与消费者”的模型处理上,那么对于生产者过快的情况下,就没有必要等待消费者或者数据了,可以将所有的内容保存在队列之中,队列的实现可以使用LinkedList子类来完成,观察这个类的定义:

LinkedList

  队列的使用主要依靠Queue接口之中提供的方法来处理,提供有如下方法:

  • 向队列中追加数据:boolean add​(E e)
  • 向队列中追加数据:boolean offer​(E e)
  • 通过队列获取数据(弹出不删除):E peek()
  • 通过队列获取数据(弹出并删除):E poll()

范例:实现队列操作

import java.util.LinkedList;
import java.util.Queue;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Queue<String> queue=new LinkedList();
        queue.add("X");//追加队列数据,通过队尾追加
        queue.offer("A");//追加队列数据,通过队尾追加
        queue.offer("Z");//追加队列数据,通过队尾追加
        System.out.println(queue.poll());//X
        System.out.println(queue.poll());//A
        System.out.println(queue.poll());//Z
        System.out.println(queue.poll());//null
    }
}

  除了LinkedList子类以外,还有一个优先级队列的概念,可以使用PriorityQueue实现优先级队列。这个类的定义如下:

public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable

public abstract class AbstractQueue<E> extends AbstractCollection<E> implements Queue<E>

public abstract class AbstractCollection<E> extends Object implements Collection<E>
PriorityQueue

范例:使用优先级队列

import java.util.PriorityQueue;
import java.util.Queue;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Queue<String> queue=new PriorityQueue();
        queue.add("X");//追加队列数据,通过队尾追加
        queue.offer("A");//追加队列数据,通过队尾追加
        queue.offer("Z");//追加队列数据,通过队尾追加
        System.out.println(queue.poll());//X
        System.out.println(queue.poll());//A
        System.out.println(queue.poll());//Z
    }
}

对于队列的选用原则也是需要根据实际的项目环境来决定的。

Properties属性操作

  在之前讲解国际化程序时讲解过资源文件(*.properties),这类文件的存储结构是按照“key=value”的形式存储的,而这种结构的保存形式与Map集合很相似,但是唯一的区别在于其保存的内容只能够是字符串,所以为了可以方便地描述属性的定义,java.util包中提供了Properties类型,此类是HashTable的子类。

public class Properties extends Hashtable<Object,Object>

可以发现在继承HashTable时为HashTable中定义的泛型为Object,Properties是不需要操作泛型的,因为它能够操作的类型只能是String类型,在Properties中如果想要实现属性的操作可以采用如下的方法实现:

  • 设置属性:
      public Object setProperty​(String key, String value)
  • 获取属性,key不存在返回null:
      public String getProperty​(String key)
  • 获取属性,key不存在返回默认值:
      public String getProperty​(String key, String defaultValue)
  • 输出属性内容:
      public void store​(OutputStream out, String comments) throws IOException
  • 通过输入流读取属性内容:
      public void load​(InputStream inStream) throws IOException

范例:观察属性的设置和取得

import java.util.Properties;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.setProperty("mldn", "www.baidu.com");
        props.setProperty("java", "www.baidujava.com");
        System.out.println(props.getProperty("mldn"));//www.baidu.com
        System.out.println(props.getProperty("sina"));//null
        System.out.println(props.getProperty("sina", "notFound"));//notFound
    }
}

通过代码可以发现Properties中可以像Map集合那样进行内容的设置与获取,但是唯一的差别是它只能够操作String类型,另外需要注意的是,之所以会提供Properties类还有一个最重要的功能是它可以通过输出流输出属性,也可以使用输入流读取属性内容。

范例:将属性内容保存在文件中

import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.setProperty("mldn", "www.baidu.com");
        props.setProperty("java", "www.baidujava.com");
        props.setProperty("city","杭州");
        props.store(new FileOutputStream(new File("/Users/david/Documents/mydir/mldn.properties")),"中文的注释-englishRemark");
    }
}

通过程序的执行发现,的确可以实现资源文件的输出处理,但是如果输出的是中文,则会自动进行Unicode转码处理。

范例:读取资源文件

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.load(new FileInputStream(new File("/Users/david/Documents/mydir/mldn.properties")));
        System.out.println(props.getProperty("mldn"));//www.baidu.com
        System.out.println(props.getProperty("java"));//www.baidujava.com
        System.out.println(props.getProperty("city"));//杭州
    }
}

  使用Properties类型的最大特点就是可以进行资源内容的输入与输出的处理操作,但是在实际开发中Properties往往用于读取配置资源的信息,这一点主要是在标准设计中做程序初始化准备时使用。

Collections工具类

  Collections是Java提供的一组集合数据的操作工具类,也就是说利用它可以实现各个集合的操作。
范例:使用Collections操作List集合

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all=new ArrayList();
        Collections.addAll(all, "Hello","world","MLDN");
        System.out.println(all);//[Hello, world, MLDN]
        Collections.reverse(all);
        System.out.println(all);//[MLDN, world, Hello]
    }
}

范例:使用二分查找

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all=new ArrayList();
        Collections.addAll(all, "Hello","world","MLDN");
        Collections.sort(all);//先进行排序处理
        System.out.println(all);//[Hello, MLDN, world]
        System.out.println(Collections.binarySearch(all, "MLDN"));//1
    }
}

  大部分情况下对于集合的使用可能没有这么多复杂要求,更多情况下就是利用集合保存数据,要么进行输出,要么进行查询。

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

推荐阅读更多精彩内容