java集合小汇总

本来想着用一个全一点的图的。奈何找不到。也来不及自己做就将就用一下这个吧。
在这里插入图片描述
集合一般分成两个概念。

  1. Collection: List ,Queue , Set
  2. Map

对上面那张图没有加上Queue(一般Stack和Vector也属于List,Queue还包括PriorityQueue和Dqueue)

一、Collection:独立元素的序列
Collection的常用方法

boolean add(E e) - 用于将元素e放入当前集合中。
boolean addAll(Collection<? extends E> c)
- 用于将参数指定集合中的所有元素放入当前集合中。
boolean remove(Object o)
- 用于从当前集合中删除参数指定的元素。
boolean removeAll(Collection<?> c)
- 用于从当前集合中删除参数指定集合中的所有元素。
void clear()
- 用于将当前集合中的所有元素移除。
boolean contains(Object o)
- 用于判断当前集合中是否包含参数指定的单个元素。
- (onull ? enull : o.equals(e))
boolean containsAll(Collection<?> c)
- 用于判断当前集合中是否包含参数指定集合中的所有元素。
boolean isEmpty() - 用于判断当前集合是否为空。
int size() - 用于返回当前集合中元素的个数。
boolean retainAll(Collection<?> c)
- 用于获取当前集合和参数集合的交集并保留到当前集合中。
- 若当前集合中的内容发生了更改则返回true,否则返回false。

咳咳,一般向上转型也不至于转型到Collection。。。

1.List:Collection接口的子接口(不能List <>=new List<>)。按照插入的顺序保存元素
1.1接口的主要实现类有:ArrayList类、LinkedList类、Stack类以及Vector类。
其中ArrayList类的底层是动态数组实现的,因此增删不方便,访问元素方便;
其中LinkedList类的底层是采用链表实现的,因此增删方便,访问元素不方便;
其中Stack(栈)类的底层是采用动态数组实现的,用于描述一种具有后进先出特性的数据结构,简称为LIFO(last in first out)。
其中Vector类的底层是采用动态数组实现的,与ArrayList类相比属于早期的类,属于线程安全的类,因此效率比较低,推荐使用ArrayList类取代之。

1.2 List常用方法

void add(int index, E element)
- 用于将元素element插入到当前集合中index指向的位置。
boolean addAll(int index, Collection<? extends E> c)
- 用于将集合c中所有元素插入到当前集合中index指向的位置。
E remove(int index)
- 用于将index位置的元素从当前集合移除。
- 返回被删除的元素值,下标不合理时会产生下标越界异常。
E set(int index, E element)
- 使用element元素替换当前集合中index位置的元素,返回被替换的元素。
E get(int index)
- 用于返回当前集合中下标为index位置的元素。
List subList(int fromIndex, int toIndex)
- 用于返回当前集合中从fromIndex(包含)到toIndex(不包含)之间的部分视图。
- 返回的集合和当前集合共用同一块内存区域。

2.Queue
2.1.我写这篇文章的原因。正如那张图,很少有详讲Queue的
Queue是Collection接口的子接口,与List接口是平级关系。
该接口主要描述具有先进先出特性的数据结构,简称为FIFO(first in first out),叫队列
该接口的主要实现类是LinkedList类,因为该类在增删方面有一定的优势。
创建形式:

Queue<?> queue=new LinkedList<>();

2.2 Queue常用方法

boolean offer(E e) - 将参数指定的元素e插入到当前队列的末尾。
- 若插入成功则返回true,否则返回false。
E poll() - 用于从当前队列的队首移除一个元素并返回。
- 若当前队列为空,则返回null。
E peek() - 用于获取当前队列的队首元素并返回。
- 若当前队列为空,则返回null。

2.3 PriorityQueue
是Queue接口的实现类。队列规则声明下一个弹出的元素是最需要的元素。优先级队列声明下一个弹出元素具有最高优先级。
内部是一个二叉树实现的堆。堆顶具有最高权值
创建形式:()

Queue<?> q=new PriorityQueue<>();
PriorityQueue<?> q=new PriorityQueue<>();

默认是小根堆。即堆顶为最小值。
实现大根堆方法有

PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
    }
});
//简化版
PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));

//作者经常使用版(注意是Collections)
Queue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());

2.4 Deuque
Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的

Deque有三种用途:
普通队列(一端进另一端出):
Queue queue = new LinkedList()或Deque deque = new LinkedList()
双端队列(两端都可进出)
Deque deque = new LinkedList()
堆栈
Deque deque = new LinkedList()

常用方法(作为堆栈的使用自己查咯。本文仅总结)

addFirst(E):void 在队头添加元素。
addLast(E):void 在队尾添加元素。
offerFirst(E):boolean 在队头添加元素,并返回是否添加成功。
offerLast(E):boolean 在队尾添加元素,并返回是否添加成功。
removeFirst():E 删除队头元素,并返回删除的元素,如果队列为null,抛出异常。
removeLast():E 删除队尾元素,并返回删除的元素,如果队列为null,抛出异常。
pollFirst():E 删除队头元素,并返回删除的元素,如果队列为null,返回null。
pollLast():E 删除队尾元素,并返回删除的元素,如果队列为null,返回null。
getFirst():E 获取队头元素,如果队列为null将抛出异常。
getLast():E 获取队尾元素,如果队列为null将抛出异常。
peekFirst():E 获取队头元素,如果队列为null将返回null。
peekLast():E 获取队尾元素,如果队列为null将返回null。
removeFirstOccurrence(Object):boolean 删除第一次出现的指定元素,并返回是否删除成功。
removeFirstOccurrence(Object):boolean 删除最后一次出现的指定元素,并返回是否删除成功。

3 Set
java.util.Set接口是Collection接口的子接口,元素没有先后放入次序,并且不允许重复
该接口的主要实现类有:HashSet类 和 TreeSet类、LinkedHashSet类。
HashSet类的底层是采用哈希表进行数据管理的,遍历乱序。
TreeSet类的底层是采用二叉树进行数据管理的,遍历有序。
LinkedHashSet类可记录插入顺序,遍历时安插入顺序!

常用方法

该接口的常用方法参考Collection接口即可。
Iterator iterator() - 用于获取当前集合中的迭代器,用于迭代集合中的所有元素。
- 迭代就是遍历/访问的意思,通俗来说,使用该方法的返回值可以访问集合任意元素
Iterator接口中的常用方法有:
boolean hasNext() - 用于判断当前集合中是否拥有可以访问的元素。
E next() - 获取一个元素返回后并指向下一个元素。
void remove() - 用于删除集合中刚刚获取到的元素。

二 Map
java.util.Map<K,V>接口主要用于存放一对一对元素,分别叫做key(键)和value(值)。
类型参数:
K - 此映射所维护的键的类型
V - 映射值的类型
该集合中key是不允许重复的,而且每个key对应唯一的value。
该接口的主要实现类有:HashMap类 和 TreeMap类,LinkedHashMap类
(直接抄Set的用法,懂的都懂)
HashSet类的底层是采用哈希表进行数据管理的,遍历乱序。
TreeSet类的底层是采用二叉树进行数据管理的,遍历有序。
LinkedHashSet类可记录插入顺序,遍历时安插入顺序!

其实一直把set和map放一起。c++中他们两都是关联容器。底层都是红黑树(?),但是,C++中没有LinkedHashMap这种用法。当时做一道需要按照插入顺序输出的题。唉。。。。。

常用方法

V put(K key, V value) - 用于将参数指定的key和value组成一对放入当前集合中。
- 增加key和value时则返回null,修改key和value时则返回key之前对应的value。
V remove(Object key) - 用于从当前集合删除key关联的键值对。
- 若key不存在则返回null,否则返回key对应的value。
boolean containsKey(Object key)
- 用于判断当前集合中是否存在参数指定的key。
boolean containsValue(Object value)
- 用于判断当前集合中是否包含参数指定的value。
V get(Object key)
- 用于根据参数指定的key来返回对应的value。
Set<Map.Entry<K,V>> entrySet()
- 用于返回当前集合中包含映射关系的Set视图,通俗来说,就是把Map转换为Set。
Set keySet()
- 用于返回当前集合中包含key的Set视图。
java.util.Map.Entry<K,V>接口代表键值对,提供的方法有:
K getKey() - 用于获取当前键值对中key的数值并返回。
V getValue() - 用于获取当前键值对中value的数值并返回。

Map<Integer, String> map= new LinkedHashMap<>();
        map.put(45,"aa");
        map.put(2,"bb");
        map.put(6,"cc");

        //最常用的遍历
        for(Map.Entry<Integer,String> i:map.entrySet()){
            System.out.println(i.getKey()+" : "+i.getValue());
        }

        //迭代器遍历
        System.out.println();
        Iterator<Map.Entry<Integer,String>> itr=map.entrySet().iterator();
        while(itr.hasNext()){
            Map.Entry<Integer,String> i=itr.next();
            System.out.println(i.getKey()+" : "+i.getValue());
        }

        //遍历键值
        System.out.println();
        for(Integer i:map.keySet()){
            System.out.println(i);
        }

        //遍历values
        System.out.println();
        for(String i:map.values()){
            System.out.println(i);
        }

输出

45 : aa
2 : bb
6 : cc

45 : aa
2 : bb
6 : cc

45
2
6

aa
bb
cc

Process finished with exit code 0

其实还有一种lambda的遍历。只能说,花里胡哨

顺便加一些常用的方法。内容皆上面的

System.out.println();
        System.out.println(map.isEmpty());
        System.out.println(map.size());
        System.out.println(map.get(1));
        System.out.println(map.get(2));
        System.out.println(map.containsKey(1));
        System.out.println(map.containsValue("aa"));

输出如下

false
3
null
bb
false
true

温馨提示。注意null和false区别哦。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值