初步了解-集合框架

本文详细介绍了Java集合框架的各类集合,包括List、Set和Map的主要实现形式及其特性。阐述了ArrayList、LinkedList、HashSet、TreeSet等集合的特点及适用场景,并对比了它们之间的差异。

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

1.三大集合框架

1.1.集合和数组的区别

a.集合和数组都是容器
b.数组长度不可以改变,但是可以存储基本数据类型
c.集合的长度可变,但是不能存储基本类型数据,可以存储任意类型的对象

1.2.集合的共同特性

集合都可以添加一个对象,删除一个对象,查找一个对象,以及修改一个对象。

1.3.单列集合-Collection

相比所有集合都有特性,Collection接口下比较特殊的方法有,removeAll(),addAll(),containsAll(),这些方法所操作的对象变为了一整个集合。

1.4.List与Set-实现Collection接口的两个接口

他们最大的区别是:
a.List可存放重复元素,元素存取是有序的(即线性的)
b.set不可以存放重复元素,元素存取是无序的(不带自然顺序的时候需要我们重写equals方法才可以判断是否是相同的元素)

1.5.实现List的类

实现List的类有很多:AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
其中,ArrayList、LinkedList最为常用。

1.5.1.ArrayList

ArrayList最大的特点是查找快,增删慢,为什么会这样?查看源码,可以发现ArrayList的实现是依靠数组(Object[])的,也就是说,通过索引值,我们可以快速定位到某个元素,但是当我们增删的时候,因为数组在内存中是连续存放的,所以我们需要移动拷贝元素,当数组不够大时,还要考虑到扩容问题(ArrayList默认大小为10,每次扩容大约增长到原来的1.5倍),因此比较耗时。

1.5.2.LinkedList

LinkedList最大的特点是增删快,查找慢,通过查看源码,不难发现,LinkedList是通过双向链表实现的,在内存中存放是不连续的,删除或者增加元素的时候,只需要修改元素节点指向就可以了,但当我们需要查询元素时,只能一个个去遍历,所以效率较低。

1.5.3.Vector

Vector用法基本同ArrayList,但是值得注意的是Vector是线程安全的,ArrayList是线程不安全的。Vector基本上使用很少,但当我们使用合并流的时候,需要使用到Vector。

1.6.实现Set的类

Set接口中的方法与collection相比,并没有额外的功能。其中实现它的类有:AbstractSet, ConcurrentHashMap.KeySetView, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet 。其中比较常用的有HashSet,LinkedHashSet,TreeSet 。

1.6.1.HashSet

HashSet的低层是依靠哈希表实现的,线程不安全,依靠hashCode方法来确定在内存中存放的位置。相比其他的Set,它的存取速度相对较快。
HashSet是如何判断元素是否相等?如下

If(hashCode得到的值与其他元素都不相同){
        If(与hashCode得到的值相同的元素使用equals方法进行比较,结果为true){
    两个元素为相同的元素!;
    }
    Else{
    放进去的元素不重复!;
    }
}
Else{
    放进去的元素重复!;
}

因此,当我们使用 HashSet时,需要重写hashCode,equals方法。

1.6.2.TreeSet

TreeSet最大的特点是可以将放进去的元素进行排序,实现依靠红-黑树,因此当元素没有自然顺序的时候,我们需要实现Comparable接口或者实现一个比较器Comparator,重写compareTo或者compare方法。

1.6.3.LinkedHashSet

LinkedHashSet特点是会保存元素的插入顺序,线程不安全,依靠哈希表和链接链表实现。相对于HashSet,迭代速度相对快,但是插入相对慢。

1.7.双列集合-Map

与Collection对比:
a.Map中存放的是键值对,一个键对应一个唯一的值,但是一个值不一定只对应一个键。
b.同时类似Set,Map中的键也是唯一的。
c.取出元素时,不能直接取出,三种方法获取,(1)通过keySet拿到一个set,再通过set里面的key拿到相应的values;(2)通过values 拿到所有的values,但不能拿到key;(3)通过Entry获得一个Set

1.7.1.Hashtable

低层依靠哈希表实现,线程安全,效率较低。不可以放入null键,null值。

1.7.2.HashMap

与LinkedHashMap相比,同样是依靠哈希表实现,效率较高,但是线程是不安全的,可以放入null键,null值。类似于HashSet,判断元素是否重复时,我们需要重写hashCode方法,和equals方法。

1.7.3.LinkedHashMap

与LinkedHashSet类似,低层依靠哈希表和双重链接列表实现,线程不安全,可以保存输入的顺序,输出的时候可以按照输入的顺序输出。

1.7.4.TreeMap

低层同样依靠红黑树算法,同样需要Comparable或者Comparator 对key进行排序,线程不安全。

1.8.什么使用情况下使用对应的框架?

If(存放的是对象){
    If(元素可以重复){
        If(线程不需要安全的){
            If(增删多,查询少){
                使用LinkedList;
            }
            Else if(增删多,查询少){
                使用ArrayList;
            }
        }
        Else if(线程需要安全的){
                使用Vector;
            }
    }
    Else if(元素不可以重复){
        If(需要对元素进行排序){
        使用TreeSet;
        }
        Else if(不需要对元素进行排序){
            If(需要保留存储顺序){
                使用LinkedHashSet;
        }
        Else if(不需要保留存储顺序){
            使用HashSet;
            }
        }
    }
}
Else if(存放的是键值对){
    If(需要对元素进行排序){
        使用TreeMap;
    }
    Else if(不需要对元素进行排序){
        If(需要保留存取顺序){
        使用LinkedHashMap;
    }
        Else if(不需要保留存取顺序){
        使用HashMap;
        }
    }
}
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 行列式是线性代数的核心概念,在求解线性方程组、分析矩阵特性以及几何计算中都极为关键。本教程将讲解如何用C++实现行列式的计算,重点在于如何输出分数形式的结果。 行列式定义如下:对于n阶方阵A=(a_ij),其行列式由主对角线元素的乘积,按行或列的奇偶性赋予正负号后求和得到,记作det(A)。例如,2×2矩阵的行列式为det(A)=a11×a22-a12×a21,而更高阶矩阵的行列式可通过Laplace展开或Sarrus规则递归计算。 在C++中实现行列式计算时,首先需定义矩阵类或结构体,用二维数组存储矩阵元素,并实现初始化、加法、乘法、转置等操作。为支持分数形式输出,需引入分数类,包含分子和分母两个整数,并提供与整数、浮点数的转换以及加、减、乘、除等运算。C++中可借助std::pair表示分数,或自定义结构体并重载运算符。 计算行列式的函数实现上,3×3及以下矩阵可直接按定义计算,更大矩阵可采用Laplace展开或高斯 - 约旦消元法。Laplace展开是沿某行或列展开,将矩阵分解为多个小矩阵的行列式乘积,再递归计算。在处理分数输出时,需注意避免无限循环和除零错误,如在分数运算前先约简,确保分子分母互质,且所有计算基于整数进行,最后再转为浮点数,以避免浮点数误差。 为提升代码可读性和可维护性,建议采用面向对象编程,将矩阵类和分数类封装,每个类有明确功能和接口,便于后续扩展如矩阵求逆、计算特征值等功能。 总结C++实现行列式计算的关键步骤:一是定义矩阵类和分数类;二是实现矩阵基本操作;三是设计行列式计算函数;四是用分数类处理精确计算;五是编写测试用例验证程序正确性。通过这些步骤,可构建一个高效准确的行列式计算程序,支持分数形式计算,为C++编程和线性代数应用奠定基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值