Java学习day14:权限修饰符,集合(知识点+例题详解)

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


往期回顾

Java学习day13:泛型(一篇文章搞懂)-CSDN博客

Java学习day12:static关键字,字符串声明,字符串常量池-CSDN博客

Java学习day11:异常-CSDN博客

......

 Java学习day14:权限修饰符,集合

一、权限修饰符

其实咱们早就已经见过权限修饰符了

权限修饰符 四个:
public  private  protected   default(不写是叫default) 默认的

1.1private修饰符

private 修饰私有的成员变量和成员方法。

1.在本类中可以使用私有化的成员属性和成员方法
2.同一个包下面其他类不能使用私有化的成员属性和成员方法
3.其他的包的下面的其他类不能使用私有化的成员属性和成员方法
总结:private修饰的成员变量和成员方法只能在本类中使用

那如果想要去调用一个类的私有化方法,可以先在类的公有化方法里调用私有化方法,再在主类里调用公有化方法

1.2protected 

protected修饰方法和属性

1.同一个类中可以使用的
2.同一个包下面其他类可以使用
3.不同包下面,如果是子类可以使用但是其他类不能使用
总结:其他包下面其他类不能使用,但是继承的子类可以使用的

1.3public 

public修饰方法和属性是公开的,谁都可以。

1.4不写(默认的default)

default修饰方法和属性

1.在本类中默认的属性和方法是可以使用的
2.同一个包下面的其他类可以使用
3.其他包下面的其他类不能使用的
总结:默认的属性和方法只能在同一个包使用!!!

1.5总结

开发中最常用的是 private  public

权限大小是逐级递减的

权限修饰符的名称当前类同一个包下面其他类不同包下面子类不同包下面的其他类
public 可以可以可以可以
protected可以可以可以不可以
不写(默认default)可以可以不可以不可以
private可以不可以不可以不可以

二、集合(重点)

2.1集合的架构

看官方的API

interface   Collection<E>  是java中集合的总接口

Collection下面有两个重要的子接口 List    和 Set

List 接口:
 Collection下面的子接口,存储数据特征: 有序的,可重复的
 有两个比较重要的实现类:ArrayList    LinkedList
Set  接口:
 Collection下面的子接口,存储数据特征:  无序的,不可重复的
 有两个比较重要的实现类: HashSet   TreeSet

2.2collection接口 

学习Collection这个接口,其实就是在学习这个接口下面的方法,

这些方法怎么调用呢?我们都知道,接口不能直接实例化,咋办?

借助于他的子类ArrayList即可,用多态

2.2.1主要方法

(1)增:

boolean add(E e);
 boolean addAll(Collection<? extends E> c); 

(2)删: 


 boolean remove(Object obj);
 boolean removeAll(Collection<? extends E> c);
    [a,b,c]  [b, c, d]
    void clear(); 

(3)查: 

 int size(); 
 Object[] toArray(); 
 boolean contains(Object obj);
 boolean containsAll(Collection<? extends E> c);
 boolean isEmpty(); 

 不知道大家看的懂这些方法背后的含义不,该怎么使用,我建议大家,去看看官方API文档,这是学习一个新方法很好的途径。

希望大家都是看了再来看我这里的。

增:
 boolean add(E e);添加一个数据到集合中
 boolean addAll(Collection<? extends E> c); 将一个集合数据添加到另外一个集合中
 Collection<? extends E>:元素 是E本类或者继承的E,才能添加到另外一个集合中

删:
 boolean remove(Object obj);删除指定的元素
 boolean removeAll(Collection<? extends E> c);  删除的是交集
     [a,b,c]  [b, c, d]
 void clear();清空的 

查:
 int size();  查看集合中元素的个数 
 Object[] toArray(); 将集合转为Object类型数组
 boolean contains(Object obj); 集合中是否包含这个元素 如果包含返回true 
 boolean containsAll(Collection<? extends E> c);一个集合是否另外一个集合子集合
 boolean isEmpty();   判断集合是否为空 

2.2.2示例 
import java.util.ArrayList;
import java.util.Collection;public class Demo {public static void main(String[] args) {Collection<String> list = new ArrayList<String>();//容器已经创建好了list.add("山山");list.add("福豪");list.add("忠达");System.out.println(list);Collection<String> list1 = new ArrayList<String>();list1.add("昊冉");list1.add("泽文");list1.add("梓宇");list.addAll(list1);Collection<Integer> list2 = new ArrayList<Integer>();list2.add(2);list2.add(89);//list.addAll(list2);直接报错System.out.println(list);////[山山, 福豪, 忠达, 昊冉, 泽文, 梓宇]//删除  山山System.out.println(list.remove("山山"));//trueSystem.out.println(list);//山山是否还在list集合中//[福豪, 忠达, 昊冉, 泽文, 梓宇]System.out.println(list.remove("老邢"));//fasle  删除一个不存在的数据的时候就是falseCollection<String> list3 = new ArrayList<String>();list3.add("昊冉");list3.add("泽文");list3.add("山山");//list3["昊冉", “泽文”, "山山"]//list[福豪, 忠达, 昊冉, 泽文, 梓宇]list.removeAll(list3);System.out.println(list);//[福豪, 忠达, 梓宇]
//        list.clear();
//        System.out.println(list);//[]//SIZE()System.out.println(list.size());//3//toArray();集合转数组Object[] objects = list.toArray();System.out.println(objects);//地址for (int i = 0; i < objects.length; i++) {System.out.println(objects[i]);}System.out.println(list.contains("忠达"));//trueSystem.out.println(list.contains("山山"));//falseSystem.out.println(list.isEmpty());//falseObject obj = "嘻嘻";System.out.println(obj);}
}

2.3遍历集合中的数据 

2.3.1.使用for循环

这种是最基础的,将集合转为数组,然后再for循环遍历

import java.util.ArrayList;
import java.util.Collection;public class Demo2 {public static void main(String[] args) {Collection<Integer> list = new ArrayList<>();list.add(250);list.add(360);list.add(470);list.add(404);list.add(500);System.out.println(list);//可以将集合转为数组,然后再for循环遍历//不用!!!Object[] objects = list.toArray();for (int i = 0; i < objects.length; i++) {System.out.println(objects[i]);}}
}
2.3.2.增强for循环 
2.3.2.1语法格式

for (集合中元素的数据类型 临时变量 : 集合或者数组) {
 sout(临时变量)
}

import java.util.ArrayList;
import java.util.Collection;public class Demo3 {public static void main(String[] args) {Collection<String> list = new ArrayList<>();list.add("毛泽东");list.add("邓小平");list.add("江泽民");list.add("胡锦涛");System.out.println(list);//String s : list//将list集合 进行迭代,每次取一个值然后赋值给 s//将list集合中的数据挨个的赋值给sfor (String s : list) {System.out.println(s);}}
}
2.3.3.迭代器

也是对集合中数据进行遍历的,分三步走

1.通过集合对象创建迭代器对象 cursor  光标 指针

Iterator<String> iterator = list.iterator();

2.第一个方法  hasNext(); 判断一个集合中是否有下一个元素 ,有的话返回true,否则false

System.out.println(iterator.hasNext());//true

3.第二个方法next() 一个方法干了两件事情,首先会返回当前光标下面的元素,其次并把光标挪到下一元素的位置

System.out.println(iterator.next());

通过迭代器这一特性,我们用一个while循环,就可以实现集合数据的遍历输出,大家看代码。

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class Demo4 {public static void main(String[] args) {Collection<String> list = new ArrayList<>();list.add("毛泽东");list.add("邓小平");list.add("江泽民");list.add("胡锦涛");//接下来咱们是哟个迭代器进行数据的遍历//1.通过集合对象创建迭代器对象 cursor  光标 指针Iterator<String> iterator = list.iterator();//2第一个方法  hasNext(); 判断一个集合中是否有下一个元素// System.out.println(iterator.hasNext());//true//3.next() 一个方法干了两件事情,//会返回当前光标下面的元素。并把光标挪到下一元素的位置
//        System.out.println(iterator.next());
//        System.out.println(iterator.hasNext());//true
//        System.out.println(iterator.next());
//        System.out.println(iterator.hasNext());//true
//        System.out.println(iterator.next());
//        System.out.println(iterator.hasNext());//true
//        System.out.println(iterator.next());
//        System.out.println(iterator.hasNext());//false
//        System.out.println(iterator.next());while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

2.4在集合中存的是自定义的对象【重点】 

这里要特别注意一个问题,当集合中存的是自定义对象的时候,打印对象时会自动调用toString方法,而Java封装的toString方法里,打印的是内存地址,为了转换为方便我们看懂的,就需要重写toString方法。

toString()这个方法说白了就是返回类名+@+对象16进制的内存地址
是打印对象时自动调用的,所以说为了结果让人容易阅读,建议所以偶子类覆盖此方法,后面还会仔细讲解 

public class Person {private String name;private int age;//有参构造方法,对属性进行赋值public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//在一个类中重写toString方法//将内存地址转为程序员能看懂的字符串//    @Override
//    public String toString() {
//        return "Person{" +
//                "name='" + name + '\'' +
//                ", age=" + age +
//                '}';
//    }
}public class Demo5 {public static void main(String[] args) {Person person = new Person("老邢", 78);System.out.println(person);//// 之前打印的person对象是内存地址,现在在类中重写了toString方法//以后,输出一个对象的话,就会打印出来一个字符串//在集合中添加person对象Collection<Person> list = new ArrayList<>();list.add(person);list.add(new Person("骚磊", 45));list.add(new Person("阳仔", 89));list.add(new Person("源哥", 35));System.out.println(list);Object[] objects = list.toArray();Person person1 = (Person)objects[1];System.out.println(person1.getName());}
}

大家可以跑一跑这段代码试试,重写toString方法和不重写情况下的区别。

当然,这里重写的方法,不知道大家看懂了吗?

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

看不懂,就多看几遍,再用idea跑一下看看输出结果,不是什么难题。

2.5List接口 

List是Collection的子接口,而且实际开发中用List而不用Collection。因为List在Collection基础之上添加了很多的方法。

Collection下面的方法List肯定有的,因为是继承关系。上面讲了Collection下面的方法,在List中也可以用。接下来咱们讲List独有的方法。

2.5.1List独有的方法

 增:
  void add(int index, E e);在指定的位置上插入一个元素
  boolean addAll(int index, Collection<? extends E> e);将一个集合插入到另外一个集合的指定的位置

 删:
  Collection删除的时候,通过元素来删除的。 remove(Object obj)
  E remove(int index);通过索引来删除指定的元素。返回的是被删除的元素 

 改:
  E set(int index, E e); 通过指定的索引修改数据元素,返回值是被修改的原数据 

 查:
  E get(int index);  通过索引下标去获取指定元素
  int indexOf(Object obj);通过元素获取指定的下标的
  int lastIndexOf(object obj);通过元素获取最后一次出现的元素的下标
  List<E> subList(int formIndex, int toIndex);截取一部分出来 

2.5.1.1示例 

大家仔细看示例,通过示例去熟悉方法。

import java.util.ArrayList;
import java.util.List;public class Demo1 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("张三");//有序的  可重复的System.out.println(list);//[张三, 李四, 王五, 张三]list.add(2, "狗蛋");System.out.println(list);List<String> list1 = new ArrayList<>();list1.add("麻子");list1.add("赵四");list1.add("贝贝");list.addAll(1, list1);System.out.println(list);System.out.println(list.remove(0));//在删除System.out.println(list);//目的是删除以后的集合的数据展示一下//[麻子, 赵四, 贝贝, 李四, 狗蛋, 王五, 张三]System.out.println(list.set(2, "彩云"));//贝贝System.out.println(list);//修改之后的集合System.out.println(list.get(0));System.out.println(list.get(1));System.out.println(list.get(2));System.out.println(list.get(3));//System.out.println(list.get(89));System.out.println(list.indexOf("麻子"));//0list.add(2, "张三");System.out.println(list.lastIndexOf("张三"));//7System.out.println(list);List<String> strings = list.subList(3, 5);System.out.println(strings);}
}
 2.5.2遍历List集合中的数据

这里同样的三个方法,for循环、增强for循环、还有迭代器,跟遍历集合中的数据是一样的,就不再具体讲解太多。

2.5.2.1.for循环
import java.util.ArrayList;
import java.util.List;public class Demo2 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("张三");System.out.println(list);for (int i = 0; i < list.size(); i++) {//通过索引获取元素System.out.println(list.get(i));}}
}
2.5.2.2.增强for循环
import java.util.ArrayList;
import java.util.List;public class Demo2 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("张三");System.out.println(list);//for循环
//        for (int i = 0; i < list.size(); i++) {
//            //通过索引获取元素
//            System.out.println(list.get(i));
//        }//增强for循环
//        for (String s : list) {
//            System.out.println(s);
//        }//迭代器}
}
2.5.2.3.迭代器 

根据光标位置的不同来判断是用hasNext()还是hasPrevious()

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;public class Demo3 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("张三");System.out.println(list);ListIterator<String> sli = list.listIterator();while (sli.hasNext()) {System.out.println(sli.next());}//此时光标已经在最下面了while (sli.hasPrevious()) {System.out.println(sli.previous());}}
}

或者改进一下

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;public class Demo4 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("张三");System.out.println(list);//可以将指针(光标)放到指定的额位置上,然后移动光标对数据进行遍历ListIterator<String> sli = list.listIterator(4);while (sli.hasPrevious()) {System.out.println(sli.previous());}}
}

2.6ArrayList

2.6.1特征

ArrayList底层是数组,可以扩容的。默认的容量是10.,超过10以后会自动扩容,扩容1.5倍

他查询快,增删慢。而我们实际开发就用ArrayList   因为开发的时候,主要查询多!!!

2.6.2示例
import java.util.ArrayList;public class Demo1 {public static void main(String[] args) {//一般开发的时候写成 父类的引用指向子类的对象//因为List接口下面的方法已经够用了//ArrayList独有的方法很少,几乎不用  所以ListArrayList<String> list = new ArrayList<>();list.add("狗蛋");list.add(1, "老邢");list.add("老万");for (String s : list) {System.out.println(s);}}
}

2.7LinkedList

2.7.1特征

查询慢,增删快,LinkedList也是List的实现类,双向链表。

2.7.2示例
import java.util.LinkedList;public class Demo1 {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("狗蛋");list.add("嘻嘻");list.addLast("哈啊哈");list.addFirst("呵呵");System.out.println(list);for (String s : list) {System.out.println(s);}}
}

2.8ArrayList和LinkedList和Vector的区别

ArrayList和Vector 底层是数组,但是Vector是线程安全的,所以效率底,开发中不用Vector

2.8.1ArrayList和linkedList区别:
ArrayListlinkedList
底层是数组底层是双向链表
查询快: 底层是索引,有序的通过内存有序地址,直接找到 时间复杂度  o(1)查询慢:底层是二分法查找的算法 时间复杂度是log以2为底 n的对数
增删慢: 增加数据和删除数据有可能扩容。每次扩1.5倍。扩容的话,浪费内存浪费时间o(n)增删快:直接找前置结点 Node prev,后继结点 Node next。时间复杂度是 o(1)

 总的来说,ArrayList适合需要频繁访问和修改元素的场景,LinkedList适合需要频繁插入和删除元素的场景,而Vector适合需要线程安全的场景。当然,实际开发的时候大部分用ArrayList


以上,就是今天的所有知识点了。集合这个知识点不难,丹斯要记的背的东西很多,大家得多花点时间,静下心慢慢看,慢慢理解,不是什么大问题。最后三个类的比较,我写的很简略,大家可以下来自行再拓展。

加油吧,预祝大家变得更强!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ajax基础(应用场景|jquery实现Ajax|注意事项)

文章目录 一、Ajax简介二、基于jquery实现Ajax三、使用Ajax注意的问题1.Ajax不要与form表单同时提交2.后端响应格式问题3、使用了Ajax作为请求后的注意事项 一、Ajax简介 AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。…

Python爬虫技术系列-03/4flask结合requests测试静态页面和动态页面抓取

python构建web服务 flask内容参考:Flask框架入门教程&#xff08;非常详细&#xff09; flask安装与运行测试 安装flask pip install flask创建一个webapp.py文件&#xff0c;内容如下 from flask import Flask# 用当前脚本名称实例化Flask对象&#xff0c;方便flask从该脚…

OpenHarmony Axios组件使用过程中,Api9不适配问题

大家好&#xff0c;我是【八戒&#xff0c;你又涨价了哎】 以下是我个人在学习OpenHarmony过程中的分享&#xff0c;请大家多多指教 目录 问题描述 解决方法 问题描述 使用axios组件的时候&#xff0c;把应用部署到开发板&#xff0c;提示Api9不适配 解决方法 对这类版本不…

基于Docker的安装和配置Canal

基本介绍 Canal介绍&#xff1a;Canal 是用 Java 开发的基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费的中间件&#xff08;数据库同步需要阿里的 Otter 中间件&#xff0c;基于 Canal&#xff09;。 Canal背景&#xff1a;阿里巴巴 B2B 公司&#xff0c;因为…

AI绘画使用Stable Diffusion(SDXL)绘制三星堆风格的图片

一、前言 三星堆文化是一种古老的中国文化&#xff0c;它以其精湛的青铜铸造技术闻名&#xff0c;出土文物中最著名的包括青铜面具、青铜人像、金杖、玉器等。这些文物具有独特的艺术风格&#xff0c;显示了高度的工艺水平和复杂的社会结构。 青铜面具的巨大眼睛和突出的颧骨&a…

【Web】Ctfshow Nodejs刷题记录

目录 ①web334 ②web335 ③web336 ④web337 ⑤web338 ⑥web339 ⑦web340 ⑧web341 ⑨web342-343 ⑩web344 ①web334 进来是一个登录界面 下载附件&#xff0c;简单代码审计 表单传ctfshow 123456即可 ②web335 进来提示 get上传eval参数执行nodejs代码 payload: …

【力扣面试经典150题】(链表)K 个一组翻转链表

题目描述 力扣原文链接 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只…

技术分享 | 如何写好测试用例?

对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中&#xff0c;我们将介绍测试用例设计常用的几种方法&#xff0c;以及如何编写高效的测试用例。 ## 一…

vue和uni-app的递归组件排坑

有这样一个数组数据&#xff0c;实际可能有很多级。 tree: [{id: 1,name: 1,children: [{ id: 2, name: 1-1, children: [{id: 7, name: 1-1-1,children: []}]},{ id: 3, name: 1-2 }]},{id: 4,name: 2,children: [{ id: 5, name: 2-1 },{ id: 6, name: 2-2 }]} ]要渲染为下面…

春秋云境靶场CVE-2022-30887漏洞复现(任意文件上传漏洞)

文章目录 前言一、CVE-2022-30887描述和介绍二、CVE-2021-41402漏洞复现1、信息收集2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随…

C语言中的指针(上)

目录 一、基本概念 1.变量的存储空间 2.定义指针 3.引用与解引用 二、指针的算术运算、类型以及通用指针 1.指针的算数运算 2.指针类型以及通用型指针 三、指向指针的指针&#xff08;pointers to pointers&#xff09; 四、函数传值以及传引用 1.局部变量 2.从存储地…

gitlab环境准备

1.准备环境 gitlab只支持linux系统&#xff0c;本人在虚拟机下使用Ubuntu作为操作系统&#xff0c;gitlab镜像要使用和操作系统版本对应的版本&#xff0c;(ubuntu18.04,gitlab-ce_13.2.3-ce.0_amd64 .deb) book100ask:/$ lsb_release -a No LSB modules are available. Dist…

机器学习二元分类 二元交叉熵 二元分类例子

二元交叉熵损失函数 深度学习中的二元分类损失函数通常采用二元交叉熵&#xff08;Binary Cross-Entropy&#xff09;作为损失函数。 二元交叉熵损失函数的基本公式是&#xff1a; L(y, y_pred) -y * log(y_pred) - (1 - y) * log(1 - y_pred)其中&#xff0c;y是真实标签&…

中贝通信-603220 三季报分析(20231120)

中贝通信-603220 基本情况 公司名称&#xff1a;中贝通信集团股份有限公司 A股简称&#xff1a;中贝通信 成立日期&#xff1a;1999-12-29 上市日期&#xff1a;2018-11-15 所属行业&#xff1a;软件和信息技术服务业 周期性&#xff1a;1 主营业务&#xff1a;通信网络技术服务…

通信网络安全防护定级备案流程介绍(附流程图)

通信网络安全防护定级备案是拥有增值电信业务经营许可证并且有开展电信业务的企业要做的一件事情。刚接触这块的家人们在填报操作的时候可能对具体通信网络安全防护定级备案流程还不是很清楚&#xff0c;所以就给大家画张具体的流程图吧&#xff0c;可以更加直观的了解。 通信…

go语言学习-go环境安装

1、安装Go 1.1 下载安装 go官网 找对应电脑的版本进行安装即可。 点击安装包&#xff0c;直接下一步下一步即可&#xff0c;安装目录可以自行设置一下。 1.2 验证 windows通过cmd验证。 linux或者mac可以通过自带终端执行测试。 2、配置环境变量 2.1 windows 找到系统…

HarmonyOS开发(四):UIAbility组件

1、UIAbility概述 UIAbility 一种包含用户界面的应用组件用于与用户进行交互系统调度的单元为应用提供窗口在其中绘制界同 注&#xff1a;每一个UIAbility实例&#xff0c;都对应一个最近任务列表中的任务。 一个应用可以有一个UIAbility也可以有多个UIAbility。 如一般的…

深度学习YOLO安检管制物品识别与检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

【论文阅读】SPARK:针对视觉跟踪的空间感知在线增量攻击

SPARK: Spatial-Aware Online Incremental Attack Against Visual Tracking introduction 在本文中&#xff0c;我们确定了视觉跟踪对抗性攻击的一个新任务&#xff1a;在线生成难以察觉的扰动&#xff0c;误导跟踪器沿着不正确的&#xff08;无目标攻击&#xff0c;UA&#x…

设计模式--模板方法外观模式

模板方法模式 场景&#xff1a;需使用代码方式实现&#xff0c;考完试后&#xff0c;将各个学生的试卷及答案誊抄一份。 假如有两个学生的试卷誊抄完毕. // 学生A public class TestPaperA {// 试题1public void testQuestion1() {System.out.println("问题一:XXXXXXXX…