Java笔记12-25

本文详细介绍了Java中的Vector容器类与ArrayList、Stack和LinkedList的区别,包括线程安全性、扩容策略以及各自的操作方法。特别强调了Stack作为后进先出的数据结构。
摘要由CSDN通过智能技术生成

Vector容器类

Vector底层也是用数组来实现的,与ArrayList相比线程更安全,相关的方法都加了同步检查,因此“线程安全,效率低”。比如,indexOf方法就增加了synchronized同步标记。

Vector的使用

Vector的使用与ArrayList是相同的,因为他们都实现了List接口,对List接口中的抽象方法做了具体实现。
示例代码:

import java.util.List;
import java.util.Vector;

public class VectorTest {
    public static void main(String[] args) {
        // 实例化Vector
        List<String> vec = new Vector<>();
        vec.add("1");
        vec.add("2");
        vec.add("1");

        for (int i = 0; i < vec.size(); i++) {
            System.out.println(vec.get(i));
        }
        System.out.println("----------");
        for (String str:vec) {
            System.out.println(str);
        }
    }
}

Vector扩容分析

容器在创建是容量就是10,这点与ArrayList不同,而且扩容时是以原来两倍扩容。

Stack容器

Stack容器介绍

Stack栈容器,是Vector的一个子类,它实现了一个标准的后进先出的栈(LIFO:Last In Frist Out)

Stack特点

后进先出,通过5个操作方法对Vector进行扩展,允许将向量视为堆栈。

操作栈的方法
方法说明
boolean empty()测试如果这个栈是空的,返回true,否则返回false
E peek()查看栈顶元素
E pop()删除栈顶元素,并返回删除的元素对象(出栈)
E push(E item)将一个元素添加到栈顶(入栈)
int search(Object o)在栈中查找Object o对象的位置,如果查找到则返回元素位置,如果找不到则返回-1
Stack的使用

示例代码:

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        // 实例化栈容器
        Stack<String> stack_1 = new Stack<>();

        // 将元素添加到栈容器中
        stack_1.push("1");
        stack_1.push("2");
        stack_1.push("3");

        // 判断栈容器是否为空
        System.out.println(stack_1.empty());

        // 查看栈顶元素
        System.out.println(stack_1.peek());

        // 返回元素在栈容器中的位置
        System.out.println(stack_1.search("3"));

        // 获取栈容器中的元素
        String pop_1 = stack_1.pop();
        System.out.println(pop_1);
        pop_1 = stack_1.pop();
        System.out.println(pop_1);
        pop_1 = stack_1.pop();
        System.out.println(pop_1);

    }
}

栈操作是从栈顶向栈底操作的,所以搜索元素时,栈顶为起始位置,而且栈元素索引以1为开头。

Stack的使用案例

判断元素的对称性

String str = "{[()]}";
    // 匹配符号的对称性
    public void symmetry() {
        String str = "{[()]}(";
        // 实例化Stack
        Stack<String> stack1 = new Stack<>();

        // 标志位
        boolean flag = true;
        // 拆分字符串获取字符串的字符
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == '{') {
                stack1.push("}");
            }
            if (c == '[') {
                stack1.push("]");
            }
            if (c == '(') {
                stack1.push(")");
            }
            // 判断符号是否匹配
            if (c == '}' || c == ']' || c == ')') {
                if(stack1.empty()) {
                    flag = false;
                    break;
                }
                String x = stack1.pop();
                if (x.charAt(0)!=c) {
                    flag = false;
                    break;
                }
            }
        }
        if (!stack1.empty()) {
            flag = false;
        }
        System.out.println(flag);
    }

LinkedList容器类

LinkedList底层用双向链表实现存储。特点:查询效率低,增删效率高,线程不安全。双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。

双向链表

class Node<E> {
	E item;
	Node<E> next;
	Node<E> prev;
}

LinkedList的使用(List标准)

LinkedList实现了List接口,所以LinkedList是具备List的存储特征的(有序,且元素可以重复)。
示例代码:

import java.util.LinkedList;
import java.util.List;

public class LinkedListTest {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        // 添加元素
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        // 获取元素
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("----------");
        for (String str:list) {
            System.out.println(str);
        }
    }
}

LinkedList的使用(非List标准)

操作双向链表

方法说明
void addFirst(E e)将指定元素插入到开头
void addLast(E e)将指定元素插入到结尾
getFirst()返回此列表的第一个元素
getLast()返回此列表的最后一个元素
removeFirst()移除此列表中的第一个元素,并返回这个元素
removeLast()移除此列表中的最后一个元素,并返回这个元素
E pop()从此列表所表示的堆栈处弹出一个元素,等效于removeFirst
void push(E e)将元素推入此列表所表示的堆栈,等效于addFirst(E e)
boolean isEmpty()判断列表是否包含元素,如果不包含元素则返回true

示例代码:

import java.util.LinkedList;
import java.util.List;

public class LinkedListTest {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        // 添加元素
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        // 获取元素
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("----------");
        for (String str:list) {
            System.out.println(str);
        }
        System.out.println("-----LinkedList-----");
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.addFirst("1");
        linkedList.addFirst("2");
        linkedList.addFirst("3");
        for (String str:linkedList) {
            System.out.println(str);
        }
        System.out.println("----------");
        LinkedList<String> linkedList_1 = new LinkedList<>();
        linkedList_1.addLast("1");
        linkedList_1.addLast("2");
        linkedList_1.addLast("3");
        for (String str:linkedList_1) {
            System.out.println(str);
        }
        System.out.println("___________");
        System.out.println(linkedList.getFirst());
        System.out.println(linkedList.getLast());
        System.out.println("----------");
        linkedList.removeFirst();
        linkedList.removeLast();
        for (String str:linkedList) {
            System.out.println(str);
        }
        System.out.println("----------");
        linkedList.addFirst("4");
        linkedList.pop();
        for (String str:linkedList) {
            System.out.println(str);
        }
        System.out.println("----------");
        linkedList.push("5");
        for (String str:linkedList) {
            System.out.println(str);
        }
        System.out.println(linkedList.isEmpty());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值