java基础面试题

1.接口和抽象类得区别

接口只能有方法的定义不能有方法的实现,抽象类可以有方法的定义和实现

实现接口的关键词是implements 继承抽象类的关键词味为extends,一个类可以实现多个接口但是只能继承一个抽象类

2.重载和重写的区别

重写子类继承父类方法,方法对应得形参和返回值相同

重载在同一类中方法名相同 参数类型或数量不同

3.常用的集合框架有哪些

Collection(List、Set 和 Queue)

List是一个有序允许重复

Set 不允许元素重复且无序

map(存储键/值对映射)

常用的ArrayList、LinkedList、HashSet、LibkedHashSet、HashMap、LinkedHashMap

4.Mybatis动态sql标签

if where foreach choose trim set when otherwise bind

5.什么是Mybatis一二级缓存

一级

一级缓存是默认开启的,它在一个sqlSession会话里面的所有查询操作都会保存到缓存中,一般来说一个请求中的所有增删改查操作都是在同一个sqlSession里面的,所以我们可以认为每个请求都有自己的一级缓存,如果同一个sqlSession会话中2 个查询中间有一个 insert 、update或delete 语句,那么之前查询的所有缓存都会清空。

二级

缓存会先放在一级缓存中,当sqlSession会话提交或者关闭时才会将一级缓存刷新到二级缓存中;

开启二级缓存后,用户查询时,会先去二级缓存中找,找不到在去一级缓存中找;

6.mybatis如何返回增加时主键

通过注解@SelectKey

7.什么是spring ioc和aop是什么

Spring是开源的一个轻量级的控制反转和面向切面的容器框架

IOC(控制反转)和AOP(面向切面编程)作为Spring框架的两个核心

spring中有3中注入方式,一种是set注入,另一种是接口注入,另一种是构造方法注入。

spring中面向切面编程的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是由=有继承。

8.Spring Bean的生命周期

实例化Bean -->Bean属性填充-->初始化Bean -->销毁Bean

9.Spring Bean的作用域

singleton,prototype,request,session,globalSession

10.Spring mvc 注解

@Controller,@RequestMapping,@ResponseBody,@RequestBody,@PathVariable,@RestController

11.Spring mvc 请求流程

12.Springmvc和springboot的关系

spring框架就像一辆车的车架,这个车架可以做成电动车(spring cloud),燃油车(spring mvc),燃气车(spring data)等等。springMVC就像是手动挡的燃油车,springboot的出现相当于给这辆车的车架提前加了自动驾驶功能,这样你开燃油车的时候(开发WEB应用的时候)就可以不手动了(手动配置)而是自动驾驶(自动装配配置)

13.springboot启动器

spring-boot-starter 核心模块,包含自动配置支持、日志库和对 YAML 配置文件的支持。

spring-boot-starter-aop 支持面向方面的编程即AOP,包括 spring-aop 和 AspectJ

spring-boot-starter-redis 支持 Redis 键值存储数据库,包括 spring-redis

spring-boot-starter-data-jdbc 支持 JDBC 访问数据库

spring-boot-starter-test 支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块

spring-boot-starter-velocity 支持Velocity模板引擎

spring-boot-starter-thymeleaf 支持 Thymeleaf 模板引擎,包括与Spring的集成

spring-boot-starter-web 支持全栈式 Web 开发,包括 Tomcat 和 spring-webmvc

spring-boot-starter-log4j 支持 Log4J 日志框架

spring-boot-starter-tomcat 引入了 Spring Boot 默认的 HTTP 引擎 Tomcat

14.Springboot三大核心注解

@SpringBootApplication

@SpringBootConfiguration @ComponentScan @EnableAutoConfiguration

15.java如何创建线程

继承Thread类,实现Runnable接口,实现Callable接口,创建线程池

16.线程调度的方法

join yeild

17.如何解决多线程中出现高并发问题

同步代码块synchronized()

使用锁

就数据库操作来说是通过加锁的概念来确保并发数据操作下事务的完整性和数据库的一致性

数据库主要有共享锁和排它锁.当你在修改数据的时候,别人也可以查看,但是他不能修改数据并提交,只能优先你的操作,等你向数据库提交了数据之后他才能执行增删改的操作,这就是排它锁.共享锁就是你和另外一个用户可以同时共享数据(查看),但是你和他都不能修改.

18.jvm

Java虚拟机

19.css让一个文本居中

text-align: center;

20.vue常用指令

v-once指令、v-show指令、v-if指令、v-else指令、v-else-if指令、v-for指令、v-html指令、v-text指令、v-bind指令、v-on指令、v-model指令

21.mybatis核心功能(mybatisPlus相对于mybatis有什么升级)

简化curd 数据填充 乐观锁 代码自动生成 逻辑删除 高级查询

22.mysql内外连接区别

内连接(inner join):取出两张表中匹配到的数据,匹配不到的不保留

外连接(outer join):取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL

23.mysql的sql优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

3.in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3

4.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

5..应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

6.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

7.避免频繁创建和删除临时表,以减少系统表资源的消耗。

8.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

9.尽量避免大事务操作,提高系统并发能力。

10.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

24.drop truncate delete的 区别

1) Truncate是数据定义语言(DDL)做的修改是不能回滚的,就是不可恢复的操作。用了这个命令后就收回了表空间。Delete是数据操作语言(DML)删除是要把数据写入系统回滚段(rollback segement)中以便恢复时使用。

2) 两者都是删除表中的数据而不会影响到表的结构和定义.

3) 使用drop 的话就会删除表的结构

25.索引的分类

主键索引 唯一索引 全文索引 普通索引 覆盖索引 组合索引

26.什么是微服务

微服务是分布式架构的一种,分布式架构其实就是要把服务做一个拆分,而springcloud只是解决了拆分过程中的服务治理问题。

在单体架构中,我们把所有的服务都写在一起,随着业务的复杂代码的耦合度就会越来越高,不便于将来的升级维护。

所以往往需要拆分这些服务,微服务在拆分的时候,会根据业务功能模块把一个单体的应用拆分成许多个独立的项目,每个项目完成一部分的业务功能,然后独立开发和部署。这些独立的项目就成为一个微服务。进而构成一个服务集群。

27.ArrayList和LinkedList的区别?

ArrayList底层使用的是 Object数组;LinkedList底层使用的是 双向链表 数据结构。

ArrayList: 增删慢、查询快,线程安全,对元素必须连续存储。

LinkedList: 增删快,查询慢,线程不安全。

28.Docker常见命令

docker start :启动一个或多个已经被停止的容器

docker stop :停止一个运行中的容器

docker restart :重启容器

docker run :创建一个新的容器并运行一个命令

docker rm :删除一个或多个容器。

docker ps : 列出容器

docker images : 列出本地镜像

docker rmi : 删除本地一个或多个镜像

docker history : 查看指定镜像的创建历史。

docker pull : 从镜像仓库中拉取或者更新指定镜像

29.常见的设计模式有哪些

设计模式根据目的可分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式,原型模式。

结构性模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

30.String、StringBuffer 和 StringBuilder 的区别是什么?

最基本的区别就是String是一个字符串常量,长度不可改变,StringBuffer和StringBuilder是字符串变量,他们两个的长度可以改变,但StringBuffer是线程安全的,而StringBuilder是非线程安全的。

String中的String类中使用被final关键字修饰的字符数组来保存字符串,private final char value[],String对象是不可改变的,也可以理解为是常量,线程安全。

StringBuffer是线程安全的是因为它对方法或者被调用的方法里加入了同步锁;

StringBuilder线程是非安全的是因为它并没有对方法加同步锁。

(1) 如果要操作少量的数据,建议用String;

(2) 如果在多线程操作字符串缓冲区下操作大量的数据,建议使用SreingBuffer;

(3) 如果在单线程操作字符串缓冲区下操作大量数据,建议使用StringBuilder

31.sleep和wait的区别

(1)sleep()可以在任何地方使用;wait()则只能在同步方法或同步块中使用;

(2)这两个方法来自不同的类分别是Thread和Object

(3)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

(4)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。

32.HashMap为什么线程不安全

1.在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况。 2.在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况。

33.有用过缓存吗,你用过哪些实现缓存的方式

(1)第一种方法 用HashMap存 然后加锁get方法

(2)第二种方法是用ConcurrentHashMap

(3)第三种 用hashmap 加读写锁

34.什么是jdk和jre

  1. JDK:Java开发工具包(Java Development Kit),提供了Java的开发环境和运行环境。

  2. JRE:Java运行环境(Java Runtime Environment),提供了Java运行所需的环境。

JDK包含了JRE。如果只运行Java程序,安装JRE即可。要编写Java程序需安装JDK.

35.什么是类和对象

类是对象的抽象 对象是类的实例

36.什么是索引

索引相当于字典的目录一下,通过索引可以快速的检索数据。

特点

优点:

可以提高数据库检索数据的速度

缺点:

只能提高查询速度,相反会降低新增,修改,删除的效率

浪费存储空间 索引不是越多越好,根据实际情况添加不同的索引

37.java访问修饰符

公有属性 public 私有属性 private 保护属性 protected

38.final、finally和finalize的区别是什么?

  1. final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

  2. finally作为异常处理的一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。

  3. finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。

39.成员变量和静态变量的区别

1) 两个变量的生命周期不同 成员变量随着对象的创建而存在,随着对象被回收而释放。 静态变量随着类的加载而存在,随着类的消失而消失。

2) 调用方式不同 成员变量只能被对象调用。 静态变量可以被对象调用,还可以被类名调用。

3) 别名不同 成员变量也称为实例变量。 静态变量也称为类变量。

4) 数据存储位置不同 成员变量存储在堆内存的对象中,所以也叫对象的特有数据。 静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

40.微服务拆分原则

1)AKF拆分原则

2)前后端分离原则

3)无状态服务

4)restful的通信风格

41.微服务之间如何实现通讯

一种是同步通信:主要方式有HTTP REST、RPC的方式。HTTP REST方式指的是使用http协议进行数据传递,数据格式是使用json格式;RPC是一种远程过程调用,消息格式是采用二进制格式。

http rest 是属于osi七层模型中的应用层,而rpc则属于传输层,所以rpc的效率要比http rest的效率更加高效。

还有一种是异步通信:异步消息传递通常有两种模式,一种是无代理模式:指的是C端直接将消息发送给P端即可不需要得到恢复,当需要P端恢复时由于是异步通信,C端也不会阻塞,P端处理完后再根据接收到的信息向C端回复处理结果。这种方式比较小众主要适用于一些异步通知场景。另外一种就是:使用消息代理,这里需要借助一些消息中间件,比如RocketMQ、kafka等。这种方式的使用场景比较广泛,行业内有很多成熟方案。通过使用异步消息通信的方式能够很好的实现微服务的解耦。

42.谈谈服务降级 熔断 服务隔离 服务限流

服务降级:在高并发的情况下,防止用户一直等待,使用服务降级方式进行处理(返回友好的提示给客户端,fallback回调方法)。当服务不可用的时候(正在等待的时候、网络延迟、响应时间过长),客户端会处于一直等待的状态。显然一直等待是不合理的,所以我们应该给客户端返回一个友好的提示,使用fallback(回调方法)进行服务降级处理。

服务降级目的:为了提高用户体验(自定义消息返回给客户端),防止服务雪崩效应。比如:连接超时、网络延迟、服务器响应时间过长等情况。

服务雪崩效应的产生原因:因为默认情况下,只有一个线程池处理所有的服务接口,所有的请求都会被一个线程池处理。如果大量的请求访问同一个接口,当达到tomcat默认极限(可以自己设置),可能会导致其他服务接口无法访问。

服务隔离:每个服务接口之间互不影响,服务隔离有2种实现方式,线程池方式、信号量

1.线程池方式:相当于每个接口(服务)都有自己独立的线程池,不同的线程池之间互不影响,能够实现服务接口隔离。缺点:CPU内存开销较大。

2.信号量方式:底层使用原子计数器(atomic),针对于每个服务都设置自己的独立的限制阈值。比如设置每个服务接口最多同时访问的次数,如果超出缓存队列请求后,自己实现拒绝策略。

服务熔断:在高并发的情况下,如果达到一定的极限(可以自己设置阈值),如果流量超出了设置的阈值,然后拒绝访问,保护当前服务。当服务器达到最大的承受能力的之后,直接拒绝访问服务,然后调用降级方法,返回友好提示。

目的:为了防止服务宕机(保护服务),会进行熔断处理。

产生的原因:服务请求过多,高并发情况下。可以设置阈值进行限制。超出的请求存放在缓存队列中,如果缓存队列中线程满的话,直接拒绝访问服务,访问不了服务(熔断)

服务限流

1.计算器方式(滑动计数器):定义一个原子类,针对于某一个服务实现次数记录,一旦达到阈值之后,这时候可以直接走服务降级(返回一个友好提示给客户端)。

举个例子:限制每60秒内只能接受客户端10个请求,如果超过10个请求则直接拒绝访问服务。固定速率 10R/M。

滑动窗口计数器算法原理:创建6个独立的格子,每个格子都有自己独立的计数器。每个格子独立计数10秒。

2.令牌桶算法(Token):令牌桶分为2个动作,动作1(固定速率往桶中存入令牌)、动作2(客户端如果想访问请求,先从桶中获取token)。guava 提供的RateLimiter类来进行限流处理。

 1.传统的方式整合RateLimiter 有很大的缺点:代码重复量特别大,而且本身不支持注解方式。
 2.如果限流代码可以放在网关中,相当于针对所有的服务接口都实现限流(可以使用排除法进行排除不进行限流的方法),维护性不是很强。
​
 3.正常的互联网公司项目,不是所有的服务接口都需要实现限流方法的,一般只真针对于大流量接口。比如:秒杀抢购、12306抢票等。
​
 4.可以手动封装一个RateLimiter类 注解来解决这个方法。
  1. 漏桶算法

以固定速率从桶中流出水滴,以任意速率往桶中放入水滴,桶容量大小是不会发生改变的。

流入:以任意速率往桶中放入水滴。

流出:以固定速率从桶中流出水滴。

水滴:是唯一不重复的标识。

因为桶中的容量是固定的,如果流入水滴的速率>流出的水滴速率,桶中的水滴可能会溢出。那么溢出的水滴请求都是拒绝访问的,或者直接调用服务降级方法。前提是同一时刻。

限流的目的:为了保护服务,避免服务宕机。

43.说一下redis的数据持久化

RDB:在指定的时间间隔能对数据进行快照存储,类似于MySQL的dump备份文件。 AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据(MySQL的binlog)。 RDB与AOF混合使用,这是Redis4.0开始的新特性。在混合使用中AOF读取RDB数据重建原始数据集,集二者优势为一体。

44.Java中int和Integer的区别

1)Integer是int的包装类,int则是java的一种基本数据类型 2)Integer变量必须实例化后才能使用,而int变量不需要 3)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 4)Integer的默认值是null,int的默认值是0

45.事务ACID

事务ACID原则:原子性、一致性、隔离性、持久性

46.get和post的区别

GET在浏览器回退时是无害的,而POST会再次提交请求。 GET产生的URL地址可以被Bookmark,而POST不可以。 GET请求会被浏览器主动cache,而POST不会,除非手动设置。 GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST么有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。 GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。 GET参数通过URL传递,POST放在Request body中。

47.springboot核心配置文件区别

1)SpringBoot的核心配置文件有application和bootstarp配置文件。

2)他们的区别是什么? application:文件主要用于Springboot自动化配置文件。 bootstarp: 使用Spring Cloud Config注册中心时 需要在bootStarp配置文件中添加链接到配置中心的配置属性来加载外部配置中心的配置信息。 一些固定的不能被覆盖的属性 一些加密/解密的场景 3)都有什么格式? .properties 和 .yml .yml采取的是缩进的格式 不支持@PeopertySource注解导入配置

48.redis的数据类型以及应用场景

常用的五种数据类型:字符串string,列表list,散列hash,集合set,有序集合sorted set

1.字符串

字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,是标准的key-value,一般来存字符串,整数和浮点数。Value最多可以容纳的数据长度为512MB

应用场景:很常见的场景用于统计网站访问数量,当前在线人数等。incr命令(++操作)

2.列表list:

Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295。 应用场景:1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行

3.散列hash:

Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。 应用场景:例如存储、读取、修改用户属性(name,age,pwd等)

4.集合set:

Redis的集合是无序不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。 应用场景:1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。

5.有序集合sorted set:

和set很像,都是字符串的集合,都不允许重复的成员出现在一个set中。他们之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是卫衣的,但是分数(score)却可以重复。 应用场景:可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取几分top ten的用户信息。

49.redis的持久化

AOF RDB

50.redis缓存穿透和缓存雪崩 缓存击穿

一、缓存穿透

1.用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。用户拿不到数据时,就会一直发请求,查询数据库,这样会对数据库的访问造成很大的压力。

2.解决方案一:把空的数据也缓存起来,比如空字符串,空对象,空数组或list,代码维护较简单,但是效果不好。

3.解决方案二:布隆过滤器 ,代码维护复杂,效果很好。

二、缓存击穿

当某个 key 在过期的瞬间,有大量的请求这个 key 的数据,这种数据是热点数据,由于在缓存过期的瞬间,请求会同时访问到持久化的数据库来查询数据,并且会将数据会写到缓存中,此时就会导致数据库瞬间的压力过大,导致击穿

原因

  1. 一个“冷门”key,突然被大量用户请求访问。

  2. 一个“热门”key,在缓存中时间恰好过期,这时有大量用户来进行访问。

解决方案

  • 单机环境下:直接使用常用的锁即可(如:Lock、Synchronized等);

  • 分布式环境下可以使用分布式锁,如:基于数据库、基于Redis或者zookeeper 的分布式锁。

三、缓存雪崩

1.在某一个时间段内,缓存集中过期失效,如果这个时间段内有大量请求,而查询数据量巨大,所有的请求都会达到存储层,存储层的调用量会暴增,引起数据库压力过大甚至宕机。

2.解决方案

  1. redis高可用 redis有可能挂掉,多增加几台redis实例,(一主多从或者多主多从),这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

  2. 限流降级 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个key只允许一个线程查询数据和写缓存,其他线程等待。

  3. 数据预热 数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key。

  4. 不同的过期时间 设置不同的过期时间,让缓存失效的时间点尽量均匀。

51.重写equals是不是必须要重写hashcode

52.如何给按钮添加一个点击事件

JavaScript下给按钮绑定点击事件onclick()

HTML下给按钮绑定点击事件click()

Vue下给按钮绑定点击事件@click=“”;

53.事务的隔离级别,以及引发的问题

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted(读未提交) 、Read committed(读提交) 、Repeatable read (重复读) 、Serializable(序列化) 。

事务引发的问题:脏读 不可重复读 幻读

脏读不可重复读幻读
Read uncommitted 读未提交
Read committed 读提交x
Repeatable read 重复读xx
Serializable 序列化xxx

四个级别分别可能导致的问题: 脏读 描述:

一个事务读取到了另一个事务未提交的数据操作结果。

解决方案:

把数据库的事务隔离级别调整到READ_COMMITTED(读提交)

不可重复读 描述:

指在同一个事务内多次读同一数据,前后读取结果不一致。例如:事务T1读取两次数据,在第一次读取某一条数据后,事务T2对这条数据做了修改并提交了事务,然后T1再次读取该数据,两次读取便得到了不同的结果。这样就引发了在一个事务内两次读到的数据是不一样的问题,因此称为是不可重复读。一般发生在涉及数据修改的场景

解决方案:

把数据库的事务隔离级别调整到REPEATABLE_READ(可重复读)

幻读 描述:

事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入或删除数据造成的。

幻觉读是指当事务不是独立执行时(即不同事务内)发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

一般发生在数据新增或删除的场景

解决方案:

把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证。

54.什么是MVC,什么是三层架构

MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。 好处:

视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

MVC使降低开发和维护用户接口的技术含量成为可能。

三层架构介绍:三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。

1).表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。

2)、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

3)、数据访问层(DAL):有时候也称为是持久层,该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

55.try中有return语句, finally中的语句会不会执行,之前还是之后执行,什么时候finally的代码不会执行

finally语句在return语句执行之后return返回之前执行的。finally块中的return语句会覆盖try块中的return返回。如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况。当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样。finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

56.linux常用命令大全

cd / 切换到根目录

创建文件夹的命令: 增删改查: mkdir:make directory 增加文件夹 mv: 重命名 剪切的功能 find: 查询文件或者文件夹 find / -name jdk rm: remove 目录是不能使用rm直接删除的 -r 递归删除 -f 强制删除 rm -rf 强制递归删除

文件的操作: 增删改查: touch:创建文件 echo:输出文件内容到哪个文件中,再次使用就是覆盖,>>可以实现追加 cat: 查看文件内容 grep: 查询 vi: 编辑命令 很重要的命令 按i进入编辑模式 esc 退出编辑模式 :wq 保存退出 :q! 不保存退出 rm -rf 删除文件

防火墙相关的命令: systemctl status firewalld: 查看防火墙状态 systemctl stop firewalld: 停止防火墙 systemctl start/restart firewalld:启动防火墙

57.线程的几种状态,怎么才能进入阻塞状态

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。 5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

sleep( ) 使线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态

wait( ) 使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用

suspend( ) 使线程进入阻塞状态,并且不会自动恢复,必须其对应的resume( )被调用,才能使线程重新进入可执行状态

58.Thread中start和run的区别

start()方法是新起一个线程去执行run()方法中的代码。相当于除了主线程之外又有新的线程进入就绪状态。 run()方法只是一个正常的abstart抽象方法的重写。只有主线程,并没有新的线程被创建,需要按照原来主线程的执行顺序来执行run()中代码。

59.String,StringBuffer, StringBuilder的区别,如何添加一个新的字符串?

String concat() apend()

60.java中几种引用类型

强引用是一种最常见的引用形式,同时也较为普遍。是指创建一个对象并把这个对象直接赋给一个变量

软引用和强引用不同,如果内存空间足够多,一个对象被软引用,则垃圾回收器不会将其回收;如果内存空间不足,这些引用对象就会被回收。所以,软引用就是当回收器没有回收某个对象时,程序就可以对其使用。它可用来较为敏感的高速缓存,虚拟机可以将软引用加入到与之向关联的队列

弱引用的特点就是引用对象的生命周期较短。GC回收器在扫描内存区域是若发现弱引用,无论内存空间足够与否,弱引用对象都会被回收。但弱引用对象也可以加入队列,这样就可以不被回收。

虚引用也称为幻影引用:一个对象是都有虚引用的存在都不会对生存时间都构成影响,也无法通过虚引用来获取对一个对象的真实引用。唯一的用处:能在对象被GC时收到系统通知,JAVA中用PhantomReference来实现虚引用。

61.什么是索引

索引相当于字典的目录一下,通过索引可以快速的检索数据。

索引的特点

优点:

可以提高数据库检索数据的速度

缺点:

只能提高查询速度,相反会降低新增,修改,删除的效率

浪费存储空间 索引不是越多越好,根据实际情况添加不同的索引

62.innodb和myisam区别

1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2. InnoDB支持外键,而MyISAM不支持。

3. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;

63.实现一个定时任务如何选择

springboot自带的定时任务 xxl-job

64.ArrayList扩容机制,初始长度和每次扩容长度

初始长度试10,ArrayList每次扩容是原来的1.5倍。

65.MySQL分哪几种语言

dcl dql ddl dml

66.线程的状态

新建 就绪 休眠 运行 死亡

67.mybatis动态标签resultmap和resulttype区别

68.String类的常用方法都有哪些

1.length()方法 获取字符串长度

3.indexOf()方法 传递某个字符,返回在字符串中的第一个位置

5.subString(int start,int end)方法 注:范围左闭右开,不包含下标为end的那位

4.isEmpty()方法 判断字符串是否为空。

5.comcat()方法 字符串拼接

4.toLowerCase()方法 把字符串转成小写toUpperCase()方法 把字符串转成大写

2.trim()方法 去除两端空格

69.在spring中如何通过注解注入一个bean

@Autowired与@Resource

70.@Autowired和@Resource区别

@Resource 由jdk提供

@Autowired 由spring提供

@Autowired//默认按type注入 @Qualifier("cusInfoService")//一般作为@Autowired()的修饰用 @Resource(name="cusInfoService")//默认按name注入,可以通过name和type属性进行选择性注入

一般@Autowired和@Qualifier一起用,@Resource单独用。

当然没有冲突的话@Autowired也可以单独用

71.抽象类必须要有抽象方法吗?有抽象方法的类一定是抽象类吗?

抽象类不一定要有抽象方法,有抽象方法的类一定是抽象类

72.普通类和抽象类的区别

  1. 声明方式不同

  2. 抽象类不能被实例化

  3. 抽象类中既可以含有抽象方法也可以含有普通方法,普通类中不能含有抽象方法,含有抽象方法的类都是抽象类

  4. 抽象方法不能声明为静态

73.mybatis中#{}和${}区别

  1. #方式能够很大程度防止sql注入。

  2. $方式无法防止Sql注入。

  3. 能用#就不用$

  4. 1)#{} 为参数占位符 ?,即sql 预编译

    2)${} 为字符串替换,即 sql 拼接

74.抽象类能使用final修饰吗

不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

75.乐观锁和悲观锁

76.git常用命令

1)版本号查询 git --version

2)清屏 clear

3)设置用户名和邮箱

git config --global user.name "用户名"

git config --global user.name "邮箱"

4)初始化本地仓库 git init

5)查看目录 ll -la 退回到上一级目录 cd ..

6)提交文件到暂存区 git add 文件名

7)查看文件状态 git status

75.有使用过什么日志框架 日志级别

JUL Log4j Logback Log4j2

日志级别:ALL < TRACE< DEBUG < INFO < WARN < ERROR < FATAL < OFF

OFF | 关闭:最高级别,不打印日志。 FATAL | 致命:指明非常严重的可能会导致应用终止执行错误事件。 ERROR | 错误:指明错误事件,但应用可能还能继续运行。 WARN | 警告:指明可能潜在的危险状况。 INFO | 信息:指明描述信息,从粗粒度上描述了应用运行过程。 DEBUG | 调试:指明细致的事件信息,对调试应用最有用。 TRACE | 跟踪:指明程序运行轨迹,比DEBUG级别的粒度更细。 ALL | 所有:所有日志级别,包括定制级别。

76.spring创建Bean的方式

  1. 通过反射调用构造方法创建bean对象

  2. 通过静态工厂方法创建bean对象

  3. 通过实例工厂方法创建bean对象

  4. 通过FactoryBean创建bean对象

77.在集合框架中collection和collections的区别

Collections (1)是一个工具类,提供了大量处理容器的方法。 (2)它包含有各种有关集合操作的静态多态方法 (3)不能实例化,可用于对集合中元素进行排序、搜索以及线程安全等操作。 (4)服务于Java的Collection框架。

Collection (1)是一个集合接口(根接口),提供了对集合对象进行基本操作的通用接口方法。 (2)Collection接口在Java 类库中有很多具体的实现。 (3)Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

78.String 属于基础数据类型吗?能不能被继承?

不属于 不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。

79.spring实现事务方式有哪些

编程式事务和声明式事务

80.查询Liunx中服务的端口

netstat

81.spring中的bean是线程安全的吗

82.如何修改bean的作用域 是哪个属性

scope

83.Nginx的作用,Nginx负载均衡算法

作用:反向代理 负载均衡 静态代理 正向代理 动静分离

Nginx负载均衡算法:

  • 1:轮询(默认) 每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。

  • 2.权重(weight) 在配置文件中对下游的服务节点指定权重值 weight, weight 值越大则被分配的评率越高,一般这种负载均衡,用于节点的配置情况不一样,有的可能配置高,有的配置低。

  • 3.ip_hash 对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。它能够暂时的解决集群环境中容器之间 session 共享的问题,但是不是解决的根本之道,只是权宜之策,我们试想,如果访问的好好的,家里的路由器被重启了,或者运营商分配给你的 ip 地址改变了,那么你再次访问的时候,新的 ip 就可能被分配到新的服务上,之前的 session 也就失效了。

  • 4.least_conn (最少连接调度算法) 最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。

  • 5.least_time (最小响应时间) 最小响应时间, 计算节点平均响应时间,然后取响应最快的那个,分配更高权重。

84.Vue如何实现组件传参

85.SpringAOP之动态代理

动态代理:在程序执行中,利用jdk的反射机制,创建代理类对象,并动态指定要代理的对象

动态代理的作用 1.在不改变已有代码的基础上,通过代理来横向拓展增强其他的功能; (A写好了一个功能,你可以使用,但是A的功能不满足你的要求,因此可以通过代理A的功能代码,而不用修改原有的代码进行增加) 2.当目标类不允许直接访问(a类实现功能调用c类,但c类不允许a调用),因此可以创建代理b,让a访问b,b再访问c; 3.减少重复的代码; 4.专注业务逻辑代码; 5.解耦,让业务代码与非业务代码分离。

86.如何将字符串反转

1.StringBuilder的reverse()方法,最简单

2.使用字符串数组,实现从尾部开始逐个逆序放入字符串

3.使用String的CharAt方法,使用String的CharAt方法取出字符串中的各个字符,然后插入到字符串中,调用StringBuilder的insert()方法进行操作。

4.使用递归的方法,实现字符串反转。

87.如何解决跨域

  1. jsonp

  2. 内部HttpClient远程调用

  3. nginx反向代理

  4. 设置响应头允许跨域 response.setHeader(“Access-Control-Allow-Origin”, “*”);

  5. SpringBoot注解@CrossOrigin

88.说一下&和&&区别

相同点:&和&&都可以用作逻辑与的运算符,表示逻辑与(and)。

不同点

(1)&&具有短路的功能,而&不具备短路功能。

(2)当&运算符两边的表达式的结果都为true时,整个运算结果才为true。而&&运算符第一个表达式为false时,则结果为false,不再计算第二个表达式。

(3)&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如:0x31 & 0x0f的结果为0x01。

89.一个类可以同时既是父类也是子类吗?请举例说明

A继承B B继承C A是B的父类 B是C的父类 B既是父类也是子类

90.说一下几种常见的异常类型

编译时异常

运行时异常(算数异常 数组下标越界异常 类转换异常 空指针异常 数字格式化异常)

91.Cookie和Session的区别

1、存储位置不同 cookie的数据信息存放在客户端浏览器上。

session的数据信息存放在服务器上。

2、存储容量不同 单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。

对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。

3、存储方式不同 cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。

session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。

4、隐私策略不同 cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。

session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。

5、有效期上不同 开发可以通过设置cookie的属性,达到使cookie长期有效的效果。

session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。

6、服务器压力不同 cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。

session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。

7、浏览器支持不同 假如客户端浏览器不支持cookie:

cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。

运用session需要使用URL地址重写的方式。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。

假如客户端支持cookie:

cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。

session只能在本窗口以及子窗口内有效。

8、跨域支持上不同 cookie支持跨域名访问。

session不支持跨域名访问。

92.转向和重定向的区别

区别一:

  重定向时 浏览器上的网址改变

  转发是浏览器上的网址不变

区别二:

  重定向实际上产生了两次请求

转发只有一次请求

重定向:

  发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器

转发:

  发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器

区别三:

  重定向时的网址可以是任何网址

  转发的网址必须是本站点的网址

93.http和https区别

安全性上,HTTPS是安全超文本协议,在HTTP基础上有更强的安全性。简单来说,HTTPS是使用TLS/SSL加密的HTTP协议

申请证书上,HTTPS需要使用ca申请证书

传输协议上, HTTP是超文本传输协议,明文传输;HTTPS是具有安全性的 SSL 加密传输协议

连接方式与端口上,http的连接简单,是无状态的,端口是 80; https 在http的基础上使用了ssl协议进行加密传输,端口是 443

94.常见的http状态码

400 请求错误 404路径错误 500代码错误

类别 原因短语 1xx Informational(信息性状态码) 接受的请求正在处理 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向) 需要进行附加操作以完成请求 4xx Client error(客户端错误) 客户端请求出错,服务器无法处理请求 5xx Server Error(服务器错误) 服务器处理请求出错

95.java支持多继承吗?如果要实现怎么处理

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口可以间接实现多继承,,即一个子接口可以有多个父接口。

96.构造器是否可以被重载或重写

首先,构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承。 又由于构造器不能继承,所以就不能被重写。但是,在同一个类中,构造器是可以被重载的。

97.yaml和properties的区别

1.properties文件通过“.”和“=”赋值,值前不加空格,yaml通过“:”赋值,值前面加一个空格;yaml文件缩进用空格;

2.properties只支持键值对,yaml配置文件支持列表,短横线表示列表“-”;

3.properties不保证加载顺序,yaml有先后顺序;

4.properties的配置文件含中文时读取会乱码,而在yaml中不会;

注:如果你同时有properties和yaml,yaml会先执行,properties里面的属性将覆盖yaml的。

98.Spring Cloud Alibaba有哪些组件

  1. Dubbo(RPC) 用于实现高性能Java RPC 通信

  2. Nacos (配置中心与服务注册与发现)服务注册发现、配置管理、服务管理

  3. Sentinel(分布式流控) 流量控制、熔断降级、系统负载保护

  4. RocketMQ (消息队列)分布式消息系统,提供低延时的、高可靠的消息发布与订阅服务

  5. Seata (分布式事物)高性能微服务分布式事务解决方案

  6. Alibaba Cloud OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。

  7. Alibaba Cloud SchedulerX 阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。

  8. Alibaba Cloud SMS 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

99.除了updata/delete/select/insert之外还有哪些标签

动态标签 :if where foreach choose trim set when otherwise bind

sql resultMap cache include selectKey parameterMap

100.mabatis是如何分页和原理

1)Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 sql 实现分页,也可以使用 Mybatis 的分

页插件。

2)分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行

的 sql,然后重写 sql。

101.spring中aop代理模式的分类 动态代理的分类 和区别

aop代理模式分类

静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴)

动态代理的分类

基于接口的动态代理 提供者:JDK官方的Proxy类。 要求:被代理类最少实现一个接口。

基于子类的动态代理 提供者:第三方的CGLib,如果报asmxxxx异常,需要导入asm.jar。 要求:被代理类不能用final修饰的类(最终类)。

动态代理的区别

  1. cglib底层运用了asm这个非常强大的Java字节码生成框架来生成class, 比jdk代理效率要高

  2. jdk代理只能代理被接口修饰的类,而cglib没有这个限制(原因上面已经分析,jdk是动态生成委托类的接口的实现类,cglib是动态生成委托类的子类)

102.cron表达式 每五分钟执行一次的表达式

103.说一下quartz和xxl-job的对比

104.微服务中服务的限流降级熔断隔离

  • 服务熔断:牺牲局部,保全全局,服务出问题时,切断该服务与系统的联系。

  • 服务降级:服务不可用时(如熔断后),提供一个低级服务返回信息。

  • 服务隔离:使服务之间相互隔离,防止出现雪崩效应

  • 服务限流:使某服务一段时间内只接收指定数量的请求,通过上面的三种手段,即可达到服务的限流。

105.抽象类有哪些特征

1.有抽象方法的类,一定是抽象类;抽象类可以有非抽象方法

2.抽象类不能产生对象,

3.抽象类专门用来产生子类;

4.子类继承抽象类的时候必须全部重写父类的所有抽象方法,除非子类自己也是抽象类;

5.抽象类拥有构造方法,虽然不能产生对象,但是子类产生对象时,需先调用父类构造。

6.抽象类的可选修饰符为abstract,方法的可选修饰符也为abstract。

106.说final的作用

  • 修饰类:表示类不能被继承

  • 修饰方法:表示方法不可以被子类覆盖,但是可以重载

  • 修饰变量:表示变量一旦被赋值就不可以更改它的值 称常量

107.throw和throws的区别?SpringBoot处理异常用到哪些注解

一:位置不同。throws用在函数上,后边跟的是异常类,可以跟多个异常类。throw用在函数内,后面跟的是异常对象。

二:功能不同。①throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先得处理方式。throw抛出具体的问题对象,执行到throw。功能就已经结束了跳转到调用者,并将具体的问题对象抛给调用者,也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。②throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

@Transaction

108.try中有return的执行顺序,什么时候finally不会执行

109.PrepareStatement和Statement的区别

PrepareStatement继承与Statement,包含execute()、 executeQuery() 和 executeUpdate()三种方法

1.PrepareStatement实例包含已经编译的SQL语句,会将SQL语句进行预编译,所以执行速度 比Statement高。

prepareStatment事先对语句进行预处理,效率会高很多。 Statment没有进行预处理,所以每次都要载入语句,所以效率比较低

2.PrepareStatement对象中的SQL语句可以包含一个或者多个参数,在SQL语句创建时 可以不指定参数,可以为参数位置保留一个?作为占位符,每个问号的值必须在该语句 执行前通过适当的setInt()或者setString()方法来提供

3.用PrepareStatement可以防止sql注入,而Statement不行

所以我们尽量使用PrepareStatement。

110.反射的三种实现

第一种:通过Object类的getClass方法

第二种:通过对象实例方法获取对象

第三种:通过Class.forName方式

111.实现xml解析的几种方式

XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。

112.IO流有哪些常见的类

字节流 字符流 缓冲流

113.requestbody和responsebody的区别

114.jdk8新特性

  • Lambda表达式

  • 函数式接口

  • *方法引用和构造器调用

  • Stream API

  • 接口中的默认方法和静态方法

  • 新时间日期API

115.什么是oop oop三大特效

oop 是面向对象编程,面向对象编程是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组、合而成。

OOP有什么特性:

1、封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只 需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现 MVC 分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。 2、继承性:就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP 只支持单继承,也就是说一个子类只能有一个父类。 3、多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

116.构造方法能不能被重写和重载?说一下重载和重写

构造方法可以被重载。

构造方法不可以被重写,因为重写发生在父类和子类之间,要求方法名称相同,而构造方法的名称是和类名相同的,而子类类名不会和父类类名相同,所以不可以被重写。

重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。

重写:在子类中可以根据需要对从父类中继承来的方法进行改造,也称 为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。

117.Spring注册bean的方式

1.xml配置方式

2.使用@Component注解+@ComponentScan包扫描方式

3.@Configuration+@Bean方式

4.FactoryBean方式

5.@Import方式

118.注入bean的方式 两个的区别是什么

119.spring aop 及其设计模式

  1. AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。

120.spring事务的分类及其事务的传播机制

Spring中常用事务类型:

  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

  • PROPAGATION_REQUIRED类似的操作。

  • PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与

传播机制:

REQUIRED(Spring默认的事务传播类型 required:需要、依赖、依靠):如果当前没有事务,则自己新建一个事务,如果当前存在事务则加入这个事务 当A调用B的时候:如果A中没有事务,B中有事务,那么B会新建一个事务;如果A中也有事务、B中也有事务,那么B会加入到A中去,变成一个事务,这时,要么都成功,要么都失败。(假如A中有2个SQL,B中有两个SQL,那么这四个SQL会变成一个SQL,要么都成功,要么都失败)

SUPPORTS(supports:支持;拥护):当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行 如果A中有事务,则B方法的事务加入A事务中,成为一个事务(一起成功,一起失败),如果A中没有事务,那么B就以非事务方式运行(执行完直接提交);

MANDATORY(mandatory:强制性的):当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。 如果A中有事务,则B方法的事务加入A事务中,成为一个事务(一起成功,一起失败);如果A中没有事务,B中有事务,那么B就直接抛异常了,意思是B必须要支持回滚的事务中运行

REQUIRES_NEW(requires_new:需要新建):创建一个新事务,如果存在当前事务,则挂起该事务。 B会新建一个事务,A和B事务互不干扰,他们出现问题回滚的时候,也都只回滚自己的事务;

NOT_SUPPORTED(not supported:不支持):以非事务方式执行,如果当前存在事务,则挂起当前事务 被调用者B会以非事务方式运行(直接提交),如果当前有事务,也就是A中有事务,A会被挂起(不执行,等待B执行完,返回);A和B出现异常需要回滚,互不影响

NEVER(never:从不): 如果当前没有事务存在,就以非事务方式执行;如果有,就抛出异常。就是B从不以事务方式运行 A中不能有事务,如果没有,B就以非事务方式执行,如果A存在事务,那么直接抛异常

NESTED(nested:嵌套的)嵌套事务:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务) 如果A中没有事务,那么B创建一个事务执行,如果A中也有事务,那么B会会把事务嵌套在里面。

121.spring常用注解

1、声明bean的注解

@Component:泛指各种组件

@Controller、@Service、@Repository都可以称为@Component

@Controller:控制层

@Service:业务层

@Repository:数据访问层

2、注入bean的注解

@Autowired:由Spring提供

@Inject:由JSR-330提供

@Resource:由JSR-250提供

3、Java配置类相关注解

@Configuration:声明当前类为配置类

@Bean:注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式

@ComponentScan:用于对Component进行扫描

4、切面(AOP)相关注解

Spring支持AspectJ的注解式切面编程

@Aspect:声明一个切面

@After:在方法执行之后执行(方法上)

@Before:在方法执行之前执行(方法上)

@Around:在方法执行之前与之后执行(方法上)

@PointCut:声明切点

@EnableAspectJAutoProxy:开启Spring对AspectJ代理的支持

5、@Bean的属性支持

@Scope设置类型包括:设置Spring容器如何新建Bean实例

Singleton:单例,一个Spring容器中只有一个bean实例,默认模式

Protetype:每次调用新建一个bean

Request:web项目中,给每个http request新建一个bean

Session:web项目中,给每个http session新建一个bean

GlobalSession:给每一个 global http session新建一个Bean实例

6、@Value注解

注入普通字符、注入操作系统属性、注入表达式结果、注入其它bean属性、注入文件资源、注入网站资源、注入配置文件

7、环境切换

@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件。

@Conditional:通过实现Condition接口,并重写matches方法,从而决定该bean是否被实例化。

8、异步相关

@EnableAsync:配置类中通过此注解开启对异步任务的支持

@Async:在实际执行的bean方法使用该注解来声明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)

9、定时任务相关

@EnableScheduling:在配置类上使用,开启计划任务的支持

@Scheduled:来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)

10、Enable***注解说明

@EnableAspectAutoProxy:开启对AspectJ自动代理的支持

@EnableAsync:开启异步方法的支持

@EnableScheduling:开启计划任务的支持

@EnableWebMvc:开启web MVC的配置支持

@EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories:开启对SpringData JPA Repository的支持

@EnableTransactionManagement:开启注解式事务的支持

@EnableCaching:开启注解式的缓存支持

11、测试相关注解

@RunWith:运行器,Spring中通常用于对JUnit的支持

@ContextConfiguration

121.seata的三大模块和三大模式

Seata 中有三大模块,分别是 TM、RM 和 TC。

AT模式 TCC模式 SAGA模式 XA模式

122.jsp和servlet关系

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。 Servlet和JSP最主要的不同点在于: Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。 而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。 JSP侧重于视图,Servlet主要用于控制逻辑 Servlet更多的是类似于一个Controller,用来做控制。

123.servlet中的四大作用域 九大内置对象

九大内置对象整体可以分为四大类 1.输入输出类:request对象、response对象、out对象 2.通信控制类:pageContext对象、session对象、application对象 3.servlet类:page对象、config对象 4.错误处理类:exception对象

四大作用域

1.Page范围 ​ (当前页面)作用当前页面, 一个JSP页面。只在一个页面保存数据,page里的变量无法在两个JSP页面传递,只要页面跳转,变量就不见了。

2.Request范围 ​ (转发)作用同一个请求,请求作用域,就是客户端的一次请求。只在一个请求中保存数据,request里的变量可以跨越前后两页,但只要刷新页面,变量就重新计算了。

3.Session范围 ​ (私有)作用同一个会话,会话作用域,当用户首次访问时,就产生一个新会话,以后服务器就记住这个会话状态。在一个会话中保存数据,仅供单个用户使用。生命周期为会话超时,或者服务器强制使会话失效。变量会一直累加,只要关闭浏览器,再次重新启动访问页面的时候,变量就重新计算了。

4.Application范围 ​ (全局)全局作用范围,整个应用程序共用,在部署文件的同一个WebApp共享。在整个服务器中保存数据,供全部用户共享。生命周期为应用程序的启动到停止。变量会一直在累加,除非重启tomcat,否则就一直变大。

124.缓存的优缺点 平时开发用过哪些缓存方式

优点

1.提升了用户体验:用户在使用产品过程中建立起来的一种纯主观感受。 缓存的使用可以提升系统的响应能力,大大提升了用户体验。

2.减轻了服务器压力。客户端缓存、网络端缓存减轻应用服务器压力。 服务端缓存减轻数据库服务器的压力。

缺点

1.额外的硬件支出。缓存是一种软件系统中以空间换时间的技术 需要额外的磁盘空间和内存空间来存储数据。

2.缓存和主数据之间数据一致性问题。缓存与数据库无法做到数据的实时同步, Redis无法做到主从时时数据同步。

3.高并发缓存失效。在高并发场景下会出现缓存失效(缓存穿透、缓存雪崩、缓存击穿) 造成瞬间数据库访问量增大,甚至崩溃。

缓存的方式

Cache Aside 更新模式

Read/Write Through 更新模式

Write Behind Caching 更新模式

125.HashMap和HashTable的区别

1、继承的父类不同 HashMap继承自AbstractMap类。但二者都实现了Map接口。 Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。

2、HashMap线程不安全,HashTable线程安全4.是否允许null值

3、Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;HashTable键值对都不能为空,否则包空指针异常。

4、hash值不同

HashTable:直接使用对象的hashCode

HashMap:重新计算hash值

5.扩容

  • HashMap:第一次数组是16(懒汉式),扩容是2倍

  • HashTable:第一次数组容量是11(饿汉式),扩容是(2*N+1)

6.效率:

  • HashMap效率高

  • HashTable效率低(因为使用了同步锁)

126.当实体类中属性名和表中字段名不一样时应当如何处理

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致

第2种: 通过来映射字段名和实体类属性名的一一对应的关系

127.spring自动装配有几种

Spring对外提供5种自动装配的方式

byName: 通过参数名 自动装配 ​ Spring容器在配置文件中发现bean的autowire属性被设置成byname ​ 之后容器试图匹配、装配和该bean的属性具有相同名字的bean。

byType: 通过参数类型自动装配 Spring容器在配置文件中发现bean的autowire属性被设置成byType ​ 之后容器试图匹配、装配和该bean的属性具有相同类型的bean ​ 当有多个bean符合条件,则抛出错误。

constructor: 这个方式类似于byType, ​ 但是要提供给构造器参数 ​ 当没有确定的带参数的构造器参数类型, ​ 将会抛出异常。

autodetect: ​ 首先尝试使用constructor来自动装配 ​ 当无法工作,则使用byType方式

no: ​ 默认的方式是不进行自动装配, ​ 通过显式设置ref 属性来进行装配

128.MySQL有哪些函数

聚集函数

avg

count

max

min

sum

用于处理字符串的函数

合并字符串函数:concat(str1,str2,str3…)

比较字符串大小函数:strcmp(str1,str2)

获取字符串字节数函数:length(str)

获取字符串字符数函数:char_length(str)

字母大小写转换函数:大写:upper(x),ucase(x);小写lower(x),lcase(x)

用于处理数值的函数

绝对值函数:abs(x)

向上取整函数:ceil(x)

向下取整函数:floor(x)

取模函数:mod(x,y)

随机数函数:rand()

四舍五入函数:round(x,y)

数值截取函数:truncate(x,y)

用于处理时间日期的函数

获取当前日期:curdate(),current_date()

获取当前时间:curtime(),current_time()

获取当前日期时间:now()

从日期中选择出月份数:month(date),monthname(date)

从日期中选择出周数:week(date)

从日期中选择出周数:year(date)

从时间中选择出小时数:hour(time)

从时间中选择出分钟数:minute(time)

从时间中选择出今天是周几:weekday(date),dayname(date)

129.RabbitMQ如何防止消息丢失

130.redis的分布式锁,有哪些实现

131.单例模式的分类 哪个是线程安全的

  1. 饿汉式

    优点:实现简单, 线程安全,调用效率高(无锁,且对象在类加载时就已创建,可直接使用)。

    缺点:可能在还不需要此实例的时候就已经把实例创建出来了,不能延时加载(在需要的时候才创建对象)。

  2. 懒汉式

    优点:线程安全,可以延时加载。

    缺点:调用效率不高(有锁,且需要先创建对象)。

  3. 懒汉式改良版(双重同步锁)

  4. 静态内部类(线程安全,调用效率高,可以延时加载。)

  5. 枚举(写法简单,线程安全,调用效率高,可以天然的防止反射和反序列化调用,不能延时加载。)

132.springboot自动装配原理

133.springmvc的九大内置组件

1、MultipartResolver(文件处理器),对应的初始化方法是initMultipartResolver(context),用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File。

2、LocaleResolver(当前环境处理器),对应的初始化方法是initLocaleResolver(context),这就相当于配置数据库的方言一样,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。

3、ThemeResolver(主题处理器),对应的初始化方法是initThemeResolver(context),用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源,如图片、css样式等。SpringMVC的主题也支持国际化。

4、HandlerMappings(处理器映射器),对应的初始化方法是initHandlerMappings(context),这就是根据用户请求的资源uri来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行处理呢

5、HandlerAdapters(处理器适配器),对应的初始化方法是initHandlerAdapters(context),从名字上看,它就是一个适配器。Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapters要做的事情。

6、HandlerExceptionResolvers(异常处理器),对应的初始化方法是initHandlerExceptionResolvers(context),其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢?这就要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。

7、RequestToViewNameTranslator(视图名称翻译器),对应的初始化方法是initRequestToViewNameTranslator(context),有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。

8、ViewResolvers(页面渲染处理器),对应的初始化方法是initViewResolvers(context),ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。

9、FlashMapManager(参数传递管理器),对应的初始化方法是initFlashMapManager(context),用来管理FlashMap的,FlashMap主要用在redirect重定向中传递参数。

132.spring事务在什么时候会失效

1.数据库不支持事务

2.事务方法未被spring管理

3.方法没有被public修饰

4.同一类中方法调用

5.未配置事务管理器

6.方法的事务传播类型不支持事务

7.不正确的捕获异常

8.错误的标注异常类型

133.在分布式场景下如何实现唯一的ID

1、【数据库自增长ID】

【优缺点】 优点: 非常简单,有序递增,方便分页和排序; 缺点: 分库分表后,同一数据表的自增ID容易重复,无法直接使用(可以设置步长,但局限性很明显);性能吞吐量整个较低;ID号码不够随机,能够泄露发号数量的信息,不太安全。

【使用场景】 单数据库实例的表ID(包含主从同步场景),部分按天计数的流水号等;分库分表场景、全系统唯一性ID场景不适用

2、UUID生成 【生成原理】 UUID生成id需要用到以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。其生成的id由当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号。

【优缺点】 优点: 不依赖任何数据源,自行计算,没有网络ID,速度超快,并且全球唯一; 缺点: 没有顺序性,并且比较长(128bit),作为数据库主键、索引会导致索引效率下降,空间占用较多。

【使用场景】 只要对存储空间没有苛刻要求的都能够适用,比如各种链路追踪、日志存储等。

3、redis生成id 【生成原理】 依赖redis的数据源,通过redis的incr/incrby自增院子操作命令,能保证生成id肯定是唯一有序的,本质生成方式与数据库一致。

【优缺点】 优点: 整体吞吐量比数据库要高; 缺点:Redis是基于内存的数据库,其实例或集群宕机后,找回最新的ID值有点困难。由于使用自增,对外容易暴露业务数据总量

【应用场景】 比较适合计数场景,如用户访问量,订单流水号(日期+流水号)等。

4、雪花算法snowflake

【实现原理】 属于半依赖数据源方式,原理是使用Long类型(64位),按照一定的规则进行填充:时间(毫秒级)+集群ID+机器ID+序列号,每部分占用的位数可以根据实际需要分配,其中集群ID和机器ID这两部分,在实际应用场景中要依赖外部参数配置或数据库记录。

【优缺点】 优点: 高性能、低延迟、去中心化、按时间有序; 缺点: 要求机器时钟同步(到秒级即可),即时间回拨 会导致id重复。

【使用场景】 分布式应用环境的数据主键,大多数使用雪花算法来实现分布式id。

134.Map实现线程的安全的三种方式

方式一、使用HashTable

    Map<String, String> hashtable = new Hashtable<>();

实现原理是在增删改查的方法上使用了synchronized锁机制,在多线程环境下,无论是读数据还是修改数据,在同一时刻只能有一个线程在执行synchronized方法(所有线程竞争同一把锁),因为对整个表进行锁定。所以线程越多,对该map的竞争越激烈,效率越低。 s://blog.csdn.net/weixin_53975556/article/details/125037750

方式二、使用Collections.synchronizedMap

    Map<String, String> synchronizedHashMap =
​
                    Collections.synchronizedMap(new HashMap<String, String>());
​
   调用synchronizedMap()方法后会返回一个SynchronizedMap类的对象,而在SynchronizedMap类中使用了synchronized同步关键字来保证对Map的操作是安全的。
​
    实现原理是使用工具类里的静态方法,把传入的HashTable包装成同步的,即在增删改查的方法上增加了synchronized锁机制,每次操作hashmap都需要先获取到这个对象锁,这个对象锁加了synchronized修饰,其实现方式和HashTable差不多,效率也很低。

方式三、使用ConcurrentHashMap

  Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();
​
    实现原理是HashTable是对整个表进行加锁,而ConcurrentHashMap是把表进行分段,初始情况下分成16段,每一段都有一把锁。当多个线程访问不同的段时,因为获取到的锁是不同的,所以可以并行访问。效率比HashTable

135.SpringBoot和SpringCloud的区别

1.SpringBoot专注于方便的开发单个个体微服务 2.SpringCloud是关注于全局的微服务协调治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来. 为各个微服务之间提供配置管理,服务发现,断路器,路由,微代理,事件总线,决策竞选,分布式会话等集成服务. 3.SpringBoot可以离开SpringCloud单独使用,而SpringCloud离不开SpringBoot

4.SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。

5.SpringCloud是一系列框架的集合,可以包含SpringBoot。

136.SpringBoot如何读取yaml和properties中的配置内容

137.maven常用的命令有哪些

命令 描述 mvn clean 对项目进行清理,删除target目录下编译的内容 mvn compile 编译项目源代码 mvn test 对项目进行运行测试 mvn package 打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件 mvn install 在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下

138.vue如何隐藏一个标签,v-if和v-show的区别

(1)“v-show”只编译一次;而“v-if”不停地销毁和创建 (2)“v-if”更适合于带有权限的操作,渲染时判断权限数据 (3)v-show更适合于日常使用,可以减少数据的渲染,减少不必要的操作

139.vue中路由传参的方式有哪些

query 传参:

params传参:

140.Vue组件传参

1.父向子传参: 父组件向子组件共享数据需要使用自定义属性----props 比如我们有父组件 Father 和 子组件 Son。如果需要父向子传参时,则需要在子组件Son中添加一个props(与data平级)。在props中可以添加自定义属性,属性名自己取。比如fromfather:{default:0, type:Number} 传参时只需要在父组件中使用子组件<Son :fromfather="需要穿的值"></Son> 这里使用的属性名必须与子组件中props上定义的一样 2.子向父传参 子组件向父组件共享数据使用自定义事件 在子组件Son的methods中定义一个方法,其中有this.$emit('自己定义的方法名', 要传的数据)

141.css中如何让一个盒子在窗口中完全居中

普通盒子居中: 让左右margin为auto margin: 0 auto;

绝对定位的盒子居中: 先走父盒子宽度的一半left: 50%,然后再移动自身宽度的一半 margin-left: -50px。 //假设需要居中的盒子的宽度为100px position: absolute; left: 50%; margin-left: -50px;

flex布局实现盒子居中 display: flex; justify-content: center; //主轴元素居中 align-items: center; //侧轴元素居中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Java基础面试可以包括很多方面的知识,以下是一些常见的问和答案: 1. 什么是JNI? JNI是Java Native Interface的缩写,它提供了一组API,用于实现Java和其他语言(主要是C和C++)之间的通信。JNI允许Java代码与本地已编译的代码进行交互,尽管这可能会降低平台的可移植性。\[2\] 2. JNI的步骤是什么? JNI的步骤包括以下几个部分: - 在Java类中编写带有native声明的方法。 - 使用javac命令编译Java类。 - 使用javah命令生成头文件。 - 使用C/C++实现本地方法。 - 生成动态连接库。 - 执行Java代码。\[1\] 3. 请解释一下super.getClass()方法的作用。 super.getClass()方法是用于获取当前对象的父类的Class对象。在给定的示例中,Test类继承自Date类,当调用super.getClass().getName()时,会返回Test类的名称。因此,输出的结果是"Test"。\[3\] 希望以上回答能够帮助你理解Java基础面试。如果你有其他问,请随时提问。 #### 引用[.reference_title] - *1* *2* [Java基础常见面试及详细答案(总结40个)](https://blog.csdn.net/ayouki123456/article/details/124983188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java基础面试50](https://blog.csdn.net/weixin_38337769/article/details/100560220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值