集合工具类
Stack栈操作
栈是一种先进后出的数据结构。例如:文本编辑器都有撤销功能,那么每次使用的时候你会发现最后一次的编辑操作永远是最先撤销,这个功能就是利用栈来实现的,栈的基本操作形式:
在Java程序中使用Stack来描述栈的操作,这个类的定义如下:
public class Stack<E> extends Vector<E>
可以发现Stack是Vector的子类,但是它使用的并不是Vector类中所提供的的方法,而是采用如下的两个方法:
- 入栈:
public E push(E item)
- 出栈:
public E pop()
实现栈的操作
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描述的是一个对了,队列的主要特点是先进先出,其基本操作形式如下:
如果将队列应用在多线程的“生产者与消费者”的模型处理上,那么对于生产者过快的情况下就没有必要等待消费者获取数据了,可以直接将内容保存在队列之中。
队列的实现可以使用LinkedList子类来完成。
Queue继承结构
队列的使用主要依靠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实现优先级队列(比较功能)。
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结构
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是集合操作的工具类。
- 两者没有本质联系