Java集合

关系图

在这里插入图片描述

原理

List、Set、Map的区别?

List接口存储一组有序可重复的对象集合;
Set存储一组无序不可重复的对象集合;
Map存储具有映射关系的键值对的集合

ArrayList与LinkedList的区别?

ArrayList:存放Object对象的可变长数组
LinkedList:双向链表,因为它实现了Deque接口和List接口
Vector:类似于LinkedList,它的大部分方法都包括synchronized关键字,它是线程安全的。可以由两个线程安全地访问同一个Vector对象,但是同一个线程访问Vector的话代码要在同步上耗费大量的时间。

  • 线程安全:ArrayList和LinkedList都是不同步的,不保证线程安全

  • 效率:ArrayList支持按索引快速随机访问,LinkedList不支持;插入和删除时间复杂度为O(n),LinkedList仅为o(1)

  • 内存占用:LinkedList每个元素比ArrayList更占空间,因为需要存放前驱和后继节点。

    HashMap

    LinkedList

    集合的方法

    Collection API

在这里插入图片描述

在这里插入图片描述

Stack类

方法功能
boolean empty()测试堆栈是否为空
Object peek( )查看堆栈顶部的对象,但不从堆栈中移除它
Object pop( )移除堆栈顶部的对象,并作为此函数的值返回该对象
Object push(Object element)把项压入堆栈顶部
boolean add(Object element)把项压入堆栈顶部
int search(Object element)返回对象在堆栈中的位置,以 1 为基数

LinkedList

链表

HashSet

方法功能
boolean add(E e)如果指定的元素尚不存在,则将其添加到此集合中
boolean remove(Object o)如果存在,则从该集合中移除指定的元素
boolean contains​(Object o)如果此set包含指定的元素,则返回 true
boolean isEmpty()如果此集合不包含任何元素,则返回 true
int size()返回此集合中的元素数(基数)
void clear()从该集中删除所有元素
Iterator iterator()返回此set中元素的迭代器
Object clone()返回此 HashSet实例的浅表副本:未克隆元素本身

List接口类

  • 遍历元素除了使用 for循环+get(), 还用迭代器
Iterator it=list.iterator();
while(it.hashNext()){
        System.out.println(it.next());
    }

void add(int index, Object element);
// 将元素插入到List集合的索引处
boolean addAll(int index, Collection c);
// 将集合c中的所有元素插入到List集合的索引处
Object get(int index);
// 返回索引处元素
int indexOf(Object o);
// 返回o在List集合中第一次出现的位置索引
int lastIndexOf(Object o);
// 返回o在List集合中最后一次出现的位置索引
Object remove(int index);
// 删除并返回index索引处的元素
Object set(int index, Object element);
// 将索引处的元素替换成element对象,返回被替换的旧元素
List subList(int fromIndex, int toIndex);
// 返回从索引fromIndex到索引toIndex(左闭右开区间)处所有集合元素组成的子集合

Map接口类

方法功能
void clear()删除Map对象中的所有key-value对
Object put(Object key, Object value)向集合中添加key-value对,若已有相等key的key-value对则会覆盖已有的key-value对
void putAll(Map m)将来自指定Map中的key-value对复制到本Map中
Object remove(Object key)删除指定key对应的key-value对,返回被删除key所关联的value对;若该key不存在,返回null
boolean remove(Object key, Object value)删除指定key、value所对应的key-value对;成功删除返回true,否则返回false
boolean containsKey(Object key)查询Map中是否包含指定的key,包含则返回true
Set entrySet()返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象
Object get(Object key)返回指定key所对应的value;若不包含该key,则返回null
boolean isEmpty()判断集合元素个数是否为0
Set keySet()返回该Map中所有key组成的Set集合
int size()返回该Map中的key-value对数量
Collection values()返回该Map中所有value组成的Collection集合
Object getKey()返回该Entry里包含的key值
Object getValue()返回该Entry里包含的value值
Object setValue(V value)设置该Entry里包含的value值,并返回新设置的value值

HashMap

方法功能
void clear()删除 hashMap 中的所有键/值对
Object clone()复制一份 hashMap
boolean isEmpty()判断 hashMap 是否为空
int size()计算 hashMap 中键/值对的数量
V put()将键/值对添加到 hashMap 中
void putAll()将所有键/值对添加到 hashMap 中
putIfAbsent()如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
V remove()删除 hashMap 中指定键 key 的映射关系
boolean containsKey()检查 hashMap 中是否存在指定的 key 对应的映射关系。
boolean containsValue()检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace() 替换hashMap 中是指定的 key 对应的 value。
replaceAll()将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
V get()获取指定 key 对应对 value
getOrDefault()获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach()对 hashMap 中的每个映射执行指定的操作。
Set<Map.Entry<K,​V>> entrySet()返回 hashMap 中所有映射项的集合集合视图。
Set keySet()返回 hashMap 中所有 key 组成的集合视图。
Collection values()返回 hashMap 中存在的所有 value 值。
merge()添加键值对到 hashMap 中
compute()对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent()对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent()对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

集合的算法题

用两个栈实现队列

用两个栈,栈A 模拟队列的元素入列,栈A的栈顶是队列元素入列的位置,当需要元素出列时,需要获取栈A的栈顶。因此用栈B倒序存放栈A的所有元素,栈A的栈底元素变成了栈B的栈顶元素,因此可以获取栈B的栈顶元素即为队列的出队元素。所以每次队列appendTail时,栈A push元素,栈B无操作。队列deleteTail时,如果栈B有元素,则pop出栈B的栈顶元素;否则,看栈A的情况,栈A没有元素则队列为空返回-1,有元素则将栈A 的所有元素依次pop出来再push到栈B,最后弹出栈B的栈顶元素即为队列的头元素。

package com.atguigu.com;

import java.util.Stack;

public class CQueue {
    private Stack<Integer> stackA;
    private Stack<Integer> stackB;

    public CQueue() {
        stackA = new Stack<>();
        stackB = new Stack<>();
    }

    void appendTail(int value){
        stackA.push(value);
    }

    int deleteHead(){
        if(!stackB.isEmpty()){
            return stackB.pop();
        }
        if(stackA.isEmpty()){
            return -1;
        }
        while(!stackA.isEmpty()){
            stackB.push(stackA.pop());
        }
        return stackB.pop();
    }

    public static void main(String[] args) {
        // 测试
        CQueue cQueue = new CQueue();
        cQueue.appendTail(2);
        cQueue.appendTail(3);
        System.out.println(cQueue.deleteHead());
        cQueue.appendTail(4);
        System.out.println(cQueue.deleteHead());
        System.out.println(cQueue.deleteHead());
        System.out.println(cQueue.deleteHead());
        System.out.println(cQueue.deleteHead());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值