Java的类集框架可大致分为两种,一是实现了Collection接口,二是实现了Map接口。Collection是一个独立的元素序列,这些元素符合一定的规则。而Map保存的是“键值对”,允许用户通过键来查找值。
某些框架已经过时,如vector,stack,新程序中应不再使用。
用基本类型构造类集框架时,必须使用包装类,编译器会自动进行开箱、装箱。
Collection接口的子类
List接口的子类
List可以将元素维护在特定的序列中,有两种类型的List:
- ArrayList随机访问速度快,在中间插入元素时效率低
- LinkedList随机访问较慢,但插入和删除元素效率高
- LinkedList类同时也继承了Queue接口
- 可以通过LinkedList实现Stack,Queue等数据结构
使用队列解决约瑟夫圈问题:
import java.util.LinkedList;
import java.util.Scanner;
class MyQueue<T>{
private LinkedList<T> storage = new LinkedList<T>();
public T removeFirst(){
return storage.removeFirst();
}
public boolean addLast(T t){
return storage.add(t);
}
@Override
public String toString() {
return storage.toString();
}
public int size(){
return storage.size();
}
}
public class TestLinkedList {
public static void main(String[] args) {
MyQueue<Integer> myQueue = new MyQueue<Integer>();
int size;
int round;
Scanner scanner = new Scanner(System.in);
size = scanner.nextInt();
round = scanner.nextInt();
scanner.close();
for (int i=1;i<=size;i++){
myQueue.addLast(i);
}
while (myQueue.size() > 1){
for(int i=1;i<round;i++){
Integer object = myQueue.removeFirst();
myQueue.addLast(object);
}
Integer first = myQueue.removeFirst();
}
System.out.println(myQueue);
}
}
Set接口及其子类
Set不会保存重复对象(类似于集合),Set具有与Collection同样的接口,没有添加其他属性。
- HashSet是查询速度最快的(通过散列的方式),但不会保存元素顺序
- TreeSet差迅速度略慢,但会进行自动排序(默认按字典序,可以传入比较器改变顺序)
public class TestTreeSet {
public static void main(String[] args) {
TreeSet<String> characters = new TreeSet<>();
for (char i = 65; i <= 65 + 25; i++) {
characters.add(String.valueOf(i));
characters.add(String.valueOf((char)(i + 32)));
}
Iterator<String> iterator = characters.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next());
}
System.out.println();
TreeSet<String> characters1 = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
for (char i = 65; i <= 65 + 25; i++) {
characters1.add(String.valueOf(i));
characters1.add(String.valueOf((char)(i + 32)));
}
Iterator<String> iterator1 = characters1.iterator();
while (iterator1.hasNext()) {
System.out.print(iterator1.next());
}
}
}
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- LinkedHashSet会通过散列进行较快查询,也能通过链表维护元素插入顺序
public class TestTreeSet {
public static void main(String[] args) {
TreeSet<String> characters = new TreeSet<>();
for (char i = 65; i <= 65 + 25; i++) {
characters.add(String.valueOf(i));
characters.add(String.valueOf((char)(i + 32)));
}
Iterator<String> iterator = characters.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next());
}
System.out.println();
LinkedHashSet<String> characters1 = new LinkedHashSet<>();
for (char i = 65; i <= 65 + 25; i++) {
characters1.add(String.valueOf(i));
characters1.add(String.valueOf((char)(i + 32)));
}
Iterator<String> iterator1 = characters1.iterator();
while (iterator1.hasNext()) {
System.out.print(iterator1.next());
}
}
}
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Map接口及其子类
Map存储的是一个键值对,可以快速方便的根据键值找出值。
- HashMap用来快速访问
- TreeMap因为要维护键的排序状态,查询速度慢
- LinkedHashMap以插入顺序保存元素,访问速度较快
- 可以通过迭代器输出Map中的键值对
public class TestHashMap {
public static void main(String[] args) {
HashMap<Integer,String> names = new HashMap<>();
names.put(1,"Andy");
names.put(2,"Lisa");
names.put(3,"Bob");
Iterator iterator = names.keySet().iterator();
while (iterator.hasNext()){
System.out.print(iterator.next());
}
System.out.println();
Iterator iterator1 = names.values().iterator();
while (iterator1.hasNext()){
System.out.print(iterator1.next());
}
}
}