根据牛客上网易面试贴整理的,Java后台开发面经

根据牛客上网易面试贴整理的Java后台开发面经,奈何简历直接挂……贡献给需要的同学,希望有所帮助,大家加油~

1.Map怎样获取Key,判断是否包含Key,哪些实现了Map接口

Map.keySet(),map.entrySet(),map.values();

map.containsKey(),map.containsValue();

hashMap,TreeMap;

2.Java反射访问私有属性

field[i].setAccessible(true);

methods[i].setAccessible(true);

3.使用过java.util.concurrent包下的哪些类,使用场景等

Locks部分:Lock接口实现类ReentrantLock

ReadWriteLock接口实现类ReentrantReadWriteLock

Atomic部分

Executor部分:Future,futuretask,executor,

Collections部分:BolckingQueue,BlockingDeque,ConcurrentMap

Tools部分:countdown latch,cyclicbarrier,symphone

4.Volatile的应用场景

保证线程间的可见性,不具有原子性

5.Synchronized和ReentrantLock实现原理

Synchronized在代码块的开始和接收插入monitorenter和monitorexit指令,需要获取对象的锁,

6.创建线程的3种方式

1) 继承Thread类,重写run方法

2) 实现Runnable接口,重写run方法,创建Runnable实例,传入Thread类构造函数

3) 使用Callable和Future,call方法有返回值,可以抛异常;创建callable接口的实现类并实现call方法,使用FutureTask包装Callabe接口,然后传入Thread类构造函数,FutureTask.get()返回callable的call方法的返回值

7.线程池的参数,实现原理,有哪些RejectedExecutionHandler,分别对应的使用场景

线程池种类:newCachedThreadPool可缓存线程池,线程最大并发数不可控制

newFixedThreadPool定长线程池,可控制线程最大并发数

newScheduledThreadPool 定长线程池,支持定时及周期性任务执行

newSingleThreadExecutor 单线程化的线程池

ThreadPoolExecutor(int corePoolSize,   //线程池的核心线程数

Int maximumPoolSize, //线程池所能容纳的最大线程数

Long keepAliveTime,  //非核心线程闲置时的超时时长

TimeUnit Unit,  //keepAliveTime的时间单位

BlockingQueue<Runnable> workQueue, //线程池中的任务队列

ThreadFactory threadFactory, //线程工厂

RejectedExecutionHandler handler  //拒绝任务的处理策略)

四种拒绝策略:

AbortPolicy:直接抛出异常

CallerRunsPolicy:会调用当前线程池所在的线程去执行被拒绝的任务,缺点是会阻塞主线程

DiscardPolicy:直接丢弃

DiscardOldestPolicy:丢弃任务队列中最先加入队列的,再把这个新任务添加进去。

重点讲解:

其中比较容易让人误解的是:corePoolSize,maximumPoolSize,workQueue之间关系。

1)当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

2)当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行

3)当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务

4)当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理

5)当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

6)当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

8.同步异步,阻塞非阻塞区别

CPU发出I/O操作的通知,然后文件系统或其他驱动程序会调用相关设备执行这些操作,最后当数据到达用户空间后发出一个中断的完成标志,在这个从CPU发出调用到收到完成标志的过程存在一个时间差,同步和异步针对完成标志,阻塞和非阻塞针对时间差。

同步与异步:获取完成标志的方式,如果采用轮询的方式监测I/O操作是否完成称为同步,如果通过回调通知的方式获得完成标志称为异步。

阻塞与非阻塞:在等待完成标志的时间差内,如果CPU没有处理别的事情则称为阻塞,如果CPU处理了别的事情则称为非阻塞。

9.Aqs锁机制,java内存模型可见性

10.什么时候需要打破双亲委派模型

父加载器需要加载自加载器的类

11.GC的目的,serverclient的区别

低停顿,高吞吐

12.Cglib无法增强的类

生成被***类的子类,不能为声明为final的方法进行***

13.Spring容器的启动过程


14.Spring bean的生命周期

1)Bean的建立,寻找bean的定义信息并将其实例化

2)属性注入

3)BeanNameAware接口的setBeanName()

如果实现BeanNameAware接口,调用setBeanName(String beanName)方法传递BeanID

4)BeanFactoryAware接口的setBeanFactory

如果实现BeanFactoryAware接口,调用setBeanFactory(BeanFactory beanFactory)方法传入工厂,可用beanFactory.getBean(beanName)方法获取Bean

5)如果有BeanPostProcessorBean关联,将调用postProcessBeforeInitialization()方法

6)如果Bean类实现InitializingBean接口,调用afterProPertiesSet()方法

7)Bean定义文件中定义init-method方法

8)如果有BeanPostProcessorBean关联,将调用ProcessAfterInitialization()方法

9)DisposableBean接口的destroy()

10)Bean定义文件中的destroy-method方法

15.Spring aop功能的主要流程

应用场景:

具有横切逻辑的应用:如性能监测,访问控制,事务管理,日志记录

3种实现方式

1)基于***

a)创建通知,实现几个接口,实现其中的方法,主要有

在目标方法执行前实施增强:MethodBeforeAdvice

在目标方法执行后实施增强:AfterReturningAdvice

在目标方法执行前后实施增强:MethodInterceptor

在方法抛出异常后实施增强:ThrowsAdvice

b)定义切点和通知者,在Spring配置文件中配置这些信息

c)使用ProxyFactoryBean来生成***

具体做法:

Spring配置中:

bean id="humanProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target" ref="human"/>

<property name="interceptorNames" value="sleepHelperAdvisor" />

<property name="proxyInterfaces"

value="test.spring.aop.bean.Sleepable" />
</bean>

ProxyFactoryBean是一个***,我们可以把它转换为proxyInterfaces中指定的实现该interface的***对象

2)@AspectJ注解的切面

@Aspect

public class SleepHelper {

public SleepHelper(){

}

@Pointcut("execution(* *.sleep())")

public void sleeppoint(){}

@Before("sleeppoint()")

public void beforeSleep(){

System.out.println("睡觉前!");

}


@AfterReturning("sleeppoint()")

public void afterSleep(){

System.out.println("睡醒了!");

}

}

Spring配置中添加Aopxml命名空间和声明相关schema命名空间

xmlns:aop="http://www.springframework.org/schema/aop"

schema声明:

http://www.springframework.org/schema/aop

然后加上这个标签:<aop:aspectj-autoproxy/> 有了这个Spring就能够自动扫描被@Aspect标注的切面了

3) 纯POJO切面

修改Spring配置文件,加入aop配置

<aop:config>

<aop:aspect ref="sleepHelper">

<aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>

<aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>

</aop:aspect>

</aop:config>

16.数据库可重复读的实现


17.数据库锁粒度大会引发什么问题

锁粒度分为行锁、页锁、表锁;锁粒度大并发性低,开销小;锁粒度小并发性高,开销大。

18.***模式和适配器模式的UML·类图


19.分布式锁,数据库、rediszookeeper3种实现

基于数据库:

创建一张表,表中包含方法名等字段,在方法名字段上创建唯一索引,想要执行某个方法时,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。

关于一些问题的解决方法:

数据库单点?搞两个数据库,数据库之间双向同步

没有失效时间?做一个定时任务,每隔一定时间把数据库中的超时数据清理一遍

非租塞的?使用一个while循环,直到insert成功后再返回成功

非重入?在数据库表中添加字段,记录当前获得锁的机器的主机信息和线程信息

Zookeeper:

1)客户端连接zookeeper,并在/lock下创建临时的且有序的子节点,第一个客户端对应的子节点为/lock/lock-0000000000,第二个为/lock/lock-0000000001,以此类推;

2)客户端获取/lock下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知后重复此步骤直至获得锁;

3)执行业务代码;

4)完成业务流程后,删除对应的子节点释放锁。

Redis:

1) 获取锁的时候使用setnx(如果数据库没有这个key,插入成功返回1,否则返回0)加锁,并使用expire命令为锁添加一个超时时间,超过该时间自动释放锁,锁的value值为一个随机生成的uuid,通过这个在释放锁的时候进行判断

2) 获取锁的时候可以设置一个获取锁的超时时间,超过这个时间则放弃获取锁

3) 释放锁的时候,通过uuid判断是不是该锁,如果是,则执行delete释放锁

20.分布式事务,xa


21.判断是不是后序遍历?

判断分界点然后分治

22.如何查看80端口的连接情况

Windows: netstat -ano | findstr 80查看端口占用,-a显示所有连接和侦听端口,-n以数字形式显示地址和端口号,-o显示拥有的与每个连接关联的进程id

tasklist | findstr 80 查看pid对应的进程

Linux: lsof -I 80 root权限执行, netstat -tunlp | grep 80

23.Linux软链接和硬链接

ln -s [源文件或目录] [目标文件或目录] 软链接:1、路径形式存在,类似快捷方式,2、可以跨文件系统,3、可以对一个不存在的文件名进行链接,4、可以对目录进行链接,5、文件数据块中存放另一文件的路径名的指向,有自己的inode和用户数据块


ln -s [源文件或目录] [目标文件或目录] 硬链接:1、以文件副本形式存在,但是不占用实际空间2、不予许给目录创建硬链接,防止出现目录环3、不能跨文件系统4、和源文件有相同的inode和数据块,只能对已存在的文件创建

24. Mybatis怎样把数据库字段和pojo的属性属性映射起来

1)配置属性,开启驼峰命名法

2)Xml映射文件中的resultMap

25.redis pipeline,限流

pipeline批处理,将多个命令打包发送到服务器执行,执行结果打包后一起返回,client执行pipeline时独占连接,此期间不能进行非管道类型的其他操作,可以为pipeline新建client连接。

定义两个key1个时间,1个调用次数

限流算法 :令牌桶(放入令牌的速率恒定,允许突发流量)和漏桶(流出的速率恒定,平滑流量)

26.java本身序列化的问题

序列化数据结果比较大,传输效率低;不能跨语言

27.秒杀系统的实现

https://blog.csdn.net/CSDN_Terence/article/details/77744042

28.如何判断SQL查询操作是不是慢sql,如何优化

1) MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句

1, slow_query_log 这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。

2,long_query_time 当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。 3,slow_query_log_file 记录日志的文件名。 4,log_queries_not_using_indexes 这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。

2) explain来了解SQL执行的状态 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上explain就可以了: 例如:explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释,type是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

29. 单列索引和复合索引

多个单列索引在多条件查询时,只会生效第一个索引;

复合索引对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用仅对后面的任意列执行搜索时,复合索引则没有用处

30.rpc原理,为什么使用http,和直接的http有什么区别

rpc远程过程调用协议,包括传输协议和编码协议,是对服务的封装,对服务的可用性和效率做了优化
#网易##面经##秋招##Java工程师#
全部评论
收藏
点赞 回复
分享
发布于 2018-09-09 15:58
牛逼,楼主有心了
点赞 回复
分享
发布于 2018-09-09 16:01
联易融
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
转发
点赞 112 评论
分享
牛客网
牛客企业服务