黑马程序员——Java基础——集合类_1

集合类

集合框架_体系概述

对象多了用集合存,数据多了用对象存
数组和集合类容器的不同:
1. 数组也可以存储对象,但是长度是固定的,集合长度是可变的
2. 数组中可以存储基本数据类型,集合只能存储对象
集合类的特点:
1. 集合只用于存储对象
2. 集合长度是可变的
3. 集合可以存储不同类型的对象
Collection
- - List
- - - - ArrayList
- - - - LinkedList
- - - - Vector
- - Set
- - - - HashSet
- - - - TreeSet
集合框架_共性方法
集合中存储的都是对象的引用(地址)
集合框架_迭代器
迭代器:集合的取出元素的方式

ArrayList al = new ArrayList();
Iterator it1 = al.iterator();//获取迭代器,用于取出集合中的元素
while(it1.hasNext()){
    System.out.println(it1.next());
}
for(Iterator it2 = al.iterator(); it2.hasNext; ){
    System.out.println(it2.next());
}

集合框架_List集合共性方法
List:元素是有序的,元素可以重复,因为该集合体系有索引
- add(index,element);
- addAll(index,Collection);
- remove(index);
- set(index,element);
- subList(from,to);
- listIterator();
- indexOf(Object);
集合框架_ListIterator
在迭代过程中,集合的方法和迭代器方法不能同时使用,会发生ConcurrentModificationException
想要在迭代过程中准备添加删除等操作元素,需要使用List集合特有迭代器ListIterator
集合框架_List集合具体对象的特点
List
- - ArrayList:
- - - - - - 底层的数据结构使用的是数组结构(java 1.2)线程不同步
- - - - - - 查询速度快,但是增删稍慢
- - - - - - 可变长度数组,容器初始长度,在容器不够后,扩容50%
- - LinkedList:
- - - - - - 底层使用的是链表数据结构
- - - - - - 增删的速度很快,查询稍慢
- - Vector:
- - - - - - 底层是数组数据结构(java 1.0)线程同步
- - - - - - 增删查询都稍慢
- - - - - - 可变长度数组,容器初始长度,在容器不够后,扩容100%
集合框架_Vector中的枚举

public static void main(String[] args){
    //创建Vector集合对象v,并添加数据
    Vector v = new Vector();
    v.add("java1");
    v.add("java2");
    v.add("java3");
    v.add("java4");
    //将对象v中的元素放入枚举类对象中
    Enumeration en = v.elements();
    //循环枚举
    while(en.hasMoreElements()){
        System.out.println(en.nextElement());
    }
}

集合框架_LinkList
LinnkedList特有方法
- addFrist();
- addLast();
- getFrist();
- getLast();
获取元素,如果集合中没有元素,报NoSuchElementException异常
- removeFrist();
- removeLast();
删除元素,如果集合中没有元素,报NoSuchElementException异常
JDK 1.6出现了替代方法
- offerFrist()
- offerLast()
- peekFrist()
- peekLast()
获取元素,如果集合中没有元素,返回null
- pollFrist()
- pollLast()
删除元素,如果集合中没有元素,返回null
集合框架_LinkList练习

/*
使用LinkedList模拟一个堆栈或者列队数据结构
堆栈:先进后出
队列:先进先出
*/
public class TestLinkedList {
    public static void main(String[] args){
        DuiLie dl = new DuiLie();
        dl.myAdd("java01");
        dl.myAdd("java02");
        dl.myAdd("java03");
        dl.myAdd("java04");
        while(!dl.isNull()){
            System.out.println(dl.myGet());
        }
    }
}
class DuiLie{
    private LinkedList link;
    DuiLie(){
        link = new LinkedList();
    }
    public void myAdd(Object obj){
        link.addFirst(obj);
    }
    public Object myGet(){
        return link.removeLast();
    }
    public boolean isNull(){
        return  link.isEmpty();
    }
}

集合框架_ArrayList练习
List集合判断元素是否相同,依据的是元素的equals方法
在迭代循环中判断一次hasNext();才能使用一次next();

/*
去除ArrayList集合中的重复元素
*/
public class TestArrayList {
    public static void main(String[] args){
        ArrayList al = new ArrayList();
        al.add("java01");
        al.add("java02");
        al.add("java01");
        al.add("java02");
        al.add("java03");
        System.out.println(singleElement(al));
    }
    public static ArrayList singleElement(ArrayList al){
        //private ArrayList al;
        ArrayList newAl = new ArrayList();
        Iterator it = al.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            if(!newAl.contains(obj))
                newAl.add(obj);
        }
        return newAl;
    }
}
/*
将自定义对象作为元素,存储到ArrayList集合中,并去除重复元素
*/
public class TestArrayList2 {
    public static void main(String[] args){
        ArrayList al = new ArrayList();
        al.add(new Person("dillinger", 18));
        al.add(new Person("hide", 20));
        al.add(new Person("dillinger", 18));
        al.add(new Person("sblx", 15));

        al = TestArrayList.singleElement(al);

        Iterator it = al.iterator();
        while(it.hasNext()){
            Person p = (Person)it.next();
            System.out.println(p.getName() + "::" + p.getAge());
        }
    }
}
class Person{
    private String name;
    private int age;
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public boolean equals(Object obj){
        if(!(obj instanceof Person))
            return false;
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
}

集合框架_HashSet
Set
- - HashSet:
- - - - - - 底层数据结构是哈希表
- - - - - - 通过hashCode();和equals();来保证数据唯一性
集合框架_HashSet存储自定义元素

public class TestHashSet {
    public static void sop(Object obj){
        System.out.println(obj);
    }
    public static void main(String[] args){
        HashSet hs = new HashSet();
        hs.add(new Human("a1", 11));
        hs.add(new Human("a2", 12));
        hs.add(new Human("a2", 12));
        Iterator it = hs.iterator();
        while(it.hasNext()){
            Human h = (Human)it.next();
            sop(h.getName() + "::::" + h.getAge());
        }
    }
}
class Human{
    private String name;
    private int age;
    Human(String name,int age){
        this.name = name;
        this.age = age;
    }
    public int hashCode(){
        return name.hashCode() + age;
    }
    public boolean equals(Object obj){
        if(!(obj instanceof Human))
            return false;
        Human h = (Human)obj;
        System.out.println(this.name + "::" + h.name);
        return this.name.equals(h.name) && this.age == h.age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
}

集合框架_HashSet判断和删除的依据
HashSet在判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法
集合框架_TreeSet、TreeSet存取自定义对象
Set
- - TreeSet:
- - - - - - 可以对Set集合中的元素排序,底层数据结构是二叉树
- - - - - - 排序时,主要条件相同时,要判断一下次要条件
集合框架_二叉树
TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法
TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
在集合初始化时,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
当两种排序都存在时,以比较器为主
集合框架_实现Comparator方法排序
定义一个类,实现Comparator接口,覆盖compare方法
集合框架_TreeSet练习

public class TreeSetDemo {
    public static void main(String[] args){
        TreeSet ts = new TreeSet(new StrLenCompare());
        ts.add("aadgs");
        ts.add("sdfh");
        ts.add("dvgsrr");
        ts.add("sdcawe");
        ts.add("asdaaws");

    Iterator it = ts.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
  }
}
class StrLenCompare implements Comparator{
    public int compare(Object o1, Object o2) {
    String s1 = (String)o1;
    String s2 = (String)o2;
    int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
    if(num == 0)
        return s1.compareTo(s2);
    return num;
  }
}
  • 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、付费专栏及课程。

余额充值