JAVA集合

本文详细介绍了Java集合框架中的Set、List和Map三大类,包括ArrayList、Vector、LinkedList等list集合的特性,HashSet、TreeSet和LinkedHashSet的无序特性,以及HashMap、TreeMap和LinkedHashMap的映射结构。重点讲解了各类型在性能、操作和应用场景上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Java集合分类

    Java结合在包java.util中,主要分为,set(集)、list(列表,包含Queue)、Map(映射)

    其中、set、list、queue的基本接口是Collection,Map是映射表的基础接口。

    Iterator是迭代器,可以通过集合的迭代器,遍历集合中的数据。

  • list集合包括ArrayList、Vector、LinkedList。
  • set集合包括HashSet、TreeSet、LinkedHashSet。
  • Queue——两端出入的list,可以用数组和链表来实现。

二、list集合

    有序的Collection。

2.1 ArrayList

    最常用的list集合,底层实现为数组,可实现list元素的快速访问。

    缺点:当list大小不满足,需要增加存储空间时,需要将整个数组移动到新的存储空间;另由于数组不能有空隙,所以插入或者删除list中间一个位置时,需要移动list数组的位置,代价比较高。

    所以ArrayList数组适合查询和遍历,不适合插入和删除

    一个有意思的错误,Arrays.asList()方法,将数组转换成list集合,不能使用修改集合的相关方法,如add/clear/remove,只能查询遍历。

    如下代码,会抛出UnsupportedOperationException。

public void Test1(){
        String[] strings = new String[3];
        strings[0] = "one";
        strings[1] = "two";
        strings[2] = "three";

        List<String> list = Arrays.asList(strings);

        list.add("four");
    }

    至于原因,可以看下asList()方法的源码,如下,返回的为a,有final修饰符,不能修改数组的大小。

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

        @Override
        public int size() {
            return a.length;
        }

        @Override
        public Object[] toArray() {
            return a.clone();
        }
  .....
}

2.2 Vector

    底层一样为数组实现,不过是线程安全的,某一个时刻,只能有一个线程访问,所以速度慢。

2.3 LinkedList

    LinkedList本质上是双向链表,支持快速的插入和删除,只需修改对应位置元素的前后信息即可,随即访问和遍历速度比较慢。

    同时LinkedList有专门操作表头和表位的元素方法,适合当做栈、队列和双向队列来使用。

三、Set

    无序的Collection,即存入顺序和读出顺序不一致,值不能重复。Set比较两个元素是否一致,是通过元素的hashCode值(Java根据对象的内存地址计算出此序号)和equals方法来判断,hashCode值相等并且equals为true,才认为两个值相等。

3.1 hashSet

    按元素的hashCode来存储数据,如果两个元素hashCode相同,equals为false,两个元素存储在同个hashCode值得桶中,有点类似hashMap。

3.2 TreeSet

    TreeSet利用二叉树的原理,对新add()进来的元素进行排序(升序或者降序),排序的依据为元素对象的Comparable接口的compareTo()函数的返回值,所以Integer和String(已有默认的compareTo()方法实现)可以自动排序,自定义对象要实现TreesSet的排序,需要继承Comparable接口,重写comparTo()方法。类似的还有TreeMap。

四、Map

    Map是Java的映射集合,主要使用的实现对象有hashMap、concurrentHashMap、TreeMap、LinkedHashMap

4.1 hashMap和concurrentHashMap

    这两个不多说,其他文章中已经有所研究。

4.2 TreeMap

    实现元素的排序,元素需要实现Comparable接口的compareTo()方法。

4.3 LinkedHashMap

    linkedHashMap是hashMap的一个子类,最大的特点是记录插入的顺序,iterator迭代器遍历元素时,输出的元素是插入的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值