美文网首页java学习
Java面试踩坑集锦

Java面试踩坑集锦

作者: 馒头的战斗 | 来源:发表于2018-05-16 18:02 被阅读181次

1.Java线程有几种状态,分别是什么?

线程的状态定义在java.lang.Thread.State下有一个eum类,其中定义了线程的6种状态:

new:线程尚未启动

runnable:线程运行中

blocked:多个线程有同步操作的场景,如正在等待synchronize释放等

waiting:线程拥有了某个锁之后,调用了他的wait方法,等待其他线程调用notify

(blocked和wating都是等待,不同的是,blocked是在临界点之外等待,而wating是在临界点内wait等待notify唤醒)

timed_waiting:有时间限制的waiting,调用了wait(long),join(long)等

terminated:执行结束的线程

2.介绍一下MySQL的四种事务隔离级别?(这个我绝对看过NNNN多遍.....感觉大佬不会问这种问题吧...就没有认真记...结果悲剧了)

read uncommitted(读未提交):会产生脏读、幻读、不可重复读的问题,既,会读取到还未commit的数据

read committed(读其他事务提交的数据):当前会话可以读取到其他事务提交后的数据,避免脏读,但会产生产生不可重复读、幻读的后果

repeatable read(可重复读)-MySql默认隔离级别:在同一个事务中,查询出的结果总是一致的(解决了脏读、不可重复读的问题),会产生幻读的问题(在其他会话中插入的数据,当前会话查询不出结果,但是进行数据操作时,可能报错)

serializable(串行化):一个事务对数据进行操作时,另一个事物在进入操作该数据,事物会被挂起(有超时时间),等待前一个事务的完成,在进行当前事务的操作(性能较差)(也就是数据库不存在并发访问的情况,都去排队依次执行)

(脏读:读到其他事物未提交的数据,如果这些数据回滚,这次读到的数据就是无效的;不可重复读:一个事务中,读到其他事务提交后的数据,导致查询结果不一致;幻读:同一事物中,查询结果一致,但其他事物提交了数据,当前事务没有读取到,当前事务再进行数据操作,会产生主键冲突等报错。)

3.Spring的事务?

事务四大特性:ACID,原子性、一致性、隔离性、持久性

Spring中为事务管理提供了三个接口:

PlatformTransactionManager:事务管理器(Spring定义了一个顶级的事务管理接口类,具体实现由各ORM框架负责,比如常用的DataSourceTransactionManager)

TransactionDefinition:事务定义信息(隔离级别、传播行为、只读、超时)

TransactionStatus:事务运行状态

事务的传播行为 红色重点

4.AtomicInteger和加了volatile的Integer有什么区别?

这道题核心还是在考察多线程环境当中变量的安全性。众所周知,AtomicInteger利用CAS原理,保证了多线程环境当中变量的安全。但是,用volatile修饰的Integer却不一定是线程安全的。虽然volatile保证了各个线程在取出volatile修饰的变量时都能拿到最新的值,但是,当各个线程去向volatile变量进行写操作的时候(比如++),会存在一种情况,比如volatile Integer i=1;此时,A、B两个线程同时取到i,都进行++的操作,此时由于CPU时间分片的问题,可能A首先写入,i变成了2,B再向i写入的时候,期望i=1->2。但实际情况,并不是这样。所以volatile并不能保证绝对的线程安全。

5.kafka的权重优先级配置?

6.hashmap的contains方法?

根据key的hash值和key获取对应的节点;

调用getNode方法,首先检测hash表是否为空或key对应的桶是否为空,不为空,就去判断下面的节点,是什么样的数据结构,如果是红黑树就遍历树取出节点,如果为链表就遍历链表。

7.过滤器、监听器、拦截器各自的作用?

过滤器(Filter):

作用:过滤所有web请求,基于servlet。

应用:设置统一编码、过滤掉非法字符等。

实现:实现Filter接口,接口中有三个方法init(filterConfig)、doFilter(request,response,filterChain)、destroy。web容器启动时,会调用init方法初始化一个filter对象实例,请求进入后,调用doFilter在调用方法前后执行操作,结束后,调用filterChain对象,执行下一个过滤器。filterConfig可以获取到拦截器的各种属性(filter名、各种参数等)。

监听器(Listener):

作用:做一些初始化的操作,设置一些基本参数或者固定对象等。基于servlet。

应用:统计当前在线人数。

实现:实现ServletContextListener接口,接口中有两个方法,contextInitialized(ServletContextEvent);contextDestroyed(ServletContextEvent);一个初始化,一个销毁。

拦截器(Interceptor):

作用:类似于AOP,在某个controller方法前后执行。基于反射机制,JDK的动态代理实现的。它依赖于具体的接口,使用时动态的生成字节码。

应用:可以用于角色、权限认证。

实现:Spring的拦截器,实现HandlerInterceptorAdapter接口,preHandle(request,reponse,objectHandle)、postHandle(request,reponse,objectHandle,modelAndView)、afterCompletion(request,reponse,objectHandle,exception)。preHandle在执行方法前调用,postHandle在执行方法后调用,afterCompletion在dispatcherServlet完全处理完请求后被调用,常用于销毁资源。

8.跨域常用解决方案?

9.说一下java中的GC?

JVM内存区域模型

JVM总体分为堆和非堆两个区域。堆是给开发者使用的,非堆部分主要是给JVM自己使用的。

(1).方法区(包括运行时常量池):用于保存JVM加载类的信息、常量、静态变量,是各个线程共享的内存区域。

运行时常量池:

(2).虚拟机栈:每个方法执行的时候,会创建一个“栈帧”。用于存储局部变量表、操作栈、方法出口信息。每个方法从被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。(局部变量表中保存着8种基本数据类型和对象的引用(指针,并非对象本身))。

(3).本地方法栈:运行Native方法。

(4).堆:JVM所管理的最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。该区域存放了对象的实例、数组(所有new的对象)。-Xms(最小值)-Xmx(最大值),通常将两个值调整为一样大小(避免运行时频繁调整Heap大小)。

堆分为新生代和老年代,新生代又由Eden Space和两块相同大小的Survivor Space组成。程序新创建的对象都从新生代分配内存,老年代用于存放进行多次GC仍然存活的对象。新建的对象也可能直接进入老年代①:可以通过启动参数设置-XX:PretenureSizeThreshold=1024,超过多大就直接在老年代分配,②:大的数组对象。

(5).程序计数器:最小的一块内存区域,作用是当前线程执行字节码的信号指示器,在程序执行过程中,就是通过计数器实现分支、循环、异常处理、线程恢复等工作。

为了便于垃圾回收,堆分为三个区域,新生代,老年代,持久代。

10.索引失效的原因,及解决方案?

11.什么情况下会发生死锁,怎么避免死锁?

产生死锁四个条件:

互斥条件:一段时间内某资源只由一个进程占用

请求和保持条件:请求进程已经占用了某资源,此时,继续请求其他资源,但资源被其他进程占用,此时,进程被阻塞。

不剥夺条件:资源不能被外部进程剥夺,只能由自己释放

环路等待条件:多个资源相互等待

避免死锁的三种方案:

1.注意加锁顺序(避免环路等待)

2.加锁时限,加上请求锁的timeout时间

3.死锁检测

12.http和https的区别?

13.hashcode和equals?

14.常用的Linux命令(赋予某个用户权限)?

找到/etc/sudoers文件修改其中用户对应的权限。

15.http协议,请求头,响应头等。

请求头:Accept(文档格式): text/html,application/xhtml+xml,application/xml;

Accept-Encoding(压缩格式): gzip, deflate

Accept-Language(语言): zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;

Connection(连接方式): keep-alive

Cookie:

 Host(主机地址): list.tmall.comReferer: https://list.tmall.com/search_product.htm

Upgrade-Insecure-Requests(客户端类型): 1User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0

响应头:

(状态码)HTTP/2.0 200 OK

content-encoding(压缩格式): gzip

content-language(语言、编码格式): zh-CNcontent-type: text/html;charset=GBK

date(日期): Thu, 24 May 2018 13:24:13 GMT

server: Tengine/Aserver

strict-transport-security: max-age=0

timing-allow-origin: *

ufe-result: A6

vary: Accept-Encoding

X-Firefox-Spdy: h2

16.常用算法?

17.常用设计模式?

18.Nginx的特点?

一个master进程管理,多个worker进程工作;

动静态资源,分开请求,加快相应速度;

使用异步非阻塞的事件处理机制;

正向代理;反向代理;负载均衡;邮件服务器;

19.TCP三次握手?

20.springboot特有注解?

21.restful注解?

@restcontroller

@getmapping、@putmapping、@deletemapping、@postmapping

22.自定义注解?

用@interface声明一个自定义注解;JDK中自带三个原生(Override(重写)、Deprecated(方法过期)、SuppressWarnings(压制警告));JDK中提供四个元注解:(Documented(表明此注解的类可以被JavaDoc文档化)、Inherited(指明该注解类型被自动继承)、Retention(指明在什么级别显示此注解)、Target(该注解的适用范围))

Retention参数:

RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃

RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略

RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中

Target参数:

ElementType.TYPE 用于类,接口,枚举但不能是注解

ElementType.FIELD 作用于字段,包含枚举值

ElementType.METHOD 作用于方法,不包含构造方法

ElementType.PARAMETER 作用于方法的参数

ElementType.CONSTRUCTOR 作用于构造方法

ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句

ElementType.ANNOTATION_TYPE 作用于注解

ElementType.PACKAGE 作用于包

23.二叉树、红黑树的特点?

24.JDK1.7和JDK1.8的区别?

①:Lambda表达式;②:interface的方法,加上default,就有了默认的实现方法,有方法体;

③:内置了 Base64 编码的编码器和解码器;④:新增Stream API

25.lambda表达式性能问题?

26.mysql中的左、右、内、外连接?

内连接(inner join):相等连接-自然连接-交叉连接(CROSSJOIN)

外连接:左外连接-右外连接-全连接

27.接口和抽象类的区别?

抽象程度:抽象类->接口->普通类

①:抽象类和接口都不能被直接实例化,如果二者要实例化,就涉及到多态。

②:接口里面只能对方法进行声明,抽象类既可以对方法进行声明也可以对方法进行实现。

③:抽象类里面可以没有抽象方法。

④:如果一个类里面有抽象方法,那么这个类一定是抽象类。

⑤:抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。当你关注事物的本质的时候,请用抽象类;当你关注一种操作的时候,用接口。

28.Java的强、软、弱、虚引用?

引用强度排列四种Java引用类型:强引用->软引用->弱引用->虚引用;

强引用:用new来创建一个新对象的引用就是强引用,强引用在程序内存不足(OOM)的时候也不会被回收

软引用:相当于缓存,在内存不够时,会回收软引用的对象。创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象。

弱引用:弱引用就是只要JVM垃圾回收器发现了它,就会将之回收,使用方式

虚引用:虚引用存在的唯一作用就是当它指向的对象被回收后,虚引用本身会被加入到引用队列中(ReferenceQueue),用作记录它指向的对象已被回收。

29.Spring常用注解?

@PathVariable:取出URI中的参数

@requestParam:获取参数,类似于request.getparamter();

@Component:将一个bean交给spring管理

由于简书官方不知为何,三番五次封我账号。此博客所有内容将转到Github上继续更新,欢迎关注。https://github.com/g453030291/java-interview

相关文章

  • Java面试踩坑集锦

    1.Java线程有几种状态,分别是什么? 线程的状态定义在java.lang.Thread.State下有一个eu...

  • Collection

    参考地址:Java集合常见面试题集锦Java集合必会14问(精选面试题整理) Java中Collection和Co...

  • 2022最新JAVA学习路线(附面试题)

    在 Java 学习这条路上也踩过无数次的坑,秋招也幸运的拿到了一些大厂 Java 开发的offer。 (文末附面试...

  • ZSL踩坑集锦

    rt

  • React踩坑集锦

    组件名首字母没有大写 没有导入react相关的包 script标签的type没有写成text/babel crea...

  • mysql踩坑集锦

    1.round函数的四舍五入 1.1问题解决 今天在导出报表时,发现有个字段金额的值为 501.429900000...

  • Flutter踩坑集锦

    开发环境: Ubuntu 18.04.1 LTS Could not resolve all files for ...

  • BigDecimal踩坑集锦

    BigDecimal在Java编程中,非常实用,在算钱的时候,哪怕精度丢了一丢丢都让人头疼,所以一般我们不采用fl...

  • 【集合框架】

    集合框架(怎么实现、适用场景) hash相关 Java集合框架 Java集合框架综述Java集合框架面试问题集锦 ...

  • Java面试集锦

    1. 引用传递的问题(记住java里面是没有指针的,只有值拷贝和引用拷贝) 引用拷贝拷贝的实际是地址,当引用传递过...

网友评论

本文标题:Java面试踩坑集锦

本文链接:https://www.haomeiwen.com/subject/hccmdftx.html