目录

 昨日总结

今日计划

算法——移除链表元素

Java的代理模式(完结)

三种代理模式

Spring AOP(初步了解,没过深理解)

实现过程

昨日八股联想答案 

今日八股联想

计算机视觉

文献内容​编辑

环境的配置

总结


 昨日总结

  • 初步了解AOP、Spring AOP、代理模式(完结),完成微信支付功能
  • 背诵小林coding--Java集合面试篇(1/4)
  • cv进度——配复现环境(坎坷版),看了一部分文献内容
  • 代码随想录--移除链表元素

今日计划

  • 理解一下注解的原理,加快苍穹项目进度
  • 背诵小林coding--Java集合面试篇(2/3)
  • 继续搞一搞环境,跟进文献
  • 代码随想录——设计链表

算法——移除链表元素

注意区分一下带头结点和不带头结点的区别,下面我采用的是带头结点的代码。 

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* LinkHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    LinkHead->next = head;
    struct ListNode* node = LinkHead;
    while(node->next != NULL){
        if(node->next->val == val){
            node->next = node->next->next;
        }else{
            node = node->next;
        }
    }
    head = LinkHead->next;
    return head;
}

Java的代理模式(完结)

代理模式是一种结构性设计模式,代理对象作为一个中间层,对真实对象的操作进行拦截或者增添额外的功能,提高系统间接性和灵活性。代理模式作为结构型设计模式之一,广泛应用于各种场景。其核心思想是通过引入代理对象,为目标对象的访问提供一种间接方式,这种间接性不仅提升了代码的扩展性和维护性,还为功能的增强和安全控制提供了便利。

三种代理模式

  1. 静态代理
在编译时就确定了代理类的结构,只能静态代理某些类和方法,功能较弱
定义一个接口——>被代理类和代理类继承公共接口——>生成代理对象,构造方法里初始化类型的对象,传给代理对象——>代理对象调用重写的方法
  1. Proxy动态代理(JDK动态代理)
JDK动态代理使用需要定义一个代理实例的调用拦截处理器InvocationHandler,反射执行目标方法,之前前后可以加入一些额外的代码实现增强。
在运行时动态生成代理类,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
  1. CGLIB动态代理(子类代理)
它是在内存中构建一个子类对象从而实现对目标对象功能的扩展.主要是对指定的类生成一个子类,覆盖其中的方法(继承)

Spring AOP(初步了解,没过深理解)

  • SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。
  • SpringAOP是对bean的一种扩展,是后处理器的一种处理。Spring bean在 执行初始化方法前后,会使用所有BeanPostProcessor对bean进行特殊处理。Aop代理即是一种对bean特殊处理。
  • 对于这种功能统一,且使用地方较多的功能,可以考虑用 AOP 来处理(比如 用户登录验证)
  • AOP由切面(由切点和通知组成)、连接带你、切点、通知组成。连接点是指出发AOP的点,切点是提供匹配连接点的规则,通知规定了AOP制定的方法和时间点。
  • Spring切面类中常用的注解:前置通知 @Before,后置通知 @After,返回之后通知 @AfterReturning,抛异常后通知:@AfterThrowing

实现过程

  1. 利用拦截器和AOP匹配过滤器,生成Advisor
  2. 根据Advisor生成代理对象,会生成JdkDynamicAopProxy或CglibAopProxy
  3. 代理类执行代理时,从Advisor取出拦截器,生成MethodInvocation(连接点)并执行代理过程

昨日八股联想答案 

  • 有哪些集合,与数组的区别

区别:

  1. 数组是固定的,集合呃呃可以动态增长
  2. 数组可以包含基本数据类型和对象,集合只能包含对象
  3. 数组可以直接访问元素,集合都需要用迭代器访问

常用集合:

  1. ArrayList:基于动态数组实现,查询速度快,增删慢
  2. LinkedList:基于双向链表实现。
  3. Vector:线程安全的动态数组,与ArrayList类似,加了同步锁,适用于多线程环境
  4. HashSet:基于红黑树实现,元素会按照自然顺序或指定的比较器顺序排序。
  5. LinkedHashSet:继承自HashSet,同时使用链表维护元素的插入顺序
  6. HashMap:基于哈希表实现,不保证键值对的顺序。
  7. TreeMap:基于红黑树实现,键会按照自然顺序或指定的比较器顺序排序。
  • 集合遍历的方法有哪些

普通for循环、增强for循环(for-each循环)、Iterator迭代器、Stream API

  • Arraylist和LinkedList的区别,哪个集合是线程安全的?

二者都不是线程安全的集合,Vector是线程安全的(后续详细了解一下

区别:

  1. 结构:前者基于数组实现,后者基于链表
  2. 随机访问特性:前者支持索引随机访问,后者需要遍历
  3. 效率:后者插入和删除的效率比较高
  4. 分配的空间:前者创建时分配一段连续的内存空间,占用较大;后者只需要存储元素和指针,且非必须连续。

今日八股联想

  • HashMap实现原理

  • 了解的哈希冲突解决方法

  • HashMap 的put和get过程

  • 线程安全的 List, CopyonWriteArraylist是如何实现线程安全的

计算机视觉

文献内容

 

环境的配置

对于下载连接超时问题(情况如下),可以多次重新下载尝试一下

如果多次尝试还是不行,可以利用离线下载 

下载离线包的网址https://pypi.org,直接检索需要功能包名称,如果直接找到自己想要的具体版本的功能包,在点击Download files,选择自己的需求即可。

将离线包下载到本地,完成离线包的安装

pip install path/tensorflow-1.14.0-cp36-cp36m-manylinux1_x86_64.whl

当发生版本问题时,一般是你初始设置的python版本过高,搜索不到对应库的版本,尝试降低一下创建虚拟环境时的python版本(不建议更改版本,直接重现建一个虚拟环境)

 就当出现下面情况时,说明环境下载全部成功。

结果,进行评估测试时 ,又给我报缺失DLL文件,总而言之就是,下载的TensorFlow有问题。真搞不懂直接从终端窗口pip install默认PyPIPyPI · The Python Package Index 下载的,还给我报错。继续搞

总结

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐