63-集合工具类

集合工具类

Stack栈操作

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

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

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

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

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

Stack类继承结构
66pzz8.png

实现栈的操作

package per.lyz.demo;

import java.util.Stack;

public class Set_Util {
	public static void main(String[] args) {
		Stack<String> all = new Stack<String>();
		all.push("hello");
		all.push("World");
		System.out.println(all.pop());
		System.out.println(all.pop());
		System.out.println(all.pop());		//无数据	-- throws java.util.EmptyStackException
	}
}

  通过此时的操作可以发现,所有保存在栈内的数据将按照倒序的形式进行弹出,如果栈已经空了,则抛出“EmptyStackException” 异常

Queue队列

  Queue描述的是一个对了,队列的主要特点是先进先出,其基本操作形式如下:
66Acpn.png

  如果将队列应用在多线程的“生产者与消费者”的模型处理上,那么对于生产者过快的情况下就没有必要等待消费者获取数据了,可以直接将内容保存在队列之中。
  队列的实现可以使用LinkedList子类来完成。
Queue继承结构
66EC9A.png
  队列的使用主要依靠Queue接口中提供的方法:

  • 向队列中追加数据:public boolean offer(E e);,可以直接使用add()方法
  • 通过队列获取数据:public E poll(),弹出后删除数据

Queue队列处理

package per.lyz.demo;

import java.util.LinkedList;
import java.util.Queue;

public class Set_Util {
	public static void main(String[] args) {
		Queue<String> queue = new LinkedList<String>();
		queue.offer("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实现优先级队列(比较功能)。
66VOoD.png

PriorityQueue优先级队列

package per.lyz.demo;

import java.util.PriorityQueue;
import java.util.Queue;

public class Set_Util {
	public static void main(String[] args) {
		Queue<String> queue = new PriorityQueue<String>();
		queue.offer("X");		//在队尾追加数据
		queue.offer("A");
		queue.offer("Z");
		System.out.println(queue.poll());		//弹出队头数据-A
		System.out.println(queue.poll());		//弹出队头数据-X
		System.out.println(queue.poll());		//弹出队头数据-Z
		System.out.println(queue.poll());		// null
	}
}

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

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)普通设置属性
public String getProperty(String key)普通获取属性,key存在的情况
public String getProperty(String key,String default value)普通取得属性,不存在返回默认值
public void store(OutputStream out,String comments) throws IOException普通输出属性内容
public void load(InputStream inStream) throws IOException普通读取属性内容

属性设置和取得

package per.lyz.demo;

import java.util.Properties;

public class Set_Util {
	public static void main(String[] args) {
		Properties prop = new Properties();
		//只允许为字符串
		prop.setProperty("lyz", "test");
		prop.setProperty("zky", "ttest");
		System.out.println(prop.getProperty("lyz"));
		System.out.println(prop.getProperty("we", "NoFound"));
		System.out.println(prop.getProperty("we"));
	}
}

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

将属性内容保存到文件

package per.lyz.demo;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;

public class Set_Util {
	public static void main(String[] args) throws Exception {
		Properties prop = new Properties();
		//只允许为字符串
		prop.setProperty("lyz", "test");
		prop.setProperty("zky", "ttest");
		prop.setProperty("Beijing", "北京");
		prop.store(new FileOutputStream(new File("C:\\Project\\Java_study\\src\\文件\\info.properties")), "中文看不见-EnglishCan");
	}
}

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

package per.lyz.demo;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

public class Set_Util {
	public static void main(String[] args) throws Exception {
		Properties prop = new Properties();
		prop.load(new FileInputStream(new File("C:\\Project\\Java_study\\src\\文件\\info.properties")));
		System.out.println(prop);
	}
}

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

Collections工具类

  Collections是Java提供的一组几何数据的操作工具类,利用其可以实现各个集合的操作。
Collections结构
66lSqs.png

Collections操作List集合

package per.lyz.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Set_Util {
	public static void main(String[] args) throws Exception {
		List<String> all = new ArrayList<String>();
		Collections.addAll(all, "hello","World","Mldn");
		System.out.println(all);
	}
}

翻转List集合

package per.lyz.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Set_Util {
	public static void main(String[] args) throws Exception {
		List<String> all = new ArrayList<String>();
		Collections.addAll(all, "hello","World","Mldn");
		System.out.println(all);
		Collections.reverse(all);
		System.out.println(all);
	}
}

使用二分查找

package per.lyz.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Set_Util {
	public static void main(String[] args) throws Exception {
		List<String> all = new ArrayList<String>();
		Collections.addAll(all, "hello","World","Mldn");
		Collections.sort(all);		//先进行排序处理
		System.out.println(Collections.binarySearch(all, "hello"));
	}
}

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

面试:请解释Collection和Collections的区别?

  • Collection是集合的接口,允许保存单值对象;
  • Collections是集合操作的工具类。
  • 两者没有本质联系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值