java面试题3

1.数组与链表的区别
数组:相同数据类型的元素按一定顺序排列的集合;数组的存储区间是连续的,占用内存比较大;
数组的特点是:随机访问性强,查询简单速度快,从头尾增加和删除困难;
链表:是一种物理存储单元上非连续、非顺序的存储结构,链表存储区间离散,占用内存比较宽松
链表的特点是:查询相对于数组困难,增加和删除容易。
2. session和cookie的区别?
cookie数据保存在客户端,session数据保存在服务端
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
3.接口和抽象类的区别?
抽象类有构造方法,接口没有构造方法
抽象类可以是变量,也可以是常量,接口只能是常量
抽象类成员方法可以是抽象的也可以是非抽象的
接口jdk1.7只能是抽象的,jdk1.8可以写default和static开头的具体方法
4.缓存击穿/穿透/雪崩造成原因及解决方案
缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中
解决方案:缓存空对象,布隆过滤器
缓存雪崩
由于缓存层承载着大量请求,有效地保护了存储层,但是如果缓存层由于某些原因不可用(宕机)或者大量缓存由于超时时间相同在同一时间段失效(大批key失效/热点数据失效),大量请求直接到达存储层,存储层压力过大导致系统雪崩
解决方案:缓存层设计高可用,多级缓存,缓存的时间用随机值
缓存击穿:
并发量大,造成缓存失效大量线程重建缓存,造成后端负载加大
解决方案:分布式互斥锁,设置key值永不过期
5.什么是反射机制?
Java 动态执行机制,可以实现动态执行功能:
反射提供了在运行时判断任意一个对象所属的类型,并可以检查解析类型的内部结构。
反射可以动态加载类型,并能够动态创建对象
反射可以动态访问对象的属性。
反射可以动态执行对象的方法。
利用反射API还可以动态的访问,不可见的属性和方法

6.spring配置bean实例化有哪些方式?
 ⑴ 使用类构造器实例化(默认无参数)
 ⑵ 使用实例工厂方法实例化(工厂方法模式)
 ⑶ 使用静态工厂方法实例化(简单工厂模式) 

1.反射机制的优缺点?
优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码。

2.@LoadBalanced注解的作用是什么?
描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。

3.Nacos中的负载均衡底层是如何实现的?
通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务。

4.Mybatis 中#{}和${}的区别?
(1)#{}是预编译处理,${}是字符串替换。
(2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
(3)Mybatis在处理${}时,就是把${}替换成变量的值,相当于字符串拼接
(4)使用#{}可以有效的防止SQL注入,提高系统安全性。

5.哨兵模式是什么?具体怎么实现的?
哨兵是一个独立的进程,其原理是:哨兵通过向redis服务器发送命令,等待redis服务器响应,从而监控多个运行中的redis实例。
(1)通过发送命令,让redis服务器返回监控其运行状态,包括主服务器和从服务器。
(2)当哨兵监测到master(主机)宕机,会自动将slave(从机)切换成主机,然后通过发布订阅模式通知其他从机,让从机修改配置文件,让它们切换主机。
一、Nginx 有哪些优点?
1.跨平台、配置简单。
2.非阻塞、高并发连接
3.内存消耗小
4.成本低廉,且开源。
5.稳定性高,宕机的概率非常小。


二、Nginx 负载均衡意义与作用
负载均衡,即是代理服务器将接收的请求按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。


三、Nginx 默认提供了 3 种负载均衡策略:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、加权轮询策略
该策略在基本的轮询策略基础上考虑各后端服务器节点接受请求的权重,指定各后端服务器节点被轮询到的机率,主要应用于后端服务器节点性能不均的情况。
3、哈希 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。


四、springcloud五大常用组件
 Eureka(注册中心),
? Ribbon/Feign(负载均衡),
? Zuul(网关),
? Config(配置中心)
? Hystrix(熔断器)

五、SpringBoot和SpringCloud的关系与区别
1、SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。
2、SpringCloud是一系列框架的集合,可以包含SpringBoot。
1.Docker的常用命令?
命令                             备注
docker pull    拉取或更新指定的镜像
docker push    将镜像推送到远程仓库
docker rm                    删除容器
docker rmi    删除镜像
docker images    列出所有镜像
docker ps                    列出所有容器
2. 容器退出后,通过docker ps命令查看不到,数据会丢失么?
容器退出后会处于终止(exited)状态,此时可以通过docker ps -a查看,
其中数据不会丢失,还可以通过docker start来启动,只要删除容器才会清除数据
3. docker与虚拟机有何不同?
特性       Docker                                     虚拟机
启动速度       秒级                                     分钟级
交付/部署       开发、测试、生产环境一致     无成熟体系
性能       近似物理机                     性能损耗大
体量       极小(MB)                     较大(GB)
迁移/扩展       跨平台,可复制                     较为复杂
4.Redis 有哪些功能?
· 数据缓存功能
· 分布式锁的功能
· 支持数据持久化
· 支持事务
· 支持消息队列
5.Docker的基本组成
Docker主要有以下几部分组成:
Docker Client 客户端
Docker daemon 守护进程
Docker Image 镜像
Docker Container 容器
Docker Registry 仓库
1 . session和cookie的区别?
cookie数据保存在客户端,session数据保存在服务端
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
2. 索引失效场景
使用不等于查询,null值, 列参与了数学运算或者函数,字符串like时左边是通配符,比如%xxx
MySQL分析全表扫描比使用索引快的时候不使用索引,
当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引
3.缓存击穿/穿透/雪崩造成原因及解决方案
缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中
解决方案:缓存空对象,布隆过滤器
缓存雪崩
由于缓存层承载着大量请求,有效地保护了存储层,但是如果缓存层由于某些原因不可用(宕机)或者大量缓存由于超时时间相同在同一时间段失效(大批key失效/热点数据失效),
大量请求直接到达存储层,存储层压力过大导致系统雪崩
解决方案:缓存层设计高可用,多级缓存,缓存的时间用随机值
缓存击穿:
并发量大,造成缓存失效大量线程重建缓存,造成后端负载加大
解决方案:分布式互斥锁,设置key值永不过期
4.mq使用场景
      异步处理,
用户注册后,需要发注册邮件和注册短信
引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列处理后,响应时间是串行的3倍,是并行的2倍
      应用解耦
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。
就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。(这样就可以保证了不丢失订单
     流量削峰
流量削峰一般在秒杀活动中应用广泛
可以控制活动人数,超过此一定阀值的订单直接丢弃。
可以缓解短时间的高流量压垮应用。(应用程序按自己的最大处理能力获取订单)
5.什么是IOC?
负责创建对象,管理对象,整合对象,配置对象以及管理这些对象的生命周期
     为什么要用IOC?
IOC 或 依赖注入把应用的代码量降到最低,最小的代价和最小的侵入性使松散耦合得以实现。IOC
容器支持加载服务时的饿汉式初始化和懒加载
6 . spring AOP原理
 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
7.如何防止sql注入
sql预编译
确认每种数据的类型,数字必须使用int类型存储
规定数据长度
严格限制数据库权限
1.SpringMVC的优点?
  (1)可以支持各种视图技术
  (2)与Spring框架集成(如IOC容器,AOP等)
  (3)清晰的角色分配:前端控制器,请求到处理器映射,处理适配器,视图解析器
  (4)支持各种请求资源的映射策略

2.SpringBoot有哪些优点?
  (1)容易上手,提高开发效率,为Spring开发提供一个更快,更广泛的入门体验
  (2)开箱即用,远离繁琐的配置
  (3)提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器,安全管理,运行数据监控,运行状况检查和外部化配置等
  (4)没有代码生成,也不需要XML配置
  (5)避免大量的Maven导入和各种版本冲突

3.reids的使用场景
  (1)作为数据库数据的缓存
  (2)作为程序运行中间数据存储空间
  (3)一种简单的消息队列
  (4)生成序列号
  (5)作为部分配置参数的存储空间
  (6)对入参进行MD5加密,来实现接口幂等
  (7)分布式锁

4. JDBC 跟 Mybatis的区别?
  (1).Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
  (2).Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
  (3).MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
  (4).JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。

5.Spring框架的优点都有什么?
  (1).简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
  (2).解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。
  (3).支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。
  (4).集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
  (5).轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。

6.ArrayList和linkedList区别
ArrayList:是一个动态数组 连续的内存储存 适合下标访问 随机访问 扩容机制 数组长度固定   尾部插入快
LinkedList 是一个链表可以存储在分散的内存中 适合数据插入删除 不适合查询
遍历linkedlist只能用iterator不能for  不能用indexOf返回元素索引


8.list和set的区别?
list可重复 ,有序,可以存多个null
set不可重复,无序,可以存一个null
6.Collection和Collections的区别
Collection是集合类的顶级接口,继承与他的接口主要有List和Set。而Collections是针对集合类的一个工具类,
它提供了一系列的静态方法实现对各种集合的搜索、排序、线程安全化等操作。

7.HashMap和HashTable有何区别?
HashTable
底层数组+链表实现,无论key还是value都不能为null,线程安全,适合于多线程环境,实现线程安全的方式是在修改数据时锁住整个HashTable,
效率低,ConcurrentHashMap做了相关优化
初始size为11,扩容:newsize = olesize*2+1
HashMap
底层数组+链表实现,可以存储null键和null值,线程不安全,更适合于单线程环境
初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
1.数组与链表的区别
数组:相同数据类型的元素按一定顺序排列的集合;数组的存储区间是连续的,占用内存比较大;
数组的特点是:随机访问性强,查询简单速度快,从头尾增加和删除困难;
链表:是一种物理存储单元上非连续、非顺序的存储结构,链表存储区间离散,占用内存比较宽松
链表的特点是:查询相对于数组困难,增加和删除容易。
2. session和cookie的区别?
cookie数据保存在客户端,session数据保存在服务端
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
3.接口和抽象类的区别?
抽象类有构造方法,接口没有构造方法
抽象类可以是变量,也可以是常量,接口只能是常量
抽象类成员方法可以是抽象的也可以是非抽象的
接口jdk1.7只能是抽象的,jdk1.8可以写default和static开头的具体方法
7.springMVC工作流程
DispatcherServlet前端控制器
HandlerMapping处理器映射器
HandlerAdapter处理器适配器(执行业务代码)
ViewResolver视图解析
View视图渲染
十.SpringBoot,SpringMVC和Spring有什么区别
Spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,
提供AOP机制弥补OOP的代码重复问题,更方便的将不同类不同方法中的共同处理抽成切面,自动注入给方法执行,比如日志,异常等。
Springmvc是spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求,
然后定义了一套路由策略及适配执行handle,将handle结果使用视图解析技术生成视图展现给前端
SpringBoot是Spring提供的一个快速开发工具包,让程序员能更方便,更快速的开发Spring+SpringMVC应用,
简化了配置,整合了一系列解决方案,可以开箱即用。
1.String StringBuffer StringBuilder区别以及使用场景?
String是final修饰的不可变 每次操作都会产生新的String对象想
StringBuffer线程安全 方法都用synchronized修饰的
StringBuilder线程不安全 性能好
场景:优先使用StringBuilder,当变量作为共享变量 在共享状态下要保证结果的情况下就用StringBuffer;
2.SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement
 解决方案:利用全新的传输器PreparedStatement
               把SQL骨架利用SQL的参数分开执行的
 优点: 省去了拼接SQL语句的麻烦,防止SQL攻击,高效

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值