自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

后端

后端相关的技术博客

  • 博客(46)
  • 收藏
  • 关注

原创 Redis工具类(解决缓存穿透、缓存击穿)

该工具类包含以下功能:1.将任意对象存储在 hash 类型的 key 中,并可以设置 TTL2.将任意对象存储在 hash 类型的 key 中,并且可以设置逻辑过期时间3.将空对象存入 hash 类型的 key 中,并且可以设置超时时间4.缓存空对象解决缓存穿透5.布隆过滤器解决缓存穿透6.布隆过滤器+缓存空对象解决缓存穿透7.互斥锁解决缓存击穿8.逻辑过期解决缓存击穿以下是关键代码。

2024-10-26 19:26:17 365

原创 解决Redis缓存击穿(互斥锁、逻辑过期)

本质就是让所有线程在缓存未命中时,需要先获取互斥锁才能从数据库查询并重建缓存,而未获取到互斥锁的,需要不断循环查询缓存、未命中就尝试获取互斥锁的过程。采用逻辑过期的方式时,key 是不会过期的,而这里由于是热点 key,我们默认其是一定存在于 redis 中的(可以做缓存预热事先加入 redis),因此如果 redis 没命中,就直接返回空。这里先预热,将 id 为 1 的数据加入,并且让过期字段为过去的时间,即表示此数据已过期。可以看到部分结果返回的旧数据,而部分结果返回的是新数据。

2024-10-26 14:56:51 882

原创 解决Redis缓存穿透(缓存空对象、布隆过滤器)

这里选择使用布隆过滤器存储存在于数据库中的 id,原因在于,如果存储了不存在于数据库中的 id,首先由于 id 的取值范围很大,那么不存在的 id 有很多,因此更占用空间;相反,如果存储的是数据库中存在的 id,那么即使少数不存在的 id 被判为了存在,由于数据库中确实没有对应的 id,那么也会返回空,最终结果还是正确的。由于布隆过滤器有一定的误判率,所以这里可以进一步优化,如果出现误判情况,即原本不存在于数据库中的 id 被判为了存在,就用缓存空对象的方式将其缓存到 redis 中。

2024-10-25 22:22:04 1333

原创 基于Redis实现共享Session登录

添加刷新拦截器的原因在于,如果用登录校验拦截器进行刷新工作,由于排除了部分路径,因此如果用户一直访问这些被排除的部分路径,会导致用户 token 的有效期不会被刷新。登录、注册时,需要使用手机号将验证码取出,并且以随机 token 作为 key,用户信息作为 value 保存用户数据,这里的用户数据用 hash 类型保存。这里使用随机 token 而不使用手机号作为 key 的目的在于,浏览器是需要存储这个 key 的,以便校验登录状态,如果使用手机号会不安全。1.发送短信验证码的接口。

2024-10-24 22:52:09 1247

原创 Sentinel隔离、降级、授权规则详解

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现接口/*** 处理请求被限流、降级、授权拦截时抛出的异常:BlockException*/;可以看到,handle()方法中有一个类型为的参数,这个参数表示了具体的异常,而包含很多个子类,分别对应不同的场景,如下所示异常说明限流异常热点参数限流的异常降级异常授权规则异常系统规则异常实现自定义异常返回结果的具体方式是,定义一个类,实现@Component@Override。

2024-07-24 16:43:34 1164

原创 Sentinel限流规则详解

簇点链路就是项目内的调用链路(Controller -> Service -> Mapper),链路中被监控的每个接口就是一个资源。默认情况下 Sentinel 会监控 SpringMVC 的每一个**端点(Endpoint)**,因此 **SpringMVC 的每一个端点(Endpoint)就是调用链路中的一个资源**(这里指的就是 Controller 中的方法)流控、熔断等都是**针对簇点链路中的资源**来设置的,因此我们可以点击对应资源后面的按钮来设置规则:

2024-07-23 19:35:57 1627

原创 Sentinel快速入门

将服务 A 的资源划分成一个又一个独立的线程池,此时假设服务 C 挂掉了,那么服务 A 中只有一个线程池的资源会被耗尽,不会导致所有的资源被耗尽。雪崩问题,因为假设等待时间为 1s,因为一个服务内部对于请求的处理是串行的,所以此时就是一秒释放一个请求,但是如果进入的请求是每秒两个,那么资源终究还是会被消耗殆尽。这种方式不能完全避免服务的故障,因为高并发只是引起服务故障的原因之一,还有其他的问题,例如网络问题,此时就要用到其他的解决方案。跟之前的线程隔离的原理是类似的,也就是将服务划分成多个独立的线程池。

2024-07-23 13:06:23 1222

原创 Nacos配置管理

但是若想读取 Nacos 配置文件信息,需要获取 Nacos 地址,而 Nacos 的地址在本地配置文件中,是靠后的,因此会导致读取失败。,它优先级比 Nacos 配置文件高,因此会被优先读取,此时将 Nacos 地址等相关信息放进去就可以完成 Nacos 配置文件的读取。**注意:**这里的配置信息不要填写 application.yml 中的一切信息,而是写有变化的配置。3.测试,使用 Postman 发送请求,得到如下结果,可以看到,该配置文件被成功加载。

2024-07-21 09:36:33 886

原创 解决Nacos配置注入异常:Could not resolve placeholder ‘pattern.dateformat‘ in value ${pattern.dateformat}

问题产生于,引入 Nacos 配置管理依赖,并将有关 Nacos 的信息从 application.yml 转移到 bootstrap.yml,然后在 Nacos 中填写配置文件,并在服务里通过。可以看到,serviceName 为空,表示配置信息里的服务名称并没有加载成功,也就说明了 bootstrap.yml 文件没有被加载。这个问题就是博主的问题产生原因,因为没有加载 bootstrap 文件,导致信息丢失。那一行代码删掉,重新启动,可以发现服务可以启动,但是中间出现了报错信息,如下。

2024-07-20 14:13:53 978

原创 Nacos原理和应用

与 Eureka 不同的是,在健康监测中,Nacos 将服务提供者分成**临时实例**和**非临时实例**(默认是临时实例)。对于临时实例来说,和 Eureka 一样,采用心跳监测的方式进行健康监测,若服务超时没发送心跳会被注册中心直接剔除。对于非临时实例来说,Nacos 不要求做心跳监测,而是 Nacos **主动**发请求询问服务是否还正常,若非临时实例不正常,Nacos **不会将其剔除**,而是仅仅**标记**其为不健康的状态,并等待其恢复健康其次,若 Nacos 发现有服务挂了,会立即**推送*

2024-07-20 12:28:34 1225

原创 Eureka原理和应用(结合Feign)

存在下面的问题:① 代码可读性差,编程体验不统一② 参数复杂,URL 难以维护Feign是一个声明式,其作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题一般我们会使用 Feign 来配合注册中心的使用,以更方便地进行服务发现、负载均衡和熔断处理等类型作用说明修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL响应结果的解析器http 远程调用的结果做解析,例如解析 json 字符串为 java 对象请求参数编码。

2024-07-19 12:55:44 1334

原创 Spring事务传播行为

1.在 REQUIRED中,外部事务和内部事务只要有一方发生异常,都会发生回滚和NESTED在外部事务不发生异常,内部事务发生异常的情况中表现一致:如果内部事务抛出了异常,会导致外部事务同内部事务一起回滚;如果内部事务捕获异常且不抛出,外部事务不会回滚。和NESTED在外部事务发生异常,内部事务不发生异常的情况表现不同:在中,仅仅是外部事务回滚,而内部事务不会回滚;在NESTED中,外部事务和内部事务都会回滚因为自定义的回滚操作发生了回滚,原因与一致。

2024-07-09 16:09:13 1023

原创 Java定时任务——Spring Task

但这里需要注意的是,如果使用默认的方式,不修改线程池参数,即单线程执行,如果前一个任务执行时长大于定时时长,下一个任务的执行会等到上一个任务执行完后立即执行。但是如果增大线程池的线程数量,如果线程数量足够,下一个任务的执行不会被上一个任务所阻塞,而是会在定时结束后就立即执行,即出现任务并行执行的情况。,如果 5 日是星期六,则在 4 日(星期五)触发。可以看到,设定的延时时间为 5s,而实际上延迟的时间是 7s,原因在于默认线程池大小为 1,任务只能串行执行,后面的任务会受到前面任务执行耗时的影响。

2024-07-08 23:32:34 1507

原创 RabbitMQ实现延迟队列

死信交换机、延迟队列插件① 声明死信交换机并编写监听方法② 声明延迟队列和对应的交换机,在声明队列时配置ttl属性③ 发送消息时,设置超时时间(实际上延迟队列的ttl和消息的超时时间至少有一个设置了就行)① 声明一个交换机,设置 delayed属性为true② 发送消息时,添加 x-delay头,值为超时时间。

2024-07-07 15:07:08 1738

原创 RabbitMQ保证消息可靠性

确保 RabbitMQ 消息的可靠性一共分为四步:1.开启生产者确认机制,确保生产者的消息能到达队列2.开启持久化功能,确保消息未消费前在队列中不会丢失3.开启消费者确认机制为 auto,由 Spring 确认消息处理成功后完成 ack4.开启消费者失败重试机制,并设置 MessageRecoverer,多次重试失败后将消息投递到异常交换机,交由人工处理。

2024-07-06 21:46:49 1353 5

原创 RabbitMQ工作模式

对应 fanout(广播) 类型的 Exchange,会把所有发送到该 Exchange 的消息路由到所有与它绑定的 Queue 中,不需要做任何判断操作,所以 fanout 类型是所有的交换机类型里面速度最快的。”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”包含一个生产者、一个队列和多个消费者,多个消费者绑定到同一个队列上,且一条消息只能被一个消费者消费。

2024-07-06 12:10:43 1298

原创 Stable Diffusion生成诗词背景图

常见的反向提示词有 NSFW, worst quality, low quality, normal quality, lowres,normal quality, monochrome,grayscale, skin spots, acnes,skin blemishes, age spot, ugly, duplicate,分别对应NSFW,最差质量,低质量,正常质量,低分辨率,正常质量、单色、灰度、皮肤斑点、痤疮、皮肤瑕疵、老年斑、丑陋、重复。就是利用你输入的文本来生成出对应的图像,而。

2024-04-06 17:45:44 1529

原创 从零开始部署本地大模型(Langchain-chatchat)

项目默认配置的LLM模型是THUDM/chatglm3-6b,Embedding模型是BAAI/bge-large-zh。但由于本计算机显卡配置不足以支撑这两个模型,因此采用的LLM模型是Qwen/Qwen-1_8B-Chat,Embedding模型是moka-ai/m3e-base。注意:如果此时无法打开Web UI界面,就去命令行里输入邮箱,随便输一个就可以,然后就能进入了。然后,也可以修改LLM_DEVICE设备,默认是auto,这里我改成了cuda,即GPU运行。后缀的文件,需要去掉这些后缀。

2024-03-21 17:05:08 1934 1

原创 自制笔记 | JavaWeb——SpringBoot原理(持续更新...)

场景:在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter需求:自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类AliyunOSSUtils的自动配置目标:引入起步依赖之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可步骤:① 创建aliyun-oss-spring-boot-starter模块。

2024-03-10 20:36:01 973

原创 自制笔记 | JavaWeb——AOP(持续更新...)

而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时参数、返回值、方法执行时长。:根据业务需要,可以使用且(&&)、或(||)、非(!抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。:单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的。:多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数。

2024-03-10 20:25:08 1028

原创 自制笔记 | JavaWeb——Spring事务管理(持续更新...)

问题:因为事务默认是REQUIRED,因此insert的这个方法会加入现有事务中,而因为现有事务抛出了异常,所以会回滚,导致insert也被回滚。作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;改成REQUIRES_NEW后,insert会创建新的事务,新的事务提交后,不会被原来的事务影响。:事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。即使程序运行抛出了异常,部门依然删除了,但是部门下的员工却没有删除,造成了数据的不一致。

2024-03-10 20:19:09 397

原创 自制笔记 | JavaWeb——MyBatis(持续更新...)

**本质:**① sun公司官方定义的一套操作所有关系型数据库的规范,即接口② 各个数据库厂商去实现这套接口,提供数据库**驱动jar包**③ 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类① 数据库连接池是个容器,负责分配、管理数据库连接(Connection)② 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个③ 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏**优势:**① 资源重用

2024-03-10 20:00:06 1144

原创 自制笔记 | JavaWeb——MySQL(持续更新...)

① SQL语句可以单行或多行书写,以分号结尾② SQL语句可以使用空格 / 缩进来增强语句的可读性③ MySQL数据库的SQL语句不区分大小写④ 注释:使用foreign key定义外键关联另外一张表缺点:① 影响增、删、改的效率(需要检查外键关系)② 仅用于单节点数据库,不适用于分布式、集群场景③ 容易引发数据库的死锁问题,消耗性能**逻辑外键(推荐):**在业务层逻辑中,解决外键关联。通过逻辑外键,就可以很方便的解决多表关联中的问题**2.一对一**一对一关系,多用于单表拆分,

2024-03-10 19:46:22 942

原创 自制笔记 | JavaWeb——分层解耦(持续更新...)

之前的代码中,Controller层在调用service层时,是new了一个对象EmpServiceA,而如果要切换Service的实现,将EmpServiceA切换为EmpServiceB,此时Controller层需要将EmpServiceA改成EmpServiceB,即Service层的代码发生改动,Controller层的代码也要发生改动,即这两个层之间的代码是耦合的。① 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

2024-03-10 19:38:23 951

原创 自制笔记 | JavaWeb——Postman请求方式(持续更新...)

在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取。:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数。参数名与形参变量名相同,定义形参即可接收参数,会自动发生类型转换。请求参数名与形参对象属性名相同,定义POJO接收即可。:请求参数名与形参集合名称相同且请求参数为多个,**相同,定义POJO类型形参即可接收参数,需要使用。来标识该路径参数,需要使用。

2024-03-10 19:30:05 602

原创 自制笔记 | JavaWeb——Http协议(持续更新...)

Hyperextransferrotocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则特点:① 基于TCP协议:面向连接、安全② 基于请求-响应模型的:一次请求对应一次相应③ HTTP协议是的协议:对于事务处理没有记忆能力。每次请求-响应都是的缺点:多次请求间不能共享数据优点:速度快。

2024-03-10 19:17:01 939

原创 自制笔记 | JavaWeb——Maven详解(持续更新...)

Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建仓库:用于存储资源,管理各种jar包① 本地仓库:自己计算机上的一个目录② 中央仓库:由Maven团队维护的全球唯一的。③ 远程仓库(私服):一般由公司团队搭建的私有仓库传递路线:① 不考虑远程仓库② 考虑远程仓库。

2024-03-09 17:57:00 1041

原创 自制笔记 | JavaWeb——Vue(持续更新...)

Vue是一套,免除原生JS中的DOM操作,简化书写基于(Model-View-ViewModel)思想,实现数据的,将编程的关注点放在数据上:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。基于框架进行开发,更加快捷、更加高效① 新建HTML页面,引入Vue.js文件

2024-03-09 17:41:42 846

原创 自制笔记 | JavaWeb——JavaScript(持续更新...)

JavaScript是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互。

2024-03-09 12:37:48 870

原创 自制笔记 | Java基础——注解(持续更新...)

关于注解的解析,一般是在框架的底层已经写好了。所有的类成分Class,Method,Field,Constructor,都实现了AnnotatedElement接口,他们都拥有解析注解的能力。④ 比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解。② 比如注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解。注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容。元注解就是注解注解的注解,也就是写在注解上面的注解。

2024-03-09 12:15:39 408

原创 自制笔记 | Java基础——单元测试(持续更新...)

扩展点:在单元测试中,断言:参数一:当两个结果一样的时候,出现的提示消息;JUnit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用JUnit编写单元测试。的,而是自己独立写一个测试类(不要写main方法),在这个类中编写一些方法,在方法里面调用要被测试的方法即可。① 只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响。,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性。② 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。

2024-03-09 12:12:58 358

原创 自制笔记 | Java基础——xml(持续更新...)

配置文件是用来保存程序在运行时需要的一些参数常见的配置文件:txt、properties、xmltxt:优点:没有优点缺点:不利于阅读优点:键值对形式易于阅读、解析简单缺点:无法配置一组一组的数据(例如有多个用户时,一个键就会对应多个值)XML:优点:易于阅读、可以配置成组出现的数据缺点:解析比较复杂配置文件的选择:数据量较少,一个键只对应一个值,使用properties;数据量较多,使用xmlXML的全称为EXtensible Markup Language,是一种可扩展的。

2024-03-09 12:08:27 956

原创 自制笔记 | Java基础——log日志(持续更新...)

Logback是基于slf4j的日志规范实现的框架,性能比之前使用的log4j要好。① 可以将系统执行的信息选择性地记录到指定的位置(控制台、文件中、数据库中)程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。需求:导入Logback日志技术到项目中,用于记录系统的日志信息。作用:用于控制系统中哪些日志级别是可以输出的,只输出级别。ALL和OFF分别是打开全部日志信息,及关闭全部日志信息。作用:用于控制系统中哪些日志级别是可以输出的,只输出级别。:一些接口,提供给日志的实现框架设计的标准。

2024-03-09 12:03:04 467

原创 自制笔记 | Java基础——反射(持续更新...)

动态创建对象,即创建配置文件内容里的对象,并调用内容里的方法,而即使配置文件发生改变,程序也不用改变。① 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑。反射允许对成员变量,成员方法和构造方法的信息进行编程访问。参数二:调用方法的传递的参数(如果没有就不写):返回所有公共成员方法对象的数组,:返回所有公共成员变量对象的数组。:返回所有成员方法对象的数组,:返回所有构造方法对象的数组。:返回所有成员变量对象的数组。:返回单个公共成员变量对象。:返回单个公共成员方法对象。:返回单个成员变量对象。

2024-03-09 11:59:50 386

原创 自制笔记 | Java基础——网络编程(持续更新...)

网络编程就是在网络通信协议下,不同计算机上运行的程序,进行的数据传输Java中可以使用包下的技术轻松开发出常见的网络应用程序C/S:Client/Server(客户端 / 服务器):在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序B/S:Browser/Server(浏览器 / 服务器):只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器在BS架构中,所有的图片、音频资源等都需要服务器传输到本地电脑上,而在CS架构中,这些资源包含在安装包内,已经在本地电脑上。

2024-03-09 11:50:15 856

原创 自制笔记 | Java基础——多线程&JUC(持续更新...)

① 核心线程数量(不能小于0)② 线程池中最大线程的数量(最大数量 >= 核心线程数量)③ 空闲线程最大存活时间(值)(不能小于0),表示除了核心线程以外的线程空闲多长时间会被销毁④ 空闲时间(单位)(用TimeUnit指定)⑤ 阻塞队列(不能为null)⑥ 创建线程的方式(不能为null)⑦ 要执行的任务过多时的解决方案(不能为null)

2024-03-09 11:38:09 866

原创 自制笔记 | Java基础——File、IO流(字节流、字符流、缓冲流、转换流等)(持续更新...)

如果先用序列化流将一个对象保存到文件中,然后再修改这个对象的类的结构,再用反序列化流读取文件中的对象,此时会报错。,对象中会包含版本号,文件中也会包含版本号信息。如果修改了类的结构,那么类的版本号会发生变化,进而导致用反序列化流读取对象时,版本号匹配失败,最后代码报错。:有一些特有的方法,可以把集合中的数据,按照键值对的形式写到配置文件当中,也可以把配置文件中的数据,读取到集合中来。:有一些特有的方法,可以把集合中的数据,按照键值对的形式写到配置文件当中,也可以把配置文件中的数据,读取到集合中来。

2024-03-09 11:02:43 886

原创 自制笔记 | Java基础——异常(异常处理、自定义异常等)(持续更新...)

异常就是代表程序出现的问题Error:代表的系统级别错误(属于严重问题),系统一旦出现问题,sun公司会把这些错误封装成Error对象。Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它异常体系最上层的父类为ExceptionException:叫做异常,代表程序可能出现的问题。我们通常会用Exception以及他的子类来封装程序出现的问题运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常(如:数组索引越界异常)。

2024-03-09 10:42:52 929

原创 自制笔记 | Java基础——集合(下)(HashMap、TreeMap、Stream等)(持续更新...)

**HashMap的特点:**① HashMap是Map里面的一个实现类② 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了③ 特点都是**由键决定的:无序、不重复、无索引**④ HashMap跟HashSet底层原理是一模一样的,都是**哈希表**结构**HashMap的底层原理:**哈希表中存放的对象是Entry对象,里面包含键和值,而哈希值是由键来计算,**跟值无关**。在使用put方法添加对象时,若当前位置为null,则直接添加该对象;若当前位置不为null,则比较该位

2024-03-09 10:34:30 961

原创 自制笔记 | Java基础——集合(上)(ArrayList、LinkedList、HashSet、TreeSet等)(持续更新...)

集合与数组的区别:① 长度:数组的长度是固定的集合的长度是可变的(自动伸缩)② 存储类型:数组可以存基本数据类型,也可以存引用数据类型集合可以存引用数据类型,但若要存基本数据类型,需要将其转换为对应的包装类创建集合的对象:泛型:限定集合中存储数据的类型//E为引用数据类型或者包装类打印对象时,不是打印地址值,而是集合中存储的数据内容,在展示的时候会拿[]把所有的数据进行包裹基本数据类型对应的包装类byteByteshortShortcharCharacterint。

2024-03-09 10:24:16 874

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除