JAVA 面试题经典(附答案)

JAVA

JAVA8大基本数据类型

JAVA 面试题经典(附答案)_第1张图片 J AVA8大基本数据类型

HashMap和Hashtable的比较
        Hashtable:
            1.Hashtable不允许key或者value为null,线程安全,实现线程安全的方式是在修改数据时锁住整个Hashtable,效率低

            2.Hashtable线程安全的,很多方法都有synchronized修饰,但同时因为加锁导致单线程环境下效率较低。
        Hashmap:
            1.HashMap允许有一个key为null,允许多个value为null,线程不安全

            2.在多线程环境下会容易产生死循环,但是单线程环境下运行效率高;

一般建议用currentHashMap,因为他大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,

ArrayList和LinkedList的比较

         共性:ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同。

         区别:List接口的实现方式不同
                  ArrayList实现了List接口,以数组的方式来实现的,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好。
                  LinkedList是采用链表的方式来实现List接口的,因此在进行insert和remove动作时效率要比ArrayList高。适合用来实现Stack(堆栈)与Queue(队列)。

list和set的区别

        List,Set都是继承自Collection接口

        list:元素有放入顺序,元素可重复

        和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变

        set:元素无放入顺序,元素不可重复,重复元素会覆盖掉

        检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变


Java 重写(Override)与重载(Overload)
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

线程

java 线程(中、高级)总结

Spring

Spring是什么
spring是一个容器,用来装javabean(java对象的) 中间层框架

ioc aop 控制反转,面向切面,避免了依赖注入等问题

Aop是什么
将程序中交叉业务逻辑(日志,事务,参数校验),封装成一个切面,然后注入到目标对象,达到方法复用的功能

IOC是什么
ioc容器:存放map对象,也就是存放的各种对象,项目启动会去读取配置文件里面的bean,

控制反转:对象A获得依赖对象B的过程,由主动变成被动的行为,对象和对象之间没有相互关联,都依赖ioc容器了

依赖注入: 动态的将某种依赖关系注入到对象中

Spring Bean生命周期
1、根据类包解析得到beanDefinition

2、构造方法的推断

3、实例化得到对象

4、对对象中的加了@Autowired直接的属性进行属性填充

5、回调Aware方法,比如 BeanNameAware BeanFactoryAware

6、调用BeanPostProcessor的初始化前的方法

7、调用初始化方法

8、调用初始化后的方法,这里会进行aop

9、如果当前创建的bean是单例的,则会吧bean放入单例池里面

10、使用bean

11、销毁

Spring的事务什么时候会失效,怎么解决

aop的时候会失效,因为spring底层会生成一个代理对象,

1、方法自调用,解决方案: 不要用this来调用,可以通过spring提供的@Autowired 来调用

2、方法不是public的也会失效, 解决方案:开启Aspectj代理模式

3、数据库不支持事务(myisam),解决方案: 使用innodb引擎

4、没有被spring管理,

5、异常被catch了

JVM

mybatis

Mybaits的优缺点

sql灵活,sql写在xml中,与程序耦合度低,方便维护,可以重用,跟jdbc比较减少了大量代码,不需要手动开关连接,与各种数据库兼容,能够被spring集成,

sql语句编写量大,sql语句依赖于数据库,但是移植性差,不能随意更换数据库

#{ } ${}  的区别

#{} 是预编译处理、是占位符,会加上单引号 ,不会造成sql注入

${} 是字符串替换、拼接,不会加上单引号 ,会造成sql注入

MySql

MySql (中、高级)总结_Japhet_jiu的博客-CSDN博客

Redis

redis基本数据类型

String

hash

List 有顺序可重复

Set 无顺序,不能重复

zset 有顺序,不能重复 适合做排行榜 排序需要一个分数属性

redis怎么持久化

rdb:

        默认是开启了持久化,也可以手动设置触发条件 

        save 500 1  #500秒内有一次修改

        save  1000 10  #1000秒内有十次修改

        设置自动触发持久化时间

aof(追加文件 命令日志文件)(默认关闭  appendonly yes )  

        appendfsync:  always、everysec、no

JAVA 面试题经典(附答案)_第2张图片 Redis的过期键的删除策略

惰性过期:访问的时候去检查key

定时过期:每隔一段时间去检查过期的key

 缓存雪崩、缓存穿透、缓存击穿

雪崩:
给缓存设置数据过期时间,时间随机,

缓存预热(启动项目的时候拿个接口来查询缓存,存起来)

穿透:(数据库没有,缓存也没有数据,预防攻击)

接口增加校验

如果数据库、redis都没有数据,可以把这个redis key设置为null,然后设置有效时间30秒,避免暴力攻击

击穿:(缓存没有,数据库有)

热点数据可以设置永不过期等

 Redis主从搭建集群

搭建Redis集群_Japhet_jiu的博客-CSDN博客

SpringCloud

SpringCloud 和 Dubbo的区别

底层协议: springcloud是基于http协议 ,dubbo是基于tcp协议 

注册中心:springcloud使用eureka,nacos等,dubbo是 zookeeper

模型定义:springcloud是一个应用定义定义为服务,dubbo将一个接口定义为一个服务

 什么是Hystrix (断路器)

阻止故障的连锁反应,实现熔断

快速的失败,实现优雅降级

提供实时的监控和警告

线程隔离:互不影响,但是会建很多线程

型号量隔离:型号量有限

分布式事务(Seata)

XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入

        优点:

                事务的强一致,满足ACID原则

                常用数据库都支持,实现简单,没有代码侵入

        缺点:

                因为一阶段需要锁定数据库资源,等待二阶段结束才能释放,性能差

                依赖关系数据库实现事务

TCC模式:最终一致的分阶段事务模式,有业务侵入

        T:  try  资源检查和预留  C:  confirm 业务执行和提交   C: Cancel 预留资源的释放

        优点:

                一阶段完成直接提交事务,释放数据库资源,性能比较好

                相比AT模式,无需生成快照,无需使用全局锁,性能最差

                可以使用非事务型数据库(比如redis)

        缺点:

                有代码侵入,需要人为去编写 Try ,confirm 和cancel 接口,太麻烦

                软状态,事务最终一致

                需要考虑Confirm 和Cancel 的失败情况,做好幂等处理

AT模式:最终一致的分段式事务,无业务侵入,也是seata默认的模式

        优点:

                一阶段完成直接提交事务,释放数据库资源,性能比较好

                利用全局锁实现读写隔离

                没有代码侵入,框架自动完成回滚或提交

        缺点:

                两阶段之间属于软状态,属于最终一致

                框架的快照功能会影响性能,但比XA模式要好

SAGA模式:长事务模式,有业务侵入

        优点:

                一阶段直接提交事务,无锁,性能好

                不用编写TCC中的三个阶段,实现简单

        缺点:

                软状态持续时间不确定,时效性查

                没有锁,没有事务隔离,会有脏读

Rabbitmq

如何确保rabbitmq消息的可靠性

        开启生产确认机制,确保生产消息能到达队列

        开启消息持久功能,确保消息未消费前在队列中不会丢失

        开启消费者确认机制为auto,由spring确认消息后处理成功后完成ack

        开启消费者失败重试机制,并设置 messageRecoverer,多次重试失败后将消息放在另外一个异常交换机里面,由人工去处理

什么是死信交换机

        消费者的消息被拒绝,或者消息消费失败,返回了nack

        消息长时间没有被消费,(过期消息)

        消息队列满了,很久之前的的消息会变成死信

消息堆积的解决方案

        队列上绑定多个消费者,提高消费速度

        开启线程池,提高消费速度

        使用惰性队列

惰性队列(Lazy Queues)

        所有消息直接存入磁盘,不是写在内存里面

        消费者消费消息的时候,才回去从磁盘中读取,加载到内存

        支持上百万数据存储

rabbitmq的高级场景

        rabbitmq的高级场景_Japhet_jiu的博客-CSDN博客

Linux

linux 查看8080端口

netstat -anp|grep 8080

ps -aux|grep java

linux 查看磁盘空间

du -sh *

linux 查看CPU信息

cat /proc/cpuinfo

linux 查看物理内存等信息

free -h

linux远程发送文件

scp -i C:\Users\29574\Downloads\xxxxxxx..pem C:\Users\29574\Desktop\xx\xx\ROOT.zip [email protected]:/home

 

后续更新,请等待。。。。

你可能感兴趣的:(java,面试,java,面试)