- 博客(263)
- 收藏
- 关注
原创 线性数据结构
为了避免当只有一个元素的时候,队头和队尾重合使处理变得麻烦,所以引入两个指针,front 指针指向对头元素,rear 指针指向队列最后一个元素的下一个位置,这样当 front 等于 rear 时,此队列不是还剩一个元素,而是空队列。除此之外,链表不具有数组随机读取的优点。2. 队列为空的时候就是 front==rear ,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,如下图所示,那么现在判断队列是否为满的条件就是:(rear+1) % QueueSize==front。
2024-07-18 17:43:44
857
原创 spring是如何解决循环依赖的,为什么不是两级
通过这种方式,Spring可以确保在需要时提供正确的对象实例,无论是原始对象还是其代理对象,从而解决了循环依赖的问题。:在某些情况下,二级缓存用于存储Bean的代理对象或原始实例,以避免重复创建。然而,在处理循环依赖时,二级缓存不足以解决问题,因为它不能确保在需要时总是提供正确的对象实例。当其他Bean依赖这个Bean时,可以直接从缓存中获取实例,避免重复创建。通过上面的图,仔细分析一下,其实把二级缓存拿掉,在 B 尝试获取 A 的时候直接返回 A 的实例,是不是也是可以的?
2024-07-18 17:11:10
1614
原创 乐观锁和悲观锁
操作员 B 完成了操作,也将版本号( version=1 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 1 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须等于当前版本才能执行更新 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。
2024-07-17 17:56:05
1002
1
原创 Spring的启动过程
在实例化 Bean 的过程中,Spring 容器会解析 Bean 之间的依赖关系,并将依赖的 Bean 注入到需要它们的 Bean 中。如果应用程序中使用了 AOP(面向切面编程),Spring 将会应用切面逻辑,为 Bean 动态生成代理,并将切面逻辑织入到相应的 Bean 中。Spring 容器会根据配置文件中的定义,实例化所有的 Bean。一旦所有的 Bean 实例化、依赖注入和初始化工作完成,Spring 容器就会完成启动过程,应用程序就可以开始处理请求和响应了。4)实例化 Bean。
2024-07-16 04:15:00
302
原创 Spring 如何解决循环依赖问题
在创建Bean的过程中,Spring会使用三级缓存来管理对象的创建过程,保证在创建过程中依然能够提供已经初始化完成的对象引用,从而解决循环依赖的问题。Spring 解决循环依赖问题的核心在于提前暴露一个已经创建完成的对象引用,而不是提前暴露一个未初始化的代理对象。当请求Bean时,如果Bean正在创建中,则先返回一个临时的代理对象(早期代理对象),这样可以允许其他Bean引用该Bean,形成一个引用链。单例对象的创建过程中遇到循环依赖,Spring 采取提前暴露引用的方式解决。
2024-07-16 03:00:00
166
原创 使用 AspectJ实现AOP 切面
上面的代码中我们就是在@Before()中直接指定使用当前类定义的beforeAdd()方法对应的Pointcut的表达式,如果我们需要指定的Pointcut定义不是在当前类中的,我们需要加上类名称,如下面这个示例中引用的就是定义在MyService中的add()方法上的Pointcut的表达式。标准的Aspectj Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是10种类型的表达式,分别如下。
2024-07-15 16:48:39
349
原创 使用Spring代理工厂实现AOP 切面
这里有个值得注意的问题:从容器中获得proxy对象时应该是org.springframework.aop.framework.ProxyFactoryBean类型的对象(如下代码所示),但这里直接就转换成IMath类型了,这是因为:ProxyFactoryBean本质上是一个用来生产Proxy的FactoryBean。如果容器中的某个对象持有某个FactoryBean的引用它取得的不是FactoryBean本身而是 FactoryBean的getObject()方法所返回的对象。即,它是类中的一个方法。
2024-07-15 16:45:14
363
原创 静态代理、JDK与CGLIB动态代理
参数:Object为由CGLib动态生成的代理类实例,Method为上文中实体类所调用的被代理的方法引用,Object[]为参数值列表,MethodProxy为生成的代理类对方法的代理引用。4.2、使用cglib完成动态代理,大概的原理是:cglib继承被代理的类,重写方法,织入通知,动态生成字节码并运行,因为是继承所以final类是没有办法动态代理的。5.4、如果项目中有多个类,则需要编写多个代理类,工作量大,不好修改,不好维护,不能应对变化。被代理的类必须实现接口,未实现接口则没办法完成动态代理。
2024-07-13 03:00:00
811
原创 Spring AOP 实现原理
说明:当容器收集BeanPostProcessor类型的Bean对象时,会自动解析该BeanDefinition、实例化对象、属性设置并注入到IOC容器中,该部分逻辑可以参考Spring系列-2 Bean的生命周期,区别在于AnnotationAwareAspectJAutoProxyCreator的注入流程发生在Spring容器收集BeanPostProcessor类型的Bean对象时,而不是加载所有的非懒加载单例Bean。[2] exposeProxy表示是否暴露代理对象,默认值为false;
2024-07-12 03:45:00
567
原创 Spring AOP 使用方式
另外,@AfterThrowing还可添加异常类型的参数,而@AfterReturing可以添加一个Object类型的参数(表示运行结果),以下通过案例的形式进行介绍。其中:advisor将所有的逻辑都封装在了MethodInterceptor的invoke方法中,通过方法完成增强;@Before表示前置增强,@AfterReturing表示后置增强,@Around表示环绕增强,@AfterThrowing表示异常抛出增强,@After表示方法正常执行完或者异常抛出都会执行的增强逻辑;
2024-07-12 03:00:00
336
原创 Spring AOP 基础知识
AOP的技术整合(织入增强逻辑)可以发生在编译器、类加载期以及运行期:AspectJ在编译器(ajc)和类加载器(使用特定的类加载器)实现;抽取重复代码作为一个模块是用户的问题,然而技术整合(对目标织入增强逻辑,后文介绍)以实现功能还原是AOP的目标和工作重心,Spring AOP是该技术的一种实现。, 即表示不进行增强。框架定义切点是为了从目标类的连接点(执行点)中过滤出符合条件的部分,为此在切点类的内部提供类两个过滤器:ClassFilter和MethodMatcher,分别对类型和方法进行过滤。
2024-07-11 11:50:26
600
原创 Java中的独占锁(写锁)和共享锁(读锁)
对 ReentrantReadWriteLock 其读锁是共享锁,其写锁是独占锁。读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。独占锁:指该锁一次只能被一个线程所持有。对 ReentrantLock 和 Synchronized 而言都是独占锁。写入时正常,不会中断;读取时,可以共享锁。共享锁:指该锁可被多个线程所持有。2 示例(模拟缓存)
2024-07-11 03:15:00
226
原创 Java中的公平锁和非公平锁
在Synchronized中,当一个线程释放锁时,JVM会从等待队列中随机选择一个线程来获取锁,而不是按照申请锁的顺序来获取锁,因此Synchronized是一种非公平锁。在并发环境中,每一个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个就占有锁,否者就会加入到等待队列中,以后会按照 FIFO 的规则获取锁。Synchronized是Java中内置的锁机制,它的锁模式是非公平锁,这是因为Synchronized的实现方式是基于对象监视器(monitor)的。
2024-07-10 15:27:00
805
原创 Java中的可重入锁、不可重入锁和自旋锁
可重入锁(也叫做递归锁): 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。可重入锁最大的作用就是避免死锁。可重入锁:指的是同一个线程外层函数获得锁之后,内层仍然能获取到该锁,在同一个线程在外层方法获取锁的时候,在进入内层方法或会自动获取该锁。不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。
2024-07-10 15:17:04
561
原创 Java使用Redis分布式锁实现负载均衡
Java使用Redis分布式锁实现负载均衡的一种常见方式是利用Redisson来进行协调和管理。当某个服务器出现故障或者网络异常时,其对应的成员会被删除,此时需要重新选取另外一个可用的服务器来处理相同请求。客户端在请求服务前先获取全局互斥访问权(即分布式锁),然后从注册中心随机选择一个可用的服务器并发起请求。服务器处理完请求之后返回结果给客户端,并释放全局互斥访问权以便其他客户端能够继续使用它所对应的服务器。每个服务在启动时向该有序集合添加一个成员,并将自己的IP地址和端口号等信息保存到该成员上面去。
2024-07-04 04:00:00
131
原创 Java使用分布式锁来防止缓存穿透与雪崩
实现数据库分布式锁的一种常见方式是使用数据库中的行级锁。3)查询缓存数据:在获得了分布式锁之后,即可查询缓存中是否存在指定数据。如果存在,则直接返回结果;2)获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。如果成功获取到,则可以执行相应操作;4)写入新数据到缓存:在完成所有操作之后,必须及时释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁,并将新查询出来或生成出来的数据写入到缓存中去。1)选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。
2024-07-03 14:53:38
229
原创 使用数据库中的行级锁实现数据库分布式锁
在MySQL中,可以通过SELECT ... FOR UPDATE语句来获取行级排他锁(也称为写锁),从而保证只有一个事务能够修改该行数据。实现数据库分布式锁的一种常见方式是使用数据库中的行级锁。
2024-07-03 14:52:28
232
原创 Java使用分布式锁来做数据库事务控制
2)获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。如果成功获取到,则可以执行相应操作;4)提交或回滚事务:在完成所有操作之后,必须及时提交或回滚当前线程所关联的事务,并释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。3)执行业务逻辑:在获得了分布式锁之后,即可执行相应业务逻辑。例如,在数据库事务场景中可以开启一个新的事务,并将其与当前线程绑定。1)选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。根据具体情况选择最佳方案。
2024-07-03 14:21:05
120
原创 Java使用分布式锁来控制并发流量
2)获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。如果成功获取到,则可以执行相应操作;否则说明已经有其他客户端正在处理该请求,此时可以直接返回或者等待一段时间后再次尝试。1)选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。4)释放分布式锁:在完成所有操作之后,必须及时释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。3)执行业务逻辑:在获得了分布式锁之后,即可执行相应业务逻辑。例如,在Web应用中可以对请求进行限流或者排队处理。
2024-07-03 14:16:05
418
原创 Java使用分布式锁来做分布式任务调度
获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。否则说明已经有其他客户端正在处理该请求,此时可以直接返回或者等待一段时间后再次尝试。执行业务逻辑:在获得了分布式锁之后,即可执行相应业务逻辑。例如,在任务调度场景中可以从队列中取出一个待处理任务,并将其标记为已处理状态。选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。根据具体情况选择最佳方案。释放分布式锁:在完成所有操作之后,必须及时释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。
2024-07-03 12:47:39
439
原创 Java使用分布式锁来防止重复提交
获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。当需要获取锁时,在“/locks”下创建一个临时顺序节点,并记录该节点的名称。4)数据库事务控制:在数据库事务处理过程中,为了防止数据不一致或者死锁等问题,通常需要采用分布式锁机制来保证事务正确执行。选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。释放分布式锁:在完成所有操作之后,必须及时释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。否则,监听前面一个子节点的删除事件,并等待通知。
2024-07-02 11:26:55
527
原创 Java使用分布式实现数据库读写分离
以上代码中定义了两个不同URL地址的MySQL数据库,并且创建了两个不同的BasicDataSouce 数据源对象表示master和slave。配置主从复制:在MySQL中,可以通过配置主从复制来实现数据同步。将一个节点作为主节点(Master),其他节点作为从节点(Slave)。当主节点上的数据发生变化时,自动将变更内容同步到所有从节点上。实现读写分离:在应用程序中,对于查询操作可以优先选择从库进行处理,而对于更新操作则必须使用主库。重启MySQL服务,并登录到MySQL控制台。
2024-07-02 03:30:00
358
原创 如何实现高可用的分布式系统
例如使用配置管理工具(如Ansible)来批量部署应用程序、使用监控告警系统(如Zabbix)来及时发现异常情况并通知管理员处理等。当某个节点出现故障时,其他节点可以自动接管其工作,保证服务的连续性和稳定性。负载均衡:通过负载均衡技术,将请求分发到不同的节点上,避免单一节点过载或故障导致整个系统崩溃。常见的负载均衡算法包括轮询、加权轮询、最小连接数等。在轮询算法基础上增加了权重因素,根据不同服务器的处理能力分配不同比例的请求。将请求依次分配给不同的服务器,每个服务器按照顺序接收到相应数量的请求。
2024-07-01 09:50:58
303
原创 堆是一个完全二叉树
例如 3 , 1 , 2 {3,1,2}3,1,2 可以看作为大根堆,而 3 , 2 , 1 {3,2,1}3,2,1 亦可以看作为大根堆。小根堆的性质与大根堆类似,只不过在二叉树的结构中,根结点<子结点。例如 1 , 2 , 3 {1,2,3}1,2,3 为小根堆,1 , 3 , 2 {1,3,2}1,3,2 同样也是小根堆。若 2 ⋅ i + 2 < n 2·i+2<n2⋅i+2<n ,其右子节点的序号为 2 ⋅ i + 2 2·i+22⋅i+2 ,否则没有右子节点。
2024-07-01 09:49:04
144
原创 分布式机制
Java分布式机制是指在Java平台上实现的一种分布式计算模型,它可以将一个应用程序拆分成多个部分,在不同的计算机节点上运行,并通过网络进行通信和协调。当客户端需要访问服务端提供的功能时,它会向注册表中查找相应的远程对象,并获取其引用。RMI(Remote Method Invocation)是Java平台提供的一种分布式机制,它允许在不同的Java虚拟机之间进行远程方法调用。通过使用RMI,可以将一个应用程序拆分成多个部分,在不同的计算机节点上运行,并通过网络进行通信和协调。
2024-07-01 09:29:13
483
原创 Ribbon的9种负载均衡策略
它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。PredicateBaseRule 类是 ClientConfigEnabledRoundRobbinRule 类的一个子类,它通过内部定义的一个过滤器过滤出一部分服务实例清单,然后用线性轮形的方式从过滤出来的服务实例清单中选取提个服务实例。incrementAndGetModulo() 方法获取一个下标 (是先加1,然后和服务清单总数取模获取到的,不会越界),是一个不断增长的数。
2024-06-30 03:00:00
436
原创 Spring基础知识 - IOC、DI、AOP
4、容器:Spring 框架提供了一个容器,用于管理应用程序的对象和依赖关系,并提供了一些可重用的核心组件,如 BeanFactory、ApplicationContext 等,这些对象可以是 Spring Bean、JDBC 连接、JMS 连接、Servlet 等。从而导致类与类之间的耦合度过高。AOP(Aspect Oriented Programming,面向切面编程)是 Spring 框架提供的一种重要机制,它可以将应用程序中的横切关注点(如日志、事务、安全等)从业务逻辑中分离出来,并集中管理。
2024-06-29 03:30:00
1465
原创 Java基础知识-线程池
自己根据创建线程池的需求来 new 对象(使用) 注意:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。newSingleThreadExecutor(): 该方法返回一个只有一个线程的线程池。线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。
2024-06-29 03:00:00
256
原创 Spring 基础知识
总的来说,过滤器是在 Servlet 容器层面上对请求进行处理的,而拦截器是在 Spring MVC 框架层面上对请求进行处理的,过滤器更加底层,可以对请求进行一些底层的处理,而拦截器更加高级,可以对请求进行一些业务逻辑层面的处理。这种方式可以将对象的创建和管理解耦,并且可以灵活地配置和管理对象。@Autowired是Spring提供的注解,而@Resource是JSR-250规范中定义的注解,因此@Autowired是Spring特有的注解,而@Resource是JavaEE的注解,它们的使用范围不同。
2024-06-29 03:00:00
420
原创 Eureka-Serve的探活机制,是如何判断一个服务不可用的?
Eureka Server不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过期服务,如果在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等!实际,心跳检测机制有一定的不确定行,比如服务提供者可能是正常的,但是由于网络通信的问题,导致在90s内没有收到心跳请求,那将会导致健康的服务被误杀。服务端维护了每个实例的最后一次心跳时间,客户端发送心跳包过来后,会更新这个心跳时间。
2024-06-28 18:25:23
778
原创 Spring 事务失效的 8 种场景
submitOrder()方法和updateProductStockCountById()方法都在OrderService类中,submitOrder()方法上没有标注事务注解,updateProductStockCountById()方法上标注了事务注解,submitOrder()方法调用了updateProductStockCountById()方法,此时,updateProductStockCountById()方法的事务在Spring中会失效。例如,如下代码所示。
2024-06-28 17:31:43
424
原创 AOP的实现原理
它可以实现不用写代理类的实现就可以创建代理类对象;通过代理类对象执行目标接口中的方法,会把方法的调用分派给调用处理器(InvocationHandler)的实现类,执行实现类中的invoke()方法,我们需要把在该invoke()方法中实现调用目标类的目标方法;2.代理角色(连接真实角色的桥梁):实现抽象角色,是真实角色的代理,通过真实角色的角色业务逻辑方法,来实现抽象方法,附加自己的操作。3.真实角色(需要被代理的对象):实现抽象角色,定义真实的角色所要实现的业务逻辑,提供代理角色调用。
2024-06-28 17:16:12
659
原创 Java基础知识-volitile和数据可见性
应用场景:在只涉及可见性,针对变量的操作只是简单的读写(保证操作的原子性)的情况下可以使用volatile来解决高并发问题,如果这时针对变量的操作是非原子的操作,这时如果只是简单的i++式的操作,可以使用原子类atomic类来保证操作的原子性(采用CAS实现),如果是复杂的业务操作,那么舍弃volatile,采用锁来解决并发问题(synchronized或者Lock)。volatile关键字解决的是内存可见性的问题,会使得所有对volatile变量的读写都会直接刷到主存,即保证了变量的可见性。
2024-06-28 04:00:00
257
原创 Java基础知识-线程同步和锁
b.当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象如果多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操作。synchronzied锁的是对象,锁是保存在对象头里面的,根据对象头数据来标识是否有线程获得锁/争抢锁;jdk1.6以前:重量级锁(无法取得锁即挂起,性能差) jdk1.6之后:优化了性能:给它的锁加入了四种状态,无锁状态 -> 偏向锁 -> 轻量级锁 -> 重量级锁,自动进行锁的升级。
2024-06-28 03:00:00
447
原创 Java基础知识-线程
应用场景:在只涉及可见性,针对变量的操作只是简单的读写(保证操作的原子性)的情况下可以使用volatile来解决高并发问题,如果这时针对变量的操作是非原子的操作,这时如果只是简单的i++式的操作,可以使用原子类atomic类来保证操作的原子性(采用CAS实现),如果是复杂的业务操作,那么舍弃volatile,采用锁来解决并发问题(synchronized或者Lock)。当你调用 run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。死亡的线程不可再次复生。
2024-06-27 11:38:59
458
原创 Java基础知识-集合类
当我们创建 hashmap 时 会先创建一个数组,当我们用 put 方法存数据时,先根据 key 的 hashcode 值计算出 hash 值,然后用这个哈希值确定在数组中的位置,再把 value 值放进去,如果这个位置本来没放 东西,就会直接放进去,如果之前就有,就会生成一个链表,把新放入的值放在头部,当用 get 方法取值时,会先根据 key 的 hashcode 值计算出 hash 值,确定位置,再根据 equals 方法从该位置上的链表中取出该 value 值。di 是产生冲突的时候的增量序列。
2024-06-27 10:24:52
993
原创 8.C语言的循环
而且 goto 语句不建议滥用,能不用就不用,因为 goto 语句可以打乱程序原本的执行顺序,这大大降低了程序的可读性,提高了改错成本。或者你就理解为覆盖,但是新的 i 开辟的是新的内存,它不会真的覆盖旧的 i )。让 for 语句声明自己的循环控制变量通常是一个好办法:这样方便且程序的可读性更强,但是如果在 for 循环退出后还要使用该变量,则只能使用以前的 for 语句格式。除非循环体内有控制循环的语句(break,return,goto)或者调用了导致程序终止的函数,非则上面的循环永远不会结束。
2024-06-26 18:34:07
954
原创 7.C语言的选择语句
注意: 表达式 i < j < k 在 C 语言中是合法的,但是可能不是你所期望的含义。C 语言的关系运算符(relational operator)和数学上的 >,
2024-06-26 18:10:32
897
原创 6.C语言表达式
根据 C89 的标准,如果两个操作数中有一个是负数,那么除法结果既可以向上取整也可以向下取整(例如,-9 / 7 的结果既可以是 -1 也可以是 -2);i % j 的符号与具体实现有关(例如,-9 % 7 可以是 -2 也可以是 5)。在 C99 中,除法的结果总是向零取整(因此,-9 / 7 的结果是 -1);我特意测试了以下,9 % -7 的值是 2,-9 % -7 的值还是 2)。不同的编译器给出的结果可能是不同的。但是,当子表达式改变了某个操作数的值时,产生的值就可能不一致了。
2024-06-25 15:54:02
818
原创 5. C语言数据类型
八进制与十六进制只是书写数的方式,他们不会对数的实际存储方式产生影响(整数都是以二进制形式存储的)。因此,为了改进这个程序,我们可以将 int 型的 a,b,sum 都变为 long long 型(考虑到 32 位机器的 long 与 int 大小是相同的。对于 8 位 的微型计算机(如:最初的苹果机),1 字长 只有 8 位,从那以后,个人计算机的字长增至 16 位,32位,直至目前的 64位。例如,字符 'A' 的值是 65,'a' 的值是 97,'0' 的值是48,' ' 的值是 32。
2024-06-25 15:02:16
931
基于多任务卷积网络(MTCNN)和Center-Loss的多人实时人脸检测和人脸识别系统.rar
2024-07-22
ChatGPT大模型学习笔记.rar
2024-07-22
Java+Servlet学生信息管理系统全部源码+SQL+课程设计文档.rar
2024-07-22
Java Spring AOP 面向切面编程的4种实现
2024-07-16
基于AoI器件的SPI PCB板工业缺陷检测数据集
2024-07-10
CNN深度学习检测胸部疾病的项目数据集
2024-07-10
北京大学人机交互开放实验室发布的PCB缺陷数据集.txt
2024-07-10
混合型晶圆缺陷探测数据集
2024-07-10
单个和混合缺陷模式的晶圆映射数据集
2024-07-10
用于质量检查的铸件产品图像数据
2024-07-10
工业铸造产品缺陷预测图像数据集
2024-07-10
学生信息管理系统-JavaWeb课程设计-完整代码+初始化SQL+文档
2024-06-26
大数据课程设计-MapReduce实现基于物品相似度的协同过滤推荐-全部代码和数据.rar
2024-06-20
大数据课程设计-Hadoop-MapReduce实现sql的统计、groupby和join-全部源码
2024-06-20
基于MapReduce的网站访问数据指标统计-Hadoop-大数据课程设计-全部源码和数据.rar
2024-06-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人