黑马程序员——Java基础---集合(Collection和List)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
集合类
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
之前我们存储大量对象的引用,使用数组;
对象数组的弊端:
1.对于数组,定义时,经常要使用”长度”信息。而大部分时候,我们不会先期的知道具体数量;
2.当数组一旦初始化后,其长度是不可变的;Java中的数组,其长度是不可变的;
所以,对于使用数组存储大量对象,不是一个很方便的工具;
所以,编程语言又为我们准备了一种强大的”容器”,叫:集合
数组和集合类同是容器,有何不同?
对象数组内存图解:
对象数组内存图解
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
关系图
“连接池(Connection接口)”这一概念就是数据库服务器的一个开放连接集。
集可以是有限的,也可以是无限的。
“集合框架”由一组用来操作对象的接口组成。
在“集合框架”中,接口Map和Collection在层次结构没有任何亲缘关系,它们是截然不同的(Map的典型应用是访问按关键字存储的值。它支持一系列集合操作的全部,但操作的是键-值对,而不是单个独立的元素)。返回Map对象的Set视图的方法:
Setset = aMap.keySet();

“集合框架”四个基本接口的层次结构:
Collection接口是一组允许重复的对象。
Set接口继承Collection,但不允许重复。
List接口继承Collection,允许重复,并引入位置下标。
Map接口既不继承Set也不继承Collection。
集合的继承体系图解:
集合的继承体系图解
Collection接口
Collection接口概述
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
Collection的基本方法
一些简单方法:
一.添加元素:(注:一些方法的形参和返回值,如果是E,大家把它先理解为Object)
boolean add(E e):向集合中添加一个元素。如果此 collection 由于调用而发生更改,则返回 true。
二.删除元素:
boolean remove(Object o):从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
更确切地讲,如果此 collection 包含一个或多个满足 (o==null ? e==null : o.equals(e)) 的元素 e,则移除这样的元素。
如果此 collection 包含指定的元素(或者此 collection 由于调用而发生更改),则返回 true 。
void clear():清空集合
三.判断:
boolean contains(Object o):如果此 collection 包含指定的元素,则返回 true。
更确切地讲,当且仅当此 collection 至少包含一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,返回 true。
boolean isEmpty():判断集合是否为空;
四.获取:
int size():返回集合内元素的数量;
Collection中一些对批量元素进行操作的方法:
boolean addAll(Collection c):将参数集合中的内容,全部添加到当前集合中。
boolean removeAll(Collection c):移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。此调用返回后,collection 中将不包含任何与指定 collection 相同的元素。
boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的”所有元素”,则返回 true。
boolean retainAll(Collection c):移除此 collection 中未包含在指定 collection 中的所有元素。
Collection中用于遍历元素的方法:
Object[] toArray():
把集合转成数组,可以实现集合的遍历

Iterator iterator():
    迭代器,集合的专用遍历方式
java.util.Iterator(接口):
     boolean hasNext() :如果仍有元素可以迭代,则返回 true。 
     Object next():返回迭代的下一个元素。 
     void remove() : 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

Iterator的原理:
interface Iterator{
boolean hasNext();
Object next();
void remove();
}
interface Collection{
Iterator iterator();
}
class ArrayList implements Collection{
//重写父类方法
//父类,定义了一个规则:子类必须要有一个迭代器,用于遍历元素;
public Iterator iterator(){
return new Itr();
}

private class Itr implements Iterator{
    boolean hasNext(){//实现}
    Object next(){//实现}
    void remove(){//实现}
}

}

class LinkedList implements Collection{
public Iterator iterator(){
return new Itr();
}
private class Itr implements Iterator{
boolean hasNext(){//实现}
Object next(){//实现}
void remove(){//实现}
}
}
迭代器使用图解和原理解析:
迭代器使用图解和原理解析:
迭代器遍历数组:
遍历数组
List接口
List接口概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。
List的子类特点
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。

List有三个儿子,我们到底使用谁呢?
    看需求(情况)。

要安全吗?
    要:Vector(即使要安全,也不用这个了,后面有替代的)
    不要:ArrayList或者LinkedList
        查询多:ArrayList
        增删多:LinkedList

数组和链表:
底层数据结构数组和链表分析
List的常用方法:有序的(取出时,跟存入的顺序相同)。
* 允许重复元素;
* 以下方法是List接口增加的一些方法:
* void add(int index,Object element):向index的位置,插入一个对象element;index >= 0 && index <= size()
* Object remove(int index):移除index位置上的元素。返回值为删除的对象;
* Object get(int index):获取index位置上的元素;
* Object set(int index,Object element):使用element替换原index位置上的元素;
* ListIterator listIterator():ListIterator继承自Iterator,增加了向上遍历的功能。
List存储自定义对象:
List存储自定义对象
ListIterator的并发修改异常:
* ListIterator的并发修改异常:
* 当我们通过”迭代器”遍历元素时,通过list去修改成员,这时会导致list中的内容与”迭代器”中的内容不符,所以,就会产生并发修改异常:java.util.ConcurrentModificationException
*
* 所以这里注意:
* 1.当我们使用迭代器遍历时,如果想同时添加数据,那么就用迭代器的add方法添加;
* 2.如果使用list遍历,那么就用list的add方法添加;
ArrayList类
ArrayList类概述
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
ArrayList案例
存储字符串并遍历
public class Demo {
public static void main(String[] args) {
MyArrayList list = new MyArrayList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
for(int i = 0;i < 10000000 ; i++){
list.add(String.valueOf(i));
}
System.out.println(“我的集合的size() = ” + list.size());
}
}
Vector类
Vector类概述
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList类
LinkedList类概述
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
自己实现的链表结构
public class Demo {
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);

    list.insert(0, "xxx");

    list.printAll();
}

}
LinkedList类特有功能
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值