大家好,又见面了,我是你们的朋友全栈君。
今天依然讲解Java高级题型面试试题与答案解析。
short s1 = 1; s1 = s1 1;有错吗?short s1 = 1; s1 = 1;有错吗?
对于short s1 = 1; s1 = s1 1;由于1是int类型,因此s1 1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 = 1;可以正确编译,因为s1 = 1;相当于s1 = (short)(s1 1);其中有隐含的强制类型转换。
如何实现对象克隆?
1.实现Cloneable接口并重写Object类中的clone()方法;
2. 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
唤醒一个阻塞的线程
如因为Sleep,wait,join等阻塞,可以使用interrupted exception异常唤醒。
说说NIO和IO的区别
1.NIO少了一次从内核空间到用户空间的拷贝。ByteBuffer.allocateDirect()分配的内存使用的是本机内存而不是Java堆上的内存,和网络或者磁盘交互都在操作系统的内核空间中发生。allocateDirect()的区别在于这块内存不由java堆管理, 但仍然在同一用户进程内;
2.NIO以块处理数据,IO以流处理数据;
3.非阻塞,NIO一个线程可以管理多个输入输出通道。
Java NIO与IO区别
Java中的NIO,BIO,AIO分别是什么?
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
1.BIO,同步阻塞式IO,简单理解:一个连接一个线程。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝。即:一个连接,要求Server对应一个处理线程。
2.NIO,同步非阻塞IO,简单理解:一个请求一个线程。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。
3.AIO,异步非阻塞IO,简单理解:一个有效请求一个线程。AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
什么是幂等性
所谓幂等,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。那么我们为什么需要接口具有幂等性呢?设想一下以下情形:在App中下订单的时候,点击确认之后,没反应,就又点击了几次。在这种情况下,如果无法保证该接口的幂等性,那么将会出现重复下单问题。
在接收消息的时候,消息推送重复。如果处理消息的接口无法保证幂等,那么重复消费消息产生的影响可能会非常大。
终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?
1.线程正常执行完毕,正常结束;
2.监视某些条件,结束线程的不间断运行;
3.使用interrupt方法终止线程。在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是说在同一时刻只能由一个线程来修改exit的值。
Java新生代,老年代,持久代,都存储哪些东西?
新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。持久代主要存放的是Java类的类信息。
更多精彩佳文,请关注作者!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141789.html原文链接:https://javaforall.cn