Java 拾遗二 『集合类』

Java 集合类




总结一下Java自带常用的集合类;

如果你发现有错误的地方,还请指正,以免误人误己,非常感谢。

集合类图

(参考: JDK 8, 非全量)




  • Iterable<T> 迭代器接口;实现该接口的对象允许”for-each loop”的形式遍历,也就是foreach。迭代器只能向前移动(专门用来遍历)。

  • Collection<E> 集合层次结构中的根接口。一个集合表示一组对象,称其为元素。有些集合允许重复元素,有些集合不允许。一些是有序的,另一些是无序的。提供一些集合通用的方法,例如:int size(); ,boolean add();…等方法。




List 接口

有序,可重复,它关注的是索引,可以精确的按照索引查找、移除元素。提供get(int index); remove(int index);…等方法。

具体实现类

  • ArrayList<E>内部是使用数组的形式存储元素的,它查询、随机访问,效率特别高,但是添加、插入、删除、需要确保内部顺序、容量,所以效率较低。非线程安全

  • LinkedList<E>内部是使用双向链表的数据结构储存元素,它与 ArrayList 恰恰相反,在添加、插入、删除方面没有容量问题,所以效率较高,但是查询,随机访问时需要遍历整个列表,所以效率非常低。非线程安全(还有一点,有人说它是无序,(╬ ̄皿 ̄)=○,它在物理内存中是无序的,但 在程序逻辑上它是有序,有序,有序的!)

  • Vector<E> 它与 ArrayList 非常相像,但 它是线程安全的,还有一个就是当容量不足时,默认扩容100%,而ArrayList 默认是 50%,它线程同步都是使用synchronized 关键词修饰方法,在效率上肯定低于 ArrayList 。




Set 接口

不允许重复的一组集合, 无索引,不能快速随机访问,提供方法:Iterator<E> iterator();可以返回它的迭代器,用于遍历,等等。

具体实现类

  • HashSet<E> 无序, 不允许重复,其实看看它的源码,就会发现,内部实例一个 HashMap ,用它的 key 存放元素,而value,都是存放同一个的Object空对象,也就是说可以存放一个null非线程安全

  • TreeSet<E> 有序, 内部使用红黑树 (二叉树的一种)的数据结构存储,不允许重复。虽然有序,但没有索引,只能通过遍历操作元素。非线程安全




Queue 接口

通常是先进先出 (但不一定必须是=.=)的一个集合,像排队一样,所以叫队列;有的叫阻塞队列(即:在获取元素时,如果队列为空,就会阻塞等待至队列不为空;在添加元素时,如果队列已满,就会阻塞等待队列可放入。),反之就叫非阻塞队列。


它提供方法:add(); 向队列添加元素,如果队列已满抛出 IllegalStateException ,peek();检查列头是否为空, poll();获取并移除列头的元素,等等

具体实现类

  • ArrayBlockingQueue<E> 使用数组实现的一个阻塞队列 , 似乎队列设计出来就是为了多线程使用,但它读写都是共用一个锁=。=。

  • LinkedBlockingQueue<E> 内部使用单向链表实现的阻塞队列,与 ArrayBlockingQueue 不同,读写锁分离。


Map 类图

Map接口

Map 是一组以key的hashCode映射value的组合,通过key可以快速获得其映射的value,key是不能重复的,如果重复将会覆盖掉上一个映射。提供方法:V put(K key, V value)映射一组key跟value到集合,V get(Object key)通过key获得其映射的value,void clear()清除所有映射关系,等。


它跟 IterableCollection 都毫无关系,硬要说有,Map要有key才能访问对应的value,需要遍历所有的话,Map 提供Set<K> keySet();返回一个包含所有key的Set;如果只需遍历value,提供Collection values();返回一个包含所有value的Collection

具体实现类

  • HashMap<K,V> 无序,可以有一个 key 为null 的Map,多次放入会覆盖上一个,非线程安全

  • Hashtable<K,V> 无序,不允许 key 为null 的Map,放入null会抛出空指针异常, 线程安全,只是单纯使用synchronize关键字实现。有人吐槽它的名字么?我就是我~ 是颜色不一样的烟火=.=

  • TreeMap<K,V> 它的key是有序的, 内部红黑树数据结构存储元素 ,非线程安全

  • ConcurrentHashMap<K,V> 无序,同样不允许 key 为null 的Map, 线程安全,它采用分段锁的形式实现,把整个列表,分成若干部分,写入时锁住修改的部分,这样其它其他线程仍然可以操作没有锁住的部分,大大提高并发数,读取时不加锁,其value使用了volatile关键字修饰,使得在不加锁的情况下,多线程读取数据总是最新的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值