Java集合类框架详解

集合是一个Java自带的框架,用于存储和操作一组对象,集合可以看做一个容器。

集合一般分为三个部分:

1.接口:抽象数据类型,例如java.util.Collection,java.util.Map等
2.实现类:ArrayList,LinkedList,HashMap,TreeMap,HashSet等
3.算法:searching,sorting and shuffling

集合中的基本继承和实现关系如下图所示:

在这里插入图片描述
文字大致描述关系如下:
List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
Collection接口下还有个Queue接口,有PriorityQueue类

关于各个集合实现类的区别如下:

ps:第一列是实现类名称,接下来是是否有序、是否随机存储、是否为键值类型、是否有重复元素、元素是否可以为空、是否线程安全。
在这里插入图片描述

各个集合类的特点简述

1.集合Collection
处于collection顶层,提供了了很多抽象⽅方法,size, isEmpty, contains, add, remove, iterator…等方法

2.迭代器Iterator
⽤用于顺序的迭代,遍历或者搜索一个集合

3.组合Set
不能包含重复元素、无序

4.列表List
能包含重复元素、有序

5.映射Map
key/value对,key唯一

6.队列Queue
队列列存放等待处理理的元素,顺序为FIFO(first-in,first-out)先进先出模式

7.双向队列Dequeue
和queue不同的是,它可以接受双向数据处理,全称double ended queue。

关于几个常用的集合类讲解

1.列表List

列列表是有序集合,它是继承与Collection的接⼝口。
列列表可以控制位置,可以在位置处插⼊入元素,基于搜索搜索元素

List类的方法:
1.int size()
2. boolean isEmpty()
3. boolean contains(Object o)
4. Iterator iterator()
5. Object[] toArray()
6. boolean add(E e): 在列列表末尾添加元素
7. boolean remove(Object o): 删除指定元素
8. boolean retainAll(Collection<?> c): 保留留包含在集合c中的元素
9. void clear()
10. E get(int index)
11. E set(int index, E element)
12. ListIterator listIterator()
13. List subList(int fromIndex, int toIndex)

ArrayList
是最常用的集合类之一
java.util.ArrayList 实现接口 java.util.List interface
ArrayList不是线程安全,性能更更好,除此之外和Vector一样
ArrayList可以包含重复元素,允许null
ArrayList是有序的,按序操作,可通过index访问元素
ArrayList默认10个元素数组,通过ensureCapacity(int minCapacity)
ArrayList Iterator是fail-fast,创建iterator后可执⾏行行除add/remove外,不可随意修改元素
推荐写法:List list = new ArrayList<>();

下面是一个关于ArrayList的简单demo

package com.list;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
    public static void main(String[] args) {
        List<String> all = new ArrayList<>();
        System.out.println("长度:" + all.size() +
                "  是否为空:" + all.isEmpty());
        all.add("hello");
        all.add("world");
        all.add("gyk");
        System.out.println("长度:" + all.size() +
                "  是否为空:" + all.isEmpty());
        for(int x = 0; x < all.size(); x++){
            String str = all.get(x);
            System.out.print(str + " ");
        }
    }
}

输出结果如下图:
在这里插入图片描述

映射Map

Map表示key-value键值对集合
Map提供三种视图:keys,values,key-value mapping
Map key必须唯⼀,但value可以重复
Map不保证顺序,依赖于实现。HashMap不保证顺序,TreeMap保证顺序
大部分Map类都是基于AbstractMap抽象类
Map使用在key上的hashCode和equals方法操作get和put操作

Map的方法
1.int size()
2. boolean isEmpty()
3. boolean containsValue(Object value)
4. V get(Object key)
5. V put(K key, V value)
6. V remove(Object key)
7. void putAll(Map<? extends K, ? extends V> m): Copies all of the mappings from the specified map to this map.
8. void clear()
9. Set keySet() keySet和Map是关联的
10. Collection values()
11. Set<Map.Entry<K, V>> entrySet() entrySet和Map关联,任何修改都会在各⾃自集合上体现

HashMap
最常⽤用的集合类之⼀
HashMap 基于hash表,继承⾃自 AbstractMap,它实现接⼝口 Map
HashMap允许null key和null value
HashMap是⽆无序的
HashMap除了了⾮非同步和允许null key/value,它和HashTable是⼀一样的
HashMap使⽤用链表实现map (entry)的存储,叫做bucket或者bin。默认箱空间是16,权值2
HashMap⾮非线程安全,对于多线程环境应该ConcurrentHashMap⽅方法。

HashMap工作原理
HashMap使⽤用内部类Node<K,V>存储键值对,同时HashMap基于hash算法,并使⽤用hashCode和equals⽅方法保证key的唯⼀性,
在这里插入图片描述
HashMap PUT
HashMap使⽤用链表存储hash值相同的键值对,叫做桶bucket
或垃圾箱bin。当调⽤用put⽅方法,它⾸首先通过hashCode找到
bucket。然后再⽤用hashCode检测是否链表不不存在,如果存
在继续⽐比较(⽬目的是找位置),就使⽤用equals⽅方法⽐比较
key,如果相同就覆写,否则创建新的键值对加⼊入改链表
(bucket)。如果key不不存在,键值对插⼊入bucket
HashMap GET
HashMap使⽤用hashCode⾸首先找到bucket,然后继续使⽤用hashCode和equals遍历链表找到元素,如果找到返回,如果找不不到,返回null。

下面是一个关于HashMap的简单demo

package com.map;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
    public static void main(String[] args) {
        Map<String, Integer> all = new HashMap<>();
        all.put("a", 1);
        all.put("b", 2);
        all.put("p", 4);
        all.put("w", 10);
        all.put("w", 18);
        all.put("c", 3);
        all.put(null, 0);
        System.out.println(all);
        System.out.println(all.get("c"));
    }
}

输出结果如下图:
在这里插入图片描述

迭代器Iterator

• ⽤于一个一个按顺序遍历集合
• Java 1.2开始支持,任何集合类都实现了了Iterator接口,也叫通用光标
• 支持读和删操作
• 相比Enumeration接口, Iterator更简单,可以完全替代
缺点:
不支持增和更新
Iterator仅支持“前进”,不能“倒退”
仅支持顺序便利,不支持平行,不支大数据(Spliterator)

下面是一个关于iterator的简单demo:

package com.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorOutput {
    public static void main(String[] args) {
        List<String> all = new ArrayList<>();
        all.add("Hello");
        all.add("gyk");
        all.add("hh");
        Iterator<String> iter = all.iterator();
        while(iter.hasNext()){
            String str = iter.next();
            System.out.println(str);
        }
    }
}

输出结果如下图:
在这里插入图片描述

组合Set

Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。
在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。

HashSet
HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;HashSet实现Set接口,底层由HashMap来实现,为哈希表结构,新增元素相当于HashMap的key,value默认为一个固定的Object。

下面是一个关于HashSet的简单:

package com.set;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
    public static void main(String[] args) {
        Set<String> all = new HashSet<>();
        all.add("gyk");
        all.add("hjr");
        all.add("hhh");
        System.out.println(all);
        System.out.println(all.size());
        all.remove("gyk");
        System.out.println(all);
        System.out.println(all.size());
    }
}

输出结果如下图:
在这里插入图片描述
TreeSet
与HashSet集合类似,TreeSet也是基于Map来实现,具体实现TreeMap,其底层结构为红黑树(特殊的二叉查找树),与HashSet不同的是,TreeSet具有排序功能,分为自然排序(123456)和自定义排序两类,默认是自然排序;在程序中,我们可以按照任意顺序将元素插入到集合中,等到遍历时TreeSet会按照一定顺序输出–倒序或者升序。

下面是一个用TreeSet排序的简单代码:

package com.set;
import java.util.TreeSet;
public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet<String> treeSetString = new TreeSet<String>();
        treeSetString.add("a");
        treeSetString.add("z");
        treeSetString.add("d");
        treeSetString.add("b");
        System.out.println("字母顺序:" + treeSetString.toString());

        TreeSet<Integer> treeSetInteger = new TreeSet<Integer>();
        treeSetInteger.add(1);
        treeSetInteger.add(24);
        treeSetInteger.add(23);
        treeSetInteger.add(6);
        System.out.println("数字顺序:" + treeSetInteger.toString());
    }
}

输出结果如下:
在这里插入图片描述
Java集合类库就介绍到这里,如果发现文章中错误,请直接评论,我会及时更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

囿于之间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值