常用类集框架

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());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值