---------------在牛客刷了一份笔试题,整理了一些知识点---------------
1、java 4种引用类型
强引用:我们平日里面的用到的new了一个对象就是强引用,例如 Object obj = new Object();当JVM的内存空间不足时,宁愿抛出OutOfMemoryError使得程序异常终止也不愿意回收具有强引用的存活着的对象!记住是存活着,不可能是你new一个对象就永远不会被GC回收。当一个普通对象没有其他引用关系,只要超过了引用的作用域或者显示的将引用赋值为null时,你的对象就表明不是存活着,这样就会可以被GC回收了。当然回收的时间是不一定的具体得看GC回收策略。
软引用:软引用的生命周期比强引用短一些。软引用是通过SoftReference类实现的。 这样就是一个简单的软引用使用方法。通过get()方法获取对象。当JVM认为内存空间不足时,就回去试图回收软引用指向的对象,也就是说在JVM抛出OutOfMemoryError之前,会去清理软引用对象。软引用可以与引用队列(ReferenceQueue)联合使用。 当softObj软引用的obj被GC回收之后,softObj 对象就会被塞到queue中,之后我们可以通过这个队列的poll()来检查你关心的对象是否被回收了,如果队列为空,就返回一个null。反之就返回软引用对象也就是softObj。软引用一般用来实现内存敏感的缓存,如果有空闲内存就可以保留缓存,当内存不足时就清理掉,这样就保证使用缓存的同时不会耗尽内存。例如图片缓存框架中缓存图片就是通过软引用的。
**弱引用:**弱引用是通过WeakReference类实现的,它的生命周期比软引用还要短,也是通过get()方法获取对象。 在GC的时候,不管内存空间足不足都会回收这个对象,同样也可以配合ReferenceQueue 使用,也同样适用于内存敏感的缓存。ThreadLocal中的key就用到了弱引用。虚引用也称虚引用,是通过PhantomReference类实现的。任何时候可能被GC回收,就像没有引用一样。 无法通过虚引用访问对象的任何属性或者函数。那就要问了要它有什么用?虚引用仅仅只是提供了一种确保对象被finalize以后来做某些事情的机制。比如说这个对象被回收之后发一个系统通知啊啥的。
**虚引用:**是必须配合ReferenceQueue 使用的,具体使用方法和上面提到软引用的一样。主要用来跟踪对象被垃圾回收的活动。
2、String类和StringBuffer类
3、线程
4、Java中transient关键字的作用
简单地说,就是让某些被修饰的成员属性变量不被序列化
5、在mian()方法中给出的整型数组,如果将其写到一个文件中,需要,建立数据字节输出流。 Java 中的io都是以程序(内存)为参照物的,写文件相比程序都是向外写,程序是主动方,即从程序向文件输出,且传输字符数组,故选择建立数据字节输出流。
6、子类调用父类构造方法
子类会默认调用父类的无参构造方法当父类中没有无参构造函数时,子类必须调用父类有参的构造函数
子类默认调用父类的构造方法,如果父类中没有无参的构造函数,就会出现编译错误。