java,八股,cv,算法——双非研0四修之路day6
·
目录
昨日总结
- 总结了反射和Java代理模式(‘未完’),完成地址簿模块和用户下单功能
- 背诵小林coding--Java基础面试题部分(4/4)<二次>
- 看了摘要部分
- 代码随想录--螺旋矩阵||
今日计划
- 了解Spring AOP编程,继续总结Java代理模式,继续跟进项目
- 背诵小林coding--Java集合面试篇(1/4)
- 继续翻译
- 代码随想录--移除链表元素
算法——螺旋矩阵||
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:

用c写要注意动态创建数组,同时结束时,要返回数组的大小。
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
//先申请数组空间
int** result = malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++) {
result[i] = malloc(sizeof(int) * n);
}
int start_x = 0,start_y = 0; //定义循环每一圈的起始位置
int loop = n / 2; //每个圈循环几次,注意奇数的情况最后另讨论
int count = 1;
int flag = 1;
int i , j;
while (loop--){
i = start_x;
j = start_y;
//左到右情况
for (j = start_y; j < n - flag; j++){
result[i][j] = count++;
}
//上到下情况
for (i = start_x; i < n - flag; i++){
result[i][j] = count++;
}
//右到左情况
for (; j > start_y; j--){
result[i][j] = count++;
}
//下到上情况
for(; i > start_x; i--){
result[i][j] = count++;
}
start_x++;
start_y++;
flag++;
}
if (n % 2){
result[n/2][n/2] = count;
}
*returnSize = n;
*returnColumnSizes = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
(*returnColumnSizes)[i] = n;
}
return result;
}
反射
就是把java类中的各个成分映射成Java对象。存在于运行状态中。对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。(使用的前提是得到字节码文件)
利用反射方法给对象赋值流程
- 当我们new一个对象时,jvm就是加载我们所创建对象的字节码文件。反射的本质理解就是得到class对象后,反向获取对象的各种信息
- 首先,要获取Class对象(获取Class对象的三种方式如下)
package com.qdd;
public class demo {
public static void main(String[] args) throws ClassNotFoundException {
//方式1:通过类名
Class class1 = Student.class;
//方式2:通过Class类的forName()方法,注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
Class class2 = Class.forName("com.qdd.Student");
//方式3:通过对象调用getClass()方法
Student student = new Student("姓名");
Class class3 = student.getClass();
}
}
class Student{
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
- 用class对象调用newInstance()方法获取反射对象
Object object = Class对象.getConstructor().newInstance();
- 用getField方法获取公有字段,并用set方法对其赋值
Field StuName = stuClass.getField("name");
StuName.set(object,"小明");
- 以上便是通过反射方法实现对共有字段赋值,除此之外,反射还可以用在获取成员方法并调用、运行配置文件、运行时类型信息、加载类等等
注意
反射可能会破坏封装性、引发代码注入风险、造成信息泄露问题,引发一系列安全问题。在有安全策略限制的系统中,应加强对反射使用的监控和控制,确保反射操作不会绕过安全策略。
Java的代理模式(未完,与AOP一起对应看)
代理模式是一种结构性设计模式,代理对象作为一个中间层,对真实对象的操作进行拦截或者增添额外的功能,提高系统间接性和灵活性。代理模式作为结构型设计模式之一,广泛应用于各种场景。其核心思想是通过引入代理对象,为目标对象的访问提供一种间接方式,这种间接性不仅提升了代码的扩展性和维护性,还为功能的增强和安全控制提供了便利。
三种代理模式
- 静态代理
在编译时就确定了代理类的结构,只能静态代理某些类和方法,功能较弱
定义一个接口——>被代理类和代理类继承公共接口——>生成代理对象,构造方法里初始化类型的对象,传给代理对象——>代理对象调用重写的方法
Proxy动态代理
- Proxy动态代理
在运行时动态生成代理类
- CGLIB动态代理(子类代理)
昨日八股联想答案
- Lambda表达式
Lambda 表达式它是一种简洁的语法,用于创建匿名函数,主要用于简化函数式接口,可以用更简洁的语法实现相同的功能。虽然 Lambda 表达式优点蛮多的,不过也有一些缺点,比如会增加调试困难,因为 Lambda 表达式是匿名的,在调试时很难定位具体是哪个 Lambda 表达式出现了问题。
- Stream流
它允许你以声明式的方式处理数据集合(如 List、Set 等)。可以把 Stream 想象成一个传送带,数据元素就像传送带上的物品,在传送过程中可以对这些物品进行筛选、排序、映射等操作,而不需要手动编写迭代循环。
- 代理模式和适配器模式区别
目的不同:代理模式关注控制对象的访问,适配器模式则用于接口转换,是不兼容的类能够一起工作。
应用场景不同:代理模式常用于添加额外功能,适配器模式常用语不兼容接口的协同工作
今日八股联想
- 有哪些集合,与数组的区别
- 集合遍历的方法有哪些
-
Arraylist和LinkedList的区别,哪个集合是线程安全的?
计算机视觉


总结

更多推荐
所有评论(0)