Java面试被问到的问题

目录

1 、前端框架angular和vue接触过没有?

2、Hashmap的底层原理,和hashtable的区别?

3、操作字符串线程安全的类的是哪一个?

4、和StringBulider的区别?

5、集合类的线程安全的是?

6、springboot默认都是单例的,有一个共享的成员变量有业务上进行并发操作的时候,会有什么?

7、如何处理这种问题呢?

8、线程池了解?Java自带的核心线程数,有缓冲队列,Max最大的线程之间的关联关系?

9、==和equals?

10、&和&&的区别,性能哪个更好?

11、web类的流程,比如springboot作为后台,提供对外接口一般都是restful,有哪些传参方式,前台提交到后台的参数怎么带到后台?

12、事务回滚,你接触过的怎么设置?trycatch之后还会回滚吗?

13、权限用户

14、自动拆装箱

15、如何保证线程安全?

16、mysql索引类型

17、sql性能优化

18、左连接和右连接的区别

19、springboot的入口类怎么执行

20、事务了解吗?说一下

21、mybatis的分页怎么实现

22、pagehelper的原理

23、redis,有哪些数据类型

24、ssm,spring的设计模式

25、ioc和aop是什么

26、ioc的设计模式,底层如何实现,加载全过程

27、git的常用命令

28、Java的面向对象

29、抽象类和接口的区别

30、Linux的命令

31、Docker常用命令

32、看索引有没有生效,用什么?怎么判定索引有没有生效

33、索引执行原则,索引什么时候会失效

34、mybatis中$和#的区别

35、redis使用的场景

36、nginx的负载平衡

37、springmvc的执行流程

38、springboot核心注解,自动配置原理是?Starters是什么?

39、项目是springboot开发?其优势

40、boot的可以存在循环依赖吗?会报错吗?

41、bean默认是单例还是多例?

42、一个类加入spring中的方法

43、mysql数据库事务隔离级别,默认是?

44、数据库索引需要注意哪些地方

45、唯一和主键找数据哪个更快

46、聚集索引和非聚集索引

47、怎么解决哈希冲突(俩key哈希值一样,怎么解决)

48、map中用key排序怎么办?用啥?

49、Java异常处理中throw和throws的区别

50、动态代理实现原理

51、throw了一个新的异常,必须要在方法上声明吗?不标明编译会通过吗?

52、redis的优点,为什么使用它?

53、一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?


 最近面试被问到的问题:

1 、前端框架angular和vue接触过没有?

(这我不会,我找了篇文章)

①angular是mvvm框架, 而vue是一个渐进式的框架, 相当于view层

②都有双向数据绑定, 但是angular中的双向数据绑定是基于脏检查机制, vue的双向数据绑定是基于ES5的getter和setter来实现, 而angular是有自己实现一套模板编译规则,

③vue比angular更轻量, 性能上更高效, 比angular更容易上手, 学习成本低,

④vue需要一个el对象进行实例化, 而angular是整个html页面下的,单页面应用, 而vue可以有过个vue实例

————————————————

版权声明:本文为CSDN博主「忘川追影」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_36658051/article/details/84338492

2、Hashmap的底层原理,和hashtable的区别?

底层原理:http://t.csdn.cn/GETsX

hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。

hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。

hashMap允许空键值,而hashTable不允许。

HashMap 是非线程安全的,Hashtable是线程安全的。

  1. 3、操作字符串线程安全的类的是哪一个?

StringBuffer,使用 synchronized 来保证线程安全

4、和StringBulider的区别?

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

5、集合类的线程安全的是?

线程安全的集合有Vector、HashTable、Stack、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue等。Vector相当于ArrayList的翻版,是长度可变的数组;Hashtable是一个线程安全的集合,是单线程集合;等等。

6、springboot默认都是单例的,有一个共享的成员变量有业务上进行并发操作的时候,会有什么?

单例是并发不安全的,以Controller举例,问题根源在于,我们可能会在Controller中定义成员变量,如此一来,多个请求来临,进入的都是同一个单例的Controller对象,并对此成员变量的值进行修改操作,因此会互相影响。

7、如何处理这种问题呢?

①单例变原型

对web项目,可以Controller类上加注解@Scope("prototype")或@Scope("request"),对非web项目,在Component类上添加注解@Scope("prototype")。

优点:实现简单;缺点:很大程度上增大了bean创建实例化销毁的服务器资源开销。

②线程隔离类ThreadLocal

有人想到了线程隔离类ThreadLocal,我们尝试将成员变量包装为ThreadLocal,以试图达到并发安全,同时打印出Http请求的线程名

③尽量避免使用成员变量

单例bean的成员变量这么麻烦,能不用成员变量就尽量避免这么用,在业务允许的条件下,将成员变量替换为RequestMapping方法中的局部变量,多省事。

8、线程池了解?Java自带的核心线程数,有缓冲队列,Max最大的线程之间的关联关系?

(不会,贴个连接)

http://t.csdn.cn/WtbQl

9、==和equals?

==:运算符,用于比较基础类型变量和引用类型变量。

对于基础类型变量,比较的变量保存的值是否相同,类型不一定要相同。

对于引用类型变量,比较的是两个对象的地址是否相同。

equals:Object 类中定义的方法,通常用于比较两个对象的值是否相等。

equals 在 Object 方法中其实等同于 ==,但是在实际的使用中,equals 通常被重写用于比较两个对象的值是否相同。

10、&和&&的区别,性能哪个更好?

&&:逻辑与运算符。当运算符左右两边的表达式都为 true,才返回 true。同时具有短路性,如果第一个表达式为 false,则直接返回 false。

&:逻辑与运算符、按位与运算符。

按位与运算符:用于二进制的计算,只有对应的两个二进位均为1时,结果位才为1 ,否则为0。

逻辑与运算符:& 在用于逻辑与时,和 && 的区别是不具有短路性。所在通常使用逻辑与运算符都会使用 &&,而 & 更多的适用于位运算。

11、web类的流程,比如springboot作为后台,提供对外接口一般都是restful,有哪些传参方式,前台提交到后台的参数怎么带到后台?

 https://blog.csdn.net/weixin_46195957/article/details/121769055?

12、事务回滚,你接触过的怎么设置?trycatch之后还会回滚吗?

SpringMVC:

1)注解

<tx:annotation-driven transaction-manager=""/>

@Transactional

2)配置文件

<!--配置声明式事务范围及类型-->

<tx:advice id="" transaction-manager="">

<tx:attributes>

<tx:method name="" propagation=""/>

<tx:method name="" read-only=""/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:advisor advice-ref="" pointcut=""/>

</aop:config>

SpringBoot:

@EnableTransactionManagement

@Transactional

catch模块处理这个异常就不会回滚,没有处理而是throw new 异常的话还是会回滚。

13、权限用户

http://t.csdn.cn/XHEBO

14、自动拆装箱

   编译器特性,当基本类型引用类型 相互赋值时,会自动调用装箱或拆箱方法,自动补全代码,是 JDK1.5 之后出现的新特性

15、如何保证线程安全?

http://t.csdn.cn/UIJeg

16、mysql索引类型

主键、唯一、普通、全文

http://t.csdn.cn/cwcpF

17、sql性能优化

  1. 尽量不用select * 而是用具体字段
  2. 使用in 和 not in 时,里面的参数少一些
  3. 设置表结构的时候,使用varchar 代替char
  4. 尽量避免在 WHERE 子句中使用 OR 来连接条件

http://t.csdn.cn/RIfF2

http://t.csdn.cn/XBdc7

18、左连接和右连接的区别

http://t.csdn.cn/sOc9Z

19、springboot的入口类怎么执行

Spring Boot启动流程:
1、加载配置文件:application.properties;
2、自动装配
3、加载组件:@Repository,@Service,@Controller,@Component,@Entity
4、应用初始化

https://www.likecs.com/show-203365546.html#Spring%20Boot%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%EF%BC%9A

 

20、事务了解吗?说一下

http://t.csdn.cn/CTGBL

21、mybatis的分页怎么实现

http://t.csdn.cn/RugaN

22、pagehelper的原理

http://t.csdn.cn/G5wQC

23、redis,有哪些数据类型

http://t.csdn.cn/l8Q8d

24、ssm,spring的设计模式

http://t.csdn.cn/IUOt2

25、ioc和aop是什么

http://t.csdn.cn/dg8yI

26、ioc的设计模式,底层如何实现,加载全过程

 

http://t.csdn.cn/ysn5V

27、git的常用命令

使用nginx操作命令前提:必须进入到nginx的自动生成目录的下/sbin文件夹下

./nginx -v 查看版本

./nginx 启动

./nginx -s stop 关闭

./nginx -s reload 重新加载

http://t.csdn.cn/5lSTM

28、Java的面向对象

http://t.csdn.cn/N56K8

29、抽象类和接口的区别

http://t.csdn.cn/tfets

30、Linux的命令

  1. cd命令,用于切换目录;
  2. ls命令,用于显示指定工作目录下的内容;
  3. pwd命令,用于显示工作目录所在位置;
  4. mkdir命令,用于创建目录;
  5. cp命令,用于复制文件或目录等。
  6. lsof -i : 端口号,查看端口被占用
  7. netstat -ntlp   //查看当前所有tcp端口
  8. netstat -ntulp | grep 80   //查看所有80端口使用情况
  9. netstat -ntulp | grep 3306   //查看所有3306端口使用情况

http://t.csdn.cn/9OIMj

31、Docker常用命令

帮助命令:

docker version

docker -v

docker info

docker --help   // 重要

查看本地镜像:

# 列出本地镜像

docker images

# 列出本地所有镜像(含中间映像层)

docker images -a

# 只显示镜像ID

docker images -q

# 显示镜像的摘要信息DIGEST

docker images --digests

# 显示完整的镜像信息IMAGE ID

docker images --digests --no-trunc

搜索镜像:

docker search 某个镜像的名字

# 显示完整的镜像描述

docker search --no-trunc tomcat

# 列出收藏数不小于指定值的镜像

docker search -s 30 tomcat

pull下载镜像

# 下载最新镜像

docker pull 镜像名  =  docker pull 镜像名:latest

docker rmi删除镜像

docker rmi 镜像名称

# 强制删除正在运行的镜像

docker rmi -f 镜像名称

# 删除多个镜像

docker rmi -f 镜像名称1 镜像名称2

#删除全部镜像

docker rmi -f $(docker images -q)

http://t.csdn.cn/ZxdMl

32、看索引有没有生效,用什么?怎么判定索引有没有生效

在查询语句前加上explain。
explain函数作用:显示了MYSQL如何使用索引来处理select语句以及连接表。

http://t.csdn.cn/UA2Ht

33、索引执行原则,索引什么时候会失效

执行原则:同44

  1. 对列进行计算或者使用函数时;
  2. 使用了反向操作或者link操作时;
  3. 在where语句中使用or时,如果有一个列没索引,那么其他列就会失效。

索引在什么情况下会失效-mysql教程-PHP中文网 https://www.php.cn/mysql-tutorials-417917.html

34、mybatis中$和#的区别

1、#{变量名}可以进行预编译、类型匹配等操作,

2、#{变量名}会转化为jdbc的类型。

3、${变量名}不进行数据类型匹配,直接替换。 

4、#方式能够很大程度防止sql注入

5、$方式无法方式sql注入。

6、$方式一般用于传入数据库对象,例如传入表名。

http://t.csdn.cn/ulAZ2

35、redis使用的场景

1.缓存数据库 2.排行榜 3.计数器 4.社交网络  5.消息队列

36、nginx的负载平衡

Nginx负载均衡的作用:

转发功能:Nginx 会按照一定的算法轮询、权重将客户端发来的请求转发至不同的应用服务器上,同时减轻单台服务器的压力,提高服务器的并发量;

故障迁移:当一台服务器出现了故障时,客户端发来的请求将自动发送到其他服务器;

添加恢复:当故障服务器恢复正常工作时,将自动添加到处理用户请求中;

————————————————

版权声明:本文为CSDN博主「biyusr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/biyusr/article/details/125480143

37、springmvc的执行流程

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器执行处理器(Controller,也叫后端控制器)。
  5. Controller执行完成返回ModelAndView
  6. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  7. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  8. ViewReslover解析后返回具体View
  9. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  10. DispatcherServlet响应用户。

从上面可以看出,DispatcherServlet有接收请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。

 

https://baijiahao.baidu.com/s?id=1717728194505578801&wfr=spider&for=pc

38、springboot核心注解,自动配置原理是?Starters是什么?

核心注解:

@SpringBooTApplication

@EnableAutoConfiguration :通过配置true/FALSE来开启或关闭

@Configuration

@Import :将对象注入springboot中@ComponentScan

@Bean : 将配置类中一堆对象注入

自动配置(autoConfiguration)原理:http://t.csdn.cn/ki9Co

Starters:http://t.csdn.cn/k0VX1

39、项目是springboot开发?其优势

Spring Boot 的优点有:

1、减少开发,测试时间和努力。

2、使用JavaConfig 有助于避免使用XML。

3、避免大量的Maven 导入和各种版本冲突。

4、提供意见发展方法。

5、通过提供默认值快速开始开发。

6、没有单独的Web 服务器需要。这意味着你不再需要启动Tomcat,Glassfish或其他任何东西。

7、需要更少的配置因为没有web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到bean 方法中,以使Spring 自动装入需要的依赖关系中。

8、基于环境的配置使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring 将在(application{environment} .properties)中加载后续的应用程序属性文件。

————————————————

版权声明:本文为CSDN博主「四猿外」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:Spring Boot 有哪些优点?_四猿外的博客-CSDN博客_springboot优点

40、boot的可以存在循环依赖吗?会报错吗?

多个类中的依赖形成了环路,形成了类似于死锁的情况,导致springboot在启动时无法为我们创建Bean。

http://t.csdn.cn/2bpkd

41、bean默认是单例还是多例?

单例

42、一个类加入spring中的方法

1.使用@Bean 注解,用于注入第三方 jar 包到SpringIOC容器中。

2.使用 @Import({Order.class, Member.class, MyImportBeanDefinitionRegistrar.class}) 注解,可以注入多个类,多个类之间使用 , 分割,主要用于注入第三方的 jar 包到SpirngIOC容器中。

3.@Service、@Repository 注入对象到SpringIOC容器中,能更好的的区分使用场景(自定义的类注入 Spring 容器中使用)。底层是使用@Component 注解实现。注意:使用 @Component  需要开启扫包范围。

https://www.cnblogs.com/lwl-ong/p/14261507.html

43、mysql数据库事务隔离级别,默认是?

读未提交(Read uncommitted)

读提交(Read committed)

可重复读(Repeatable read)     默认

串行化(Serializable )

44、数据库索引需要注意哪些地方

  1. 使用like关键字模糊查询时,% 放在前面索引不起作用,只有“%”不在第一个位置,索引才会生效(like '%文'--索引不起作用)
  2. 使用联合索引时,只有查询条件中使用了这些字段中的第一个字段,索引才会生效
  3. 使用OR关键字的查询,查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会生效,否则索引不生效。
  4. 尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
  5. 对查询进行优化,应尽量避免全表扫描,首先应考虑在where以及order by涉及的列上建立索引。
  6. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

————————————————

版权声明:本文为CSDN博主「学源客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:使用数据库的索引时需要注意的情况_学源客的博客-CSDN博客

45、唯一和主键找数据哪个更快

主键

46、聚集索引和非聚集索引

聚集索引和非聚集索引的根本区别是数据记录的排列顺序和索引的排列顺序是否一致

聚集索引的缺点是对表进行修改速度较慢

http://t.csdn.cn/FIqDZ

47、怎么解决哈希冲突(俩key哈希值一样,怎么解决)

1.开放地址法

这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。

就是说当发生冲突时,就去寻找下一个空的地址把数据存入其中,只要哈希表足够大,就总能找到这样一个空的地址。

2.拉链法

将所有关键字为同义字的记录存储在一个单链表中

3.再哈希法

在发生冲突的时候再用另外一个哈希函数算出哈希值,直到算出的哈希值不同为止。

4.建立公共溢出区

在创建哈希表的同时,再额外创建一个公共溢出区,专门用来存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共溢出区查。

————————————————

版权声明:本文为CSDN博主「世林木木」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_49123737/article/details/121251851

48、map中用key排序怎么办?用啥?

Treemap

http://t.csdn.cn/oICDh

49、Java异常处理中throw和throws的区别

1、throw 在方法体内使用,throws 在方法声明上使用;

2、throw 后面接的是异常对象,只能接一个。throws 后面接的是异常类型,可以接多个,多个异常类型用逗号隔开;

3、throw 是在方法中出现不正确情况时,手动来抛出异常,结束方法的,执行了 throw 语句一定会出现异常。而 throws 是用来声明当前方法有可能会出现某种异常的,如果出现了相应的异常,将由调用者来处理,声明了异常不一定会出现异常。

————————————————

版权声明:本文为CSDN博主「我不是你不是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_46511008/article/details/118770337

50、动态代理实现原理

http://t.csdn.cn/fYEii

51、throw了一个新的异常,必须要在方法上声明吗?不标明编译会通过吗?

检查时异常需要且会,运行时异常没有限制。

http://t.csdn.cn/4OoTv

52、redis的优点,为什么使用它?

1.速度快 2.键值对的数据结构 3.丰富的功能

4.简单稳定 5.持久化 6.主从复制

7.高可用和分布式 8.客户端语言多

http://t.csdn.cn/QwShW

在项目中使用Redis,主要考虑的就是两个方面,一个是性能,还有一个是高并发,如果只是为了分布式锁这些其他的功能,还有其他中间件代替,并非必须使用Redis,比如常见的Zookpeer。

http://t.csdn.cn/tHwct

53、一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?

在写实现类的时候事先指明实现类的优先级,注入的时候就会使用优先级高的实现类。在controller中注入接口,默认使用的是Primary 标注的实现类的方法

@Service("s1")

@Primary     //**同一个接口的多个实现类,最多只能有一个添加该注解**

public class InterfaceImpl1 implements Interface {

     。。。

}

通过 @Autowired 和 @Qualifier 配合注入

@Qualifier("interface1Impl1")

@Autowired

Interface1 interface1;

使用@Resource注入,根据默认类名区分

@Resource(name = "interface1Impl1")

Interface1 interface1;    //正常启动

使用@Resource注入,根据@Service指定的名称区分

@Resource(name = "s1")

Interface1 interface1;    //正常启动

————————————————

版权声明:本文为CSDN博主「张铎(信念)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?_张铎(信念)的博客-CSDN博客_一个接口两个实现类 调用调哪个

http://t.csdn.cn/4KHsq

  • 25
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值