面试题整理 spring mvc输出Json数据

其他
1. 什什么是幂等?什什么情况下需要考虑幂等?你怎么解决幂等的问题?

编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

Java
1. 多个线程同时读写,读线程的数量量远远⼤大于写线程,你认为应该如何解决
并发的问题?你会选择加什什么样的锁?

引入读写锁

ReadWriteLock rwl = new ReentrantReadWriteLock()

读锁:

rwl.readLock().lock()

写锁:

rwl.writeLock().lock()


2. JAVA的AQS是否了了解,它是⼲干嘛的?

AbstractQueuedSynchronized(AQS) ,抽象的队列式的同步器
3. 除了了synchronized关键字之外,你是怎么来保障线程安全的?
4. 什什么时候需要加volatile关键字?它能保证线程安全吗?

volatile 线程可见性。不能保证线程安全
5. 线程池内的线程如果全部忙,提交⼀一个新的任务,会发⽣生什什么?队列列全部
塞满了了之后,还是忙,再提交会发⽣生什什么?

会加入到blockingqueue. 如果此时没有超过最大线程数,会new 一个非核心线程来处理,如果超过了最大线程数,会触发rejection.
6. Tomcat本身的参数你⼀一般会怎么调整?


7. synchronized关键字锁住的是什什么东⻄西?在字节码中是怎么表示的?在内
存中的对象上表现为什什么?
8. wait/notify/notifyAll⽅方法需不不需要被包含在synchronized块中?这是为什什
么?

需要。
9. ExecutorService你⼀一般是怎么⽤用的?是每个service放⼀一个还是⼀一个项⽬目
⾥里里⾯面放⼀一个?有什什么好处?
Spring
1. 你有没有⽤用过Spring的AOP? 是⽤用来⼲干嘛的? ⼤大概会怎么使⽤用?
2. 如果⼀一个接⼝口有2个不不同的实现, 那么怎么来Autowire⼀一个指定的实现?

这个时候就要用到@Qualifier注解了,qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一!

 


3. Spring的声明式事务 @Transaction注解⼀一般写在什什么位置? 抛出了了异常
会⾃自动回滚吗?有没有办法控制不不触发回滚?

不一定,sprint 对于RuntimeException会触发回滚,而对于普通的checked 的exception, 不触发回滚,还是会修改数据库记录。
4. 如果想在某个Bean⽣生成并装配完毕后执⾏行行⾃自⼰己的逻辑,可以什什么⽅方式实
现?
5. SpringBoot没有放到web容器器⾥里里为什什么能跑HTTP服务?
6. SpringBoot中如果你想使⽤用⾃自定义的配置⽂文件⽽而不不仅仅是
application.properties,应该怎么弄弄?
7. SpringMVC中RequestMapping可以指定GET, POST⽅方法么?怎么指定?
8. SpringMVC如果希望把输出的Object(例例如XXResult或者XXResponse)这
种包装为JSON输出, 应该怎么处理理?

依赖的jar包:

jackson-core-asl-1.8.7.jar   

jackson-mapper-asl-1.8.7.jar

 

 

复制代码
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.9.13</version>
</dependency>
复制代码

 

 

第一种方式:(ResponseEnity)

使用ResponseEnity

复制代码
@Controller
public class JSONController {
   @RequestMapping(value={"/{name}"}, method=RequestMethod.GET)
   public ResponseEntity<Shop> hello(@PathVariable String name) {
       Shop shop = new Shop();
       shop.setName(name);
       shop.setStaffName(new String[]{"zwh1","zwh2"});
       return new ResponseEntity<Shop>(shop,HttpStatus.OK);
   }
}
复制代码

输出Json: {"name":"zzz","staffName":["zwh1","zwh2"]}

第二种方式:(@ResponseBody)

使用@ResponseBody

复制代码
@Controller
public class JSONController {
   @RequestMapping(value={"/{name}"}, method=RequestMethod.GET)
   public @ResponseBody Shop hello(@PathVariable String name) {
       Shop shop = new Shop();
       shop.setName(name);
       shop.setStaffName(new String[]{"zwh1","zwh2"});
       return shop;
   }
}
复制代码

 

 输出Json: {"name":"zzz","staffName":["zwh1","zwh2"]}


9. 怎样拦截SpringMVC的异常,然后做⾃自定义的处理理,⽐比如打⽇日志或者包装
成JSON
MySQL
1. 如果有很多数据插⼊入MYSQL 你会选择什什么⽅方式?
2. 如果查询很慢,你会想到的第⼀一个⽅方式是什什么?索引是⼲干嘛的?
3. 如果建了了⼀一个单列列索引,查询的时候查出2列列,会⽤用到这个单列列索引吗?
4. 如果建了了⼀一个包含多个列列的索引,查询的时候只⽤用了了第⼀一列列,能不不能⽤用上
这个索引?查三列列呢?
5. 接上题,如果where条件后⾯面带有⼀一个 i + 5 < 100 会使⽤用到这个索引吗?
6. 怎么看是否⽤用到了了某个索引?
7. like %aaa%会使⽤用索引吗? like aaa%呢?
8. drop、truncate、delete的区别?
9. 平时你们是怎么监控数据库的? 慢SQL是怎么排查的?
10. 你们数据库是否⽀支持emoji表情,如果不不⽀支持,如何操作?
11. 你们的数据库单表数据量量是多少?⼀一般多⼤大的时候开始出现查询性能急
剧下降?
12. 查询死掉了了,想要找出执⾏行行的查询进程⽤用什什么命令?找出来之后⼀一般你
会⼲干嘛?
13. 读写分离是怎么做的?你认为中间件会怎么来操作?这样操作跟事务有
什什么关系?
14. 分库分表有没有做过?线上的迁移过程是怎么样的?如何确定数据是正
确的?
JVM
1. 你知道哪些或者你们线上使⽤用什什么GC策略略? 它有什什么优势,适⽤用于什什么
场景?

GC 策略

  • Serial收集器 一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。 特点:CPU利用率最高,停顿时间即用户等待时间比较长。 适用场景:小型应用 通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

  • Parallel收集器 采用多线程来通过扫描并压缩堆 特点:停顿时间短,回收效率高,对吞吐量要求高。 适用场景:大型应用,科学计算,大规模数据采集等。 通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

  • CMS收集器 采用“标记-清除”算法实现,使用多线程的算法去扫描堆,对发现未使用的对象进行回收。 (1)初始标记 (2)并发标记 (3)并发预处理 (4)重新标记 (5)并发清除 (6)并发重置 特点:响应时间优先,减少垃圾收集停顿时间 适应场景:服务器、电信领域等。 通过JVM参数 -XX:+UseConcMarkSweepGC设置

  • G1收集器 在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。 特点:支持很大的堆,高吞吐量 --支持多CPU和垃圾回收线程 --在主线程暂停的情况下,使用并行收集 --在主线程运行的情况下,使用并发收集 实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收 通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

GC的选择

官方推荐,需要根据应用的实际情况进行选择。在选择之前必须要对应用的堆大小、收集频率进行估算。

使用SerialGC的场景:
1、如果应用的堆大小在100MB以内。
2、如果应用在一个单核单线程的服务器上面,并且对应用暂停的时间无需求。
使用ParallelGC的场景:
如果需要应用在高峰期有较好的性能,但是对应用停顿时间无高要求(比如:停顿1s甚至更长)。
使用G1、CMS场景:
1、对应用的延迟有很高的要求。
2、如果内存大于6G请使用G1。


2. JAVA类加载器器包括⼏几种?它们之间的⽗父⼦子关系是怎么样的?双亲委派机
制是什什么意思?有什什么好处?
3. 如何⾃自定义⼀一个类加载器器?你使⽤用过哪些或者你在什什么场景下需要⼀一个⾃自
定义的类加载器器吗?
4. 堆内存设置的参数是什什么?
5. Perm Space中保存什什么数据? 会引起OutOfMemory吗?
6. 做gc时,⼀一个对象在内存各个Space中被移动的顺序是什什么?
7. 你有没有遇到过OutOfMemory问题?你是怎么来处理理这个问题的?处理理
过程中有哪些收获?
8. 1.8之后Perm Space有哪些变动? MetaSpace⼤大⼩小默认是⽆无限的么? 还是
你们会通过什什么⽅方式来指定⼤大⼩小?
9. Jstack是⼲干什什么的? Jstat呢? 如果线上程序周期性地出现卡顿,你怀疑可
能是gc导致的,你会怎么来排查这个问题?线程⽇日志⼀一般你会看其中的什什么
部分?
10. StackOverFlow异常有没有遇到过?⼀一般你猜测会在什什么情况下被触
发?如何指定⼀一个线程的堆栈⼤大⼩小?⼀一般你们写多少?
Linux命令
1. ⽇日志特别⼤大只想看最后100⾏行行怎么弄弄? 如果想⼀一直看⽇日志的持续输出,⽤用
什什么命令?
2. 如果⽇日志⼀一边输出,⼀一边想实时看到有没有某个关键字应该怎么弄弄?
3. grep如果忽略略⼤大⼩小写应该怎么弄弄? 正则表达式呢?
4. vim往下⼀一⾏行行是什什么键?往下30⾏行行呢? 跳到⽂文件末尾⼀一⾏行行是什什么? 跳回来
是什什么? 向后搜索是什什么?
5. 如果有个⽂文本⽂文件,按空格作为列列的分隔符,如果想统计第三列列⾥里里⾯面的每
个单词的出现次数应该怎么弄弄?
6. 如果把上⾯面的出现次数排个序应该怎么弄弄? 想按照数字本身的顺序⽽而不不是
字符串串的顺序排列列怎么弄弄?
7. Linux环境变量量是以什什么作为分隔符的?环境变量量通过什什么命令设置?
8. 给某个⽂文件权设置限⽐比如设置为644 是⽤用什什么命令?这个6是什什么意思?
9. Linux下⾯面如果想看某个进程的资源占⽤用情况是怎么看的?系统load⼤大概
指的什什么意思?你们线上系统load⼀一般多少?如果⼀一个4核机器器,你认为多
少load是⽐比较正常的?top命令⾥里里⾯面按⼀一下1会发⽣生什什么?
10. top命令⾥里里⾯面,有时候所有进程的CPU使⽤用率加起来超过100%是怎么回
事?
11. 还有哪些查看系统性能或者供你发现问题的命令?你⼀一般是看哪个参
数?
12. 想看某个进程打开了了哪些⽹网络连接是什什么命令?⾥里里⾯面连接的状态你⽐比较
关⼼心哪⼏几种?
-- 偏题
1. 有没有做过Linux系统参数⽅方⾯面的优化,⼤大概优化过什什么?
2. 系统参数⾥里里⾯面有个叫做backlog的可以⽤用来⼲干什什么?
3. 查看⽹网络连接发现好多TIME_WAIT 可能是什什么原因?对你的应⽤用会有什什
么影响?你会选择什什么样的⽅方式来减少这些TIME_WAIT
4. 可否介绍⼀一下TCP三次握⼿手的过程,如果现在有个⽹网络程序,你⽤用第三⽅方
的library来发送数据,你怀疑这个library发送的数据有问题,那么怎么来验
证?tcpdump导出的⽂文件你⼀一般是怎么分析的?
5. KeepAlive是⽤用来⼲干什什么的?这样的好处是什什么?
Redis
-- 开发
1. 缓存穿透可以介绍⼀一下么?你认为应该如何解决这个问题
2. 你是怎么触发缓存更更新的?(⽐比如设置超时时间(被动⽅方式), ⽐比如更更新的时
候主动update)?如果是被动的⽅方式如何控制多个⼊入⼝口同时触发某个缓存更更
新?
3. 你们⽤用Redis来做什什么?为什什么不不⽤用其他的KV存储例例如Memcached,
Cassandra等?
4. 你们⽤用什什么Redis客户端? Redis⾼高性能的原因⼤大概可以讲⼀一些?
5. 你熟悉哪些Redis的数据结构? zset是⼲干什什么的? 和set有什什么区别?

redis五种数据类型:String,Hash,List,Set,ZSet

zset 相比set多了一个排序


6. Redis的hash, 存储和获取的具体命令叫什什么名字?
7. LPOP和BLPOP的区别?
8. Redis的有⼀一些包含SCAN关键字的命令是⼲干嘛的? SCAN返回的数据量量是
固定的吗?
9. Redis中的Lua有没有使⽤用过? 可以⽤用来做什什么? 为什什么可以这么⽤用?
10. Redis的Pipeline是⽤用来⼲干什什么的?
-- 运维
11. Redis持久化⼤大概有⼏几种⽅方式? aof和rdb的区别是什什么? AOF有什什么优缺
点吗?
12. Redis Replication的⼤大致流程是什什么? bgsave这个命令的执⾏行行过程?
-- 偏题
13. 如果有很多 KV数据要存储到Redis, 但是内存不不⾜足, 通过什什么⽅方式可以缩
减内存? 为什什么这样可以缩⼩小内存?
14. Redis中List, HashTable都⽤用到了了ZipList, 为什什么会选择它?
监控、稳定性
1. 业务⽇日志是通过什什么⽅方式来收集的?
2. 线上机器器如何监控?采⽤用什什么开源产品或者⾃自研的产品?它是分钟级的还
是秒级的?
3. 如果让你来想办法收集⼀一个JAVA后端应⽤用的性能数据,你会在意哪些⽅方
⾯面? 你会选择什什么样的⼯工具、思路路来收集?
4. ⼀一般你调⽤用第三⽅方的时候会不不会监控调⽤用情况?

依赖的jar包:

jackson-core-asl-1.8.7.jar   

jackson-mapper-asl-1.8.7.jar

 

 

复制代码
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.9.13</version>
</dependency>
复制代码

 

 

第一种方式:(ResponseEnity)

使用ResponseEnity

复制代码
@Controller
public class JSONController {
   @RequestMapping(value={"/{name}"}, method=RequestMethod.GET)
   public ResponseEntity<Shop> hello(@PathVariable String name) {
       Shop shop = new Shop();
       shop.setName(name);
       shop.setStaffName(new String[]{"zwh1","zwh2"});
       return new ResponseEntity<Shop>(shop,HttpStatus.OK);
   }
}
复制代码

输出Json: {"name":"zzz","staffName":["zwh1","zwh2"]}

第二种方式:(@ResponseBody)

使用@ResponseBody

复制代码
@Controller
public class JSONController {
   @RequestMapping(value={"/{name}"}, method=RequestMethod.GET)
   public @ResponseBody Shop hello(@PathVariable String name) {
       Shop shop = new Shop();
       shop.setName(name);
       shop.setStaffName(new String[]{"zwh1","zwh2"});
       return shop;
   }
}
复制代码

 

 输出Json: {"name":"zzz","staffName":["zwh1","zwh2"]}

猜你喜欢

转载自www.cnblogs.com/xsg0011/p/9158033.html