牛客网刷题(纯java题型 151~180题)

243 阅读4分钟

static方法是属于类的方法,可以在类没有实例化的时候调用,而如果类没有实例化,就不存在此类的对象.this是指调用方法的类的实例对象,此时还不存在类的实例对象,所以不能在static方法中使用this

JSP一共有九大内置对象:
request,response,
session , application , pageContext,
page, out,
exception,
config

类加载机制和顺序:
1,因为main方法位于class B的内部,所以想要执行main方法,首先要先加载B的class文件
2,加载B的class文件,会先执行B的静态域初始化(静态域包括静态变量和静态块),静态变量和静态块的执行顺序是根据其在源代码中的顺序决定的,本题中,静态变量执行优先于静态块的执行
3,在执行public static B t1 = new B();的时候,因为需要执行new B()对t1进行初始化,所以会再次加载B的class文件,而此次加载,JVM会认为是B的class文件的第二次加载了,不属于首次加载,所以在执行new B()的时候,不会在执行静态域了,因此,按照(静态域->普通代码块->构造方法)顺序,会执行普通代码块和构造方法,输出构造块
4,执行t2的初始化,也就是new B(),与上面第3点相同,输出"构造块"
5,回到第一次类加载,继续进行静态域执行,也就是执行static块,此时,输出"静态块"
6,执行main方法中的new B(),此时不会再执行静态域初始化了,而是只会执行普通代码块+构造方法,也就是输出"构造块"
7,最终输出的结果应该为: 构造块,构造块,静态块,构造块

servlet处于服务器进程中,以多线程的方式运行service方法,一个实例可以服务多个请求,实例一般不会销毁
CGI对每一个请求产生新的进程,服务返回就销毁,且一个进程只能服务于一个用户,造成很大的开销,效率上低于servlet
CGI是传统技术,不具有平台无关性,而servlet使用java编写,具有平台无关性

正确答案为: -128,127
本题涉及到基本类型的封装类型的特殊性质,以及按值传递,和按引用传递
首先需要知道,byte的取值范围为-128~127, 且127 + 1 = -128
Byte a = 127 会发生自动装箱
1, add(++a)
首先可以明确的是,向add()中传递的Byte的value一定是-128,且这个-128是一个新生成的Byte对象,a不指向这个新生成的对象,a仍然只向原有的对象(这个是基本类型包装类的特殊性质,发生改变,就新构造一个对象)
2,进入到add()方法中,b = b++;
执行b = b++的时候,b仍然指向-128这个对象,b++会新生成一个Byte(-127),但是没有被b引用

CopyOnWriteArrayList在每次add元素的时候,都会将就数组复制一份,然后再将新的元素添加在新数组的末尾,这样造成了CopyOnWriteArrayList写的效率低,所以,CopyOnWriteArrayList适合读多写少的情况,而不适合读少写多的情况

ReadWriteLock是读写锁, 写与写之间互斥,读与写之间互斥,适用于读多写少的场景
ConcurrentHashMap的写put()是加锁的,读get()是不加锁的

jdk 8中, interface中可以出现static修饰的方法和default修饰的方法(都有方法体)
但是,static修饰的方法,在实现类中,只能通过接口.static方法来引用,default方法,只能通过实现类对象来引用
接口中的方法,默认使用public abstract方法来修饰
接口中的字段,默认使用public static final 来修饰

对java扩展方法没有了解

servlet在部署到服务器进行初始化的时候,就会进行init(),当接收到用户请求的时候,调用的时service()方法,不是init()

形参中,唯一可用的修饰符就是final
根据评论,说一般情况下,一个方法的形参不用final修饰。只有在特殊情况下,那就是:方法内部类。一个方法内的内部类如果使用了这个方法的参数或者局部变量的话,这个参数或局部变量应该是final。
这一点,还没有弄明白