JAVA菜鸟从零开始----面试题篇
一、基础
1.1、java的8种基本数据类型
byte,short,int,long,float,double,char,boolean
1.2、按照从小到大排序
byte(1字节) < short(2字节) < int(4字节) < long(8字节) < float(4字节,2的次方) < double(8字节,2的次方)
注意:float的取值范围大于long,取是是2的幂次方
char(单个字符,java中占2字节) boolean(1字节)
1.3、数组的排序
冒泡排序、选择排序、插入排序、快速排序
例:
冒泡排序——取相邻两个数进行比较,较大的数交换到后面,第一轮就可以把最大的数交换到数组末尾,后面遍历的次数依次减一(不用遍历最后面的数了),直到遍历到第一个数
1.4、hashmap底层原理
hashmap底层采用哈希表这种数据结构,在jdk1.7中使用的是
数组+链表,在jdk1.8中做了优化,采用的是数组+链表+红黑树,当某个桶位上链表的长度过长【>=8】,并且数组长度【>64】时,会将该桶位上的链表进行数化,来提高哈希表的整体查找性能。
1.5、hashmap put元素的过程
- hashmap中的table数组的创建延迟到第一次put元素的时候,采用
延迟加载的策略,提高内存的利用率。- 它首次扩容的长度为
16,扩容阈值为0.75,扩容策略为数组的2倍,数组容量一定为2的幂次方,尽量避免哈希冲突。- 它put元素的过程是首先通过key的哈希码计算出数组下标所在的位置,如果当前位置为null就创建一个node对象类封装元素的key和value并加入到计算出来的索引位置。
- 如果添加的元素的key与当前桶位上的元素的key相等则进行value的覆盖操作
- 如果添加的元素的key与当前桶位上的元素的key不相等,则执行添加操作,分两种情况:1.红黑树,2.链表
1.6、= = 和 equals 的区别?
- “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
- equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
1.7、ajax中GET和POST区别?
- 语义化的区别:get偏向于获取,post偏向于提交数据
- 携带给后端的信息位置不一样
get直接在地址后面拼接查询字符串
post在请求体内进行信息的查询- 携带的数据格式不一样
get:因为携带的数据是直接拼接在地址后面,只能使用url编码
post:因为在请求体内,所以可有多种形式,但是需要提前说明- 携带的数据大小不一样
get:因为拼接在地址后面,大小在2kb左右
post:因为在请求体内,数据大小不受限制,除非服务器有显示- 安全性能
get:明文发送,不安全
post:相对安全- 浏览器缓存
get:浏览器会主动缓存
post:浏览器不会主动缓存
1.8 #{ }和 ${ } 的区别?
#{}:相当于原生JDBC中使用?在sql语句中进行参数的占位,然后通过PreparedStatment进行参数值的注入,在这个过程中会自动的进行java类型和mysql数据类型的自动转换,而且还可以有效的防止sql注入,推荐使用的方式
${}:相当于将传入的参数值直接以字符串的方式拼接到sql语句中,存在注入问题【不安全】,并且不会进行从JAVA类型到Sql的类型的自动转换(批量删除员工信息,排序,不清楚表名情况下的操作)
1.9、bean的生命周期
可以通过bean标签的scope属性设置组件的生命周期
取值常用的两个:singleton【单例 默认的】 prototype【多例】单例:在容器初始化时创建对象,在容器关闭时销毁【基本都是单例】
多例:在用户获取该对象时创建,而且每次创建的都是新的对象,而且对象的创建时机发生在从容器获取对象时
实例化,属性赋值,初始化,销毁
1.10、常见的响应状态码:
200 OK :表示一切正常
302:重定向
304: 未修改的 读取了本地缓存
400 参数的格式存在问题
401:没有认证
403:没有访问权限
404:未找到请求的资源 请求地址写错了
405:请求方式错误
429:微服务,请求过于频繁
500 Server Error: JAVA代码出现异常
503:服务器正在启动,未启动成功4xx都是客户端的问题 5xx都是服务器的问题
二、面向对象
2.1、谈谈你对面向对象的理解
- 面向对象和面向过程,是两种不同的处理问题的角度。
面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)、及各自需要做什么。比如:洗衣机洗衣服
面向过程会将任务拆解成一系列的步骤(函数),
1、打开洗衣机——>2、放衣服——>3、放洗衣粉——>4、清洗——>5、烘干
面向对象会拆出人和洗衣机两个对象:
人:打开洗衣服、放衣服、放洗衣粉
洗衣机:清洗、烘干
从以上例子能看出,面向过程比较直接高效,而面向对象更易于复用、扩展和维护。
原文链接
2.2、方法的重载和重写
方法的
重载发生在同一个类中,方法的参数个数,参数顺序或者参数类型不同。
方法的重写发生在父子类之间,要有父类引用指向子类对象,方法的签名完全相同,方法体不同
2.3、抽象类和接口的区别
- 抽象类是单继承,接口是多实现
- 抽象类是从属性和行为两个方向进行抽象,接口是同行为单一方向进行抽象,因此接口抽象能力更强
- 抽象类既可以是方法声明,也可以是方法实现,接口只能是方法声明
- 抽象类可以定义成员变量,接口只能定义属性
三、IO流
3.1、流的分类
按流向:输入流、输出流
按传输单位:字节流、字符流
按流对象的结构:基本流、包装流
四、多线程
4.1、创建线程的几种方式
- 继承
thread类,重写run方法,不能再继承其他类- 实现
runnable接口,重写run方法,不能有返回值,不能声明异常- 实现
callable接口,重写call方法,java 8提供- 使用线程池:固定个数的线程池,动态个数线程池
4.2、线程池的优势
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性
4.2、有用过哪些线程池
- 定长线程池(FixedThreadPool)
- 定时线程池(ScheduledThreadPool )
- 可缓存线程池(CachedThreadPool)
- 单线程化线程池(SingleThreadExecutor)
五、线程安全
5.1、string是线程安全的吗,如何解决?
string是final修饰的类,是不可变的,所以是线程安全的。
stringbuilder是可变的,不是线程安全的。
stringbuffer是可变的,所有的公开方法被synchronized修饰,是线程安全的运行速度 string > stringbuilder > stringbuffer
5.2、ArrayList不是线程安全的,如何解决?
- 使用线程安全版的Vector
- 调用Collections工具类的synchronizedXXX方法将当前集合转换成线程安全的,也是采取加锁的方式来保证线程安全的
- 使用JUC包中提供的增强版线程安全集合
CopyOnWriteArrayList,用法和ArrayList一样【推荐】
5.3、HashMap不是线程安全的,如何解决?
- 使用Hashtable
- 调用Collections工具类的方法
- 使用JUC包中提供的
ConcurrentHashMap,性能比前两种方式更佳,同时可以保证线程安全【推荐】
5.4、ReentrantLock 与 synchronized的区别
- synchronized 属于非公平锁,ReentrantLock 支持公平锁、非公平锁;
- synchronized 不支持尝试加锁,ReentrantLock 支持尝试加锁,支持带超时时间的尝试加锁;
- synchronized 不支持响应中断的获取锁,ReentrantLock 提供了响应中断的加锁方法;
- synchronized 不支持带条件,ReentrantLock支持;
- synchronized 是关键字
- 其他底层实现上、实现机制上、锁的对象上、释放锁的方式上也有区别。
六、线程通信
6.1、如何实现线程之间的通信
wait() notify() notifyAll() 这三个方法都是基于锁对象的,object类的方法
sleep() 线程类的方法
6.2、说明一下sleep方法和wait方法的区别?
- sleep方法属于线程类的一个静态方法 wait方法属于Object对象的方法
- wait方法必须和synchronized一起使用,sleep方法没有这个要求
- .wait方法在进入等待后立马释放锁,sleep方法如果写在同步代码块中,进入休眠后不会释放锁
七、网络编程
IP+端口的组成称为
套接字Socke应用层常用协议:http https ftp
传输层协议:tcp udp
八、反射
8.1、什么是反射?
在运行状态中。
- 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
- 获取任意对象的属性,并且能改变对象的属性
- 调用任意对象的方法
- 判断任意一个对象所属的类
- 实例化任意一个类的对象
8.2、反射获取字节码对象的三种方式
- Class.forName(“类的全限定名”) 【使用最多】
- 类型名.class【掌握】
- 基于一个对象去调用它的getClass()方法,获取对象实际类型的字节码对象【了解】
九、设计模式
9.1、你有使用过哪些设计模式?
- 单例模式:配置类config的对象只能有一个,bean就是单例的。
- 工厂模式: 使用BeanFactory工厂创建对象, 不用自己去new对象
- 代理模式: spring中的aop底层实现就是动态代理
- 适配器模式: SpringMvc中的HandlerInterceptorAdapter就是适配器模式
- 建造者模式: mybatis中的SqlsessionFactoryBuilder就是建造者模式, 遵循了单一职责原则, 只做一件事。
- 生产者消费者模式:MQ使用的就是生产者消费者模式
十、前端相关
10.1、css实现上下左右垂直居中对齐的方式
1.使用flex布局
<div class="center-item"> <div> 居中块状</div> </div> .center-item{ display:flex; align-items:center; justify-content:center; }
.content { width: 300px; height: 300px; position: absolute; content: ''; top: 50%; /*偏移*/ left:50%; transform: translate(-50%,-50%); }
(略)
十一、jdk1.8新特性
stream流,lambda表达式,支持链式编程,添加了新的时间和日期api。
hashmap中添加了红黑树
线程创建添加了callable接口
java8新特性
十二、数据库
【数据库基本操作】:
12.1、表的修改(DDL语句)
表的修改(DDL语句) 创建表 - create table 表名(列名 varchar(20)) engine=innodb default charset=utf8 删除表 - drop table (不保留表结构) 添加一列 - alter table 表名 add column 列名 varchra(20) 删除该列 - alter table 表名 drop column 列名
12.2、数据的修改(DML语句)
数据的修改(DML语句) 添加 - insert into 表名 values(字段值) 删除 - delete from 表名 where 条件 - truncate table 表名 (保留表结构) 修改 - update 表名 set 字段名1=值,字段名2=值 where 条件 查看 - select 查询内容 from 表名 where 条件 查看表中所有数据 - select* from 表名 查询符合条件的行数 - select count(1) from 表名 where 条件 多表查询 - select * from 表1 join 表2 on 合并条件 order by 排序条件
12.3、用户访问权限修改(DCL语句)
用户访问权限修改(DCL语句) 添加用户 - create user 用户名 identified by 密码 设置权限 - grant select on 数据库.表名 to 用户名 回收权限 - revoke 操作类型【增删改查】 on 数据库.表名 from 用户名 删除用户 - drop user 用户名
12.4、事务的属性
事务的属性 1.原子性 2.一致性 3.隔离性 4.持久性
12.5、事务的四种隔离级别
事务的四种隔离级别? 读未提交 `read uncommitted`(脏读) 读已提交 `read committed` 可重复读 `repeatable read` 串行化 ` serializable `
12.6、数据库表设计
数据库表设计 第一范式:列不可再分,表中的每个字段属性应该保证原子性 第二范式:表中除了主键字段外,所有的非主键字段必须完全依赖主键不能产生部分依赖 第三范式:除了主键字段外,其他所有非主键字段必须直接依赖主键不能产生传递依赖
十三、spring
写一个接口从控制器到数据库有哪些注解
@Controller
@restController
@RequestMapping
@ResponseBody
@PathVariable 接收请求路径中的占位符的值
@RequestParam 接收请求路径后,也就是问号后面的参数 可以设置默认值
@RequestBody 接收前端传给后端的json字符串中的数据(请求体中的数据)
@Required 按属性注入
@Autowired 按类型注入
@AllArgsConstructor 全参构造器注入
@RequiredArgsConstructor 生成带有必需参数的构造函数。
@NonNull
@SpringBootApplication
@MapperScan 扫描mapper层
@Service
@Mapper
@Value
十四、Redis
redis 有使用过吗?谈谈你对redis的理解
启动redis: redis-server
1.redis是一个基于内存存储的非关系型数据库,它的存储方式是键值对。
2.它提供了丰富的数据类型,9种,常见的有5种:string,list,set,zset,hash,来满足不同的业务场景需求
3.redis可以通过哨兵模式和分布式集群解决redis在生产中的高可用问题
我们可以将redis作为mysql的一个补充,也可以将redis作为缓存服务,也可以用作分布式锁,秒杀活动数据存储,登录验证码获取,计数,随机数的获取等。
//利用Redis的列表和有序集合的特点,可以制作排行榜系统,而排行榜系统目前在商城类、新闻类、博客类等等,都是比不可缺的。
//社交网络关注、点赞、推送等等
//set集合,使用spop可以用来抽奖和发放优惠券等
#当然redis也存在一些问题,就比如停电或者服务突然宕机,redis提供了两种持久化策略:RDB,AOF
redis默认开启的是RDB持久化方式,在指定的时间间隔内执行指定次数的写操作,则将内存中的数据集以快照的方式写入到磁盘中去,也就是 Snapshot 快照,恢复时是将快照文件直接读到内存里,适合大规模的数据恢复,但是他的数据一致性和完整性较差。
redis中的AOF持久化方式,默认每秒将写操作日志追加到AOF文件中,AOF的数据完整性比RDB高,但记录的内容多了,会影响数据恢复的效率,redis针对AOF文件过大的问题,提供了重写的搜身机制。
如果只打算使用redis做缓存,可以只开启RDB,如果是打算作为数据库来使用,建议RDB和AOF都开启。
###缓存击穿:**
不设置过期时间(不推荐)
加锁(分布式锁),两次判断
###缓存穿透:**
缓存空值:存在大量的垃圾数据
使用Redis set:集合判断元素是否存在 时间复杂度 O(n) 效率低
布隆过滤器
###缓存雪崩:**
分散key的过期时间
设置永不过期
###缓存预热:**
定时去触发将底层数据库内的热点数据加载到缓存内
###缓存更新/缓存同步**:使用canal实现数据双写一致性?(canal是由阿里开源的)
数据库发生修改,mysql会写一个binlog日志,这是一个二进制文件,借用canal这个工具解析日志,解析之后发送到mq里面,mq发送到redis里面进行修改同步
//(主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。Canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 `dump`协议,MySQL mater收到canal发送过来的`dump`请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。)
###缓存降级:**
使用Sentinel熔断降级策略进行服务熔断降级
十五、Nginx(端口80)
nginx有了解过吗,在哪里用过?
服务器反向代理
前端页面部署
负载均衡
nginx中如何实现session共享
ip hash
开启redis缓存
十六、Elasticsearch(端口9200)
elasticsearch 有使用过吗?是如何使用的
**1.倒排索引**
**2.IK分词器**
默认分词器(standard),对英文友好,对中文不友好
一般分词器有:
1. ik分词器:
ik_smart(最少切分)
ik_max_word(最细切分)
1. 拼音分词器:pinyin_analyzer
**3.常用的api**
prefix: 前缀查询
range:范围查询
分页查询,复合查询,高亮查询
过滤,排序,复合
求平均值,分数,最大值,最小值
拼音分词器
**4.索引库同步数据库**
思路1:商品信息发生变化时,业务层同步更新,维护效率低,耦合度高
思路2:定时任务,数据量大,占用内存大
思路3: 1,数据增删改,维护这条数据的修改时间
2,查询最近发生变化的商品信息(修改时间>最后修改时间)
3,使用logstash管道将最近发生变化的商品信息同步更新到索引库
**5.开发中的问题**
1. 大小写问题:加一个字段,把自动小写改成false
2. 再过滤查询中,过滤出用户不期望的数据:设置至少瞒住一个条件字段
3. 删除的商品怎么同步更新:逻辑删除+搜索业务中进行过滤(过滤出没有删除的商品信息)
**6.可视化工具kibana(端口5601)**
十七、RocketMQ
有使用过mq吗,了解mq的相关组件吗
mq:是生产者消费者的设计模式
生产者:往queue存放消息
消息队列:存储消息
消费者:消费消息
mq的优势是:
1.mq可以异步调用,避免同步调用阻塞线程导致熔断降级,
2.可以实现应用的解耦,容错率高
3.他有一个消息队列。可以将大量请求暂存起来,分散很长一段时间处理,避免请求丢失和服务器被压垮
为什么用RocketMQ(阿里),相对于其他mq来说,接口简单易用,而且毕竟在阿里大规模应用过,有阿里品牌保障, 而且一个很大的优势在于,阿里出品都是java系的,我们可以自己阅读源码,定制自己公司的MQ,可以掌控
##MQ怎么解决消息发送不丢失?
失败原因: 1:broker宕机 2:网络原因(局域网可以忽略) 3:网络彻底中断(假如是外网,比如欠费就真的没啦) 解决办法: mq有一个消息重发机制,网络抖动,下一次再发就可以啦,可以设置重试次数。 假如是broker宕机,mq还有一个失败隔离,换一个broker(只能发同步消息) 业务补偿,暂存在redis中,业务当key,消息当value或者mysql中然后开启定时任务再次进行重试 答:RocketMQ发送消息默认有重试机制,当消息发送失败会重试2次,可设置重试次数。
//进行业务补偿 当网络出现问题,消息发送失败,可以将数据存储到redis或mysql中然后开启定时任务再次进行重试。
##什么是消息幂等,怎么解决消息幂等?
拿处理订单为例,根据订单号做为唯一令牌,在redis中使用setnx对订单号进行设置。当其他消费者根 据订单号去做setnx操作时,就会返回0,则不继续进行一下操作。
处理幂等问题: 一进入页面就生成一个幂等令牌,发送请求的时候携带上幂等令牌,然后将携带了令牌的请求做唯一处理(即 只能处理一次,可以利用redis中的setnx来处理)
客户支付成功后,微信调用回调接口访问后台,消费成功后,将消息反馈给微信,但因为网络异常等原因导致 反馈失败,微信便会重新调用回调接口。 此时可以通过订单号作为唯一令牌,利用订单状态做唯一处理。
##说说你在项目中怎么使用的mq?
1、利用mq的延时消息解决订单超时未支付问题?
//规定用户在30分钟内必须支付,
1、调用微信下单接口获取到code_url(支付链接),将订单号发送到延时消息队列。
2、等到30分钟后消费者获取到消息,使用微信的查询订单支付状态的接口,查看订单是否支付。
3、如果支付状态为nopay,则调用微信的关闭订单接口,使超时用户无法支付。
4、如果订单关闭成功,则释放掉库存。
2、商品索引库同步,短信发送
1、ElasticSearch可以使用MQ来实现解耦同步,将消息放入消息对列,由消费者完成es索引的同步。
2、短信发送 因为使用的是阿里大鱼的接口实现的,当网络波动时,同时多个请求调用短信发送,会导致线程阻 塞以及耗尽线程池。那么可以通过异步 方式,将消息存放到消息队列中,由消费者完成短信发送的功能。 (这样做的好处是:解耦,以及异步发送,不会阻塞线程)
3、如何实现一键秒杀 服务器接收到下单请求,直接将下单消息存放入消息队列中,然后由多个消费者同时到Redis中获取锁, 谁先获取到锁,谁就开始进行下单。
十八、SpringCloud
谈谈你对springcloud的理解,以及各个组件的作用
nacos 【name server】:注册中心,解决服务的注册与发现
一个nacos可以做到两用,一个充当注册中心,一个充当配置中心
nacos【config】:配置中心,微服务配置文件的中心化管理,同时配置信息的动态刷新
Ribbon:客户端负载均衡器,解决微服务集群负载均衡的问题
工作流程:1、拦截所有的远程调用;
2、获取请求url,从url中解析出servicename
3、根据servicename获取实例列表,从本地缓存中获取实例列表,如果本地缓存中没 有,就 向nacos注册中心请求获取实例列 表,缓存一份到本地内存中,如果本地缓 存中有,直接 返回实例列表;
4、从实例列表中通过相应的负载均衡算法,选取一个实例(一个实例就是一个ip+prot, 然后把ip和端口传给resttemplate, 然后把ip和端口传给resttemplate再去找 这个实例发请求,得到响应的结果) ##本地缓存和远程调用通过一个定时任务 (35s)保证数据同步,解决缓存不一致的问题,最新的会对本地缓存进行覆盖 ##nacos-server不能关闭,否则不能感知服务的上线和下线
Openfeign:声明式HTTP客户端,解决微服务之间远程调用问题
服务消费者通过@EnableFeignClients来开启openfeign功能,需要调用哪个接口,就去通过 @FeignClient(服务提供者名称)来声明哪个接口
Sentinel:微服务流量防卫兵,以流量为入口,保护微服务,防止服务雪崩
gateway:微服务网关,服务集群的入口,路由转发以及负载均衡(全局认证、流控)
sleuth:链路追踪,可以快速的进行链路的错误和耗时排查
seata:分布式事务解决方案 版本号1.4.2 TC TM RM
十九、MySQL
**说说mysql的索引数据结构?**
> **Hash** 和 **B+Tree**
>
> Hash索引把数据以hash形式组织起来,因此当**查找某一条记录的时候,速度非常快**。但是因为hash结构,每个键只对应一个值,而且是散列的方式分布。所以它并不支持范围查找和排序等功能。
>
> B+Tree是mysql使用最频繁的一个索引数据结构,是Inodb和Myisam存储引擎模式的索引类型。相对Hash索引,B+Tree在查找单条记录的速度比不上Hash索引,但是因为**更适合排序,范围查询**等操作,所以它更受欢迎。毕竟不可能只对数据库进行单条记录的操作。
>
>
>
> **b+树 相比于 b树的查询优势:**
>
> b+树的中间节点不保存数据,都存在叶子结点,所以磁盘页能容纳更多节点元素,更“矮胖”;
>
> b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
>
> 对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历、
**mysql的两种存储引擎模式**
==Myisam==和==innodb==的区别
最大的区别是 myisam不支持事务,innodb支持事务
myisam是表锁,不适合高并发,innodb的行锁,适合高并发的操作
**mysql的优化**:
> 索引优化:比如用户表,有名字,电话,邮箱,建立多列索引,遵循最左前缀法则,
>
> **1.定义索引:** 索引:排序好的可以提供快速查询的数据结构
>
> **2.开启慢查询**
>
> 默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,
>
> 查看慢查询是否开启:mysql> show variables like '%slow_query_log%';
>
> 开启慢查询: set global slow_query_log=1;
>
> **3.druid监控台 localhost:8080/druid/index.html**
>
> **4.sql语句全部大写**
>
> **5.最左前缀法则:主要针对多列索引,**而且不能用or关键字 排序和分组都要遵循最左前缀法则
>
> **6.禁止全模糊或者左模糊**
>
> **7.表中允许适当冗余**
**索引失效的几种情况**
1. 不满足最左前缀法则
2. select *
3. 索引列有计算
4. 索引列使用了函数
5. 字段类型不同
6. 左模糊或者全模糊
7. 使用了or 关键字
8. <>|in|not in|not exist
9. order by
**MYSQL查看操作日志**
可以看到general_log的状态是开启还是关闭,以及所属账号的general_log文件存放的目录。
二十、Linux
Linux系统有哪些常用命令?
> top 快速查看哪些进程比较消耗CPU和内存资源
> free -m 查看操作系统剩余内存空间
> df -h 查看磁盘利用率
> ps -ef 查看进程
> tail -f 查看滚动日志
> head ...... 查看文件头几行
> tail ...... 查看文件后几行
>
> tail -help 查看帮助
>
> kill -9 强制杀死进程
>
> scp 运程克隆
>
> mkdir 创建文件夹
>
> touch 创建文件
二十一、Vue
1.vue有哪些指令
v-text v-html v-if v-show v-for v-bind v-model v-on:click
2.v-show和v-if的区别
v-show 不满足条件会添加一个隐藏样式,
v-if 不满足条件会直接删除
3.父子组件如何传参
子组件操作父组件,通过事件绑定
父组件操作子组件,通过绑定属性
4.vue的生命周期
beforeCreate created 创建 beforeMount mounted 挂载 beforeUpdate update 修改 beforeDestory destroyed 销毁
5.路由传参的几种方式
路由通过设置 props:true,
再使用 this.$route.query.id来接收
本文涵盖Java基础、面向对象、多线程、数据库等核心技术知识点,解析常见面试题,包括数据类型、集合类、线程安全、设计模式等内容。

696

被折叠的 条评论
为什么被折叠?



