1、关于Java语言的内存回收机制,下列选项中最正确的一项是
正确答案: C
A.Java程序要求用户必须手工创建一个线程来释放内存
B.Java程序允许用户使用指针来释放内存
C.内存回收线程负责释放无用内存
D.内存回收线程不能释放内存对象

解析:

A,java的内存回收是自动的,Gc在后台运行,不需要用户手动操作
B,java中不允许使用指针
D,内存回收线程可以释放无用的对象内存

java内存回收机制:自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。java的内存管理包括两个方面:内存分配和内存回收。这两个方面的工作都是由JVM所完成的。

要点:java中内存管理是由JVM完成的,不需要程序员去手动执行
2.关于Float,下列说法错误的是()
正确答案: C
A.Float是一个类
B.Float在java.lang包中
C.Float a=1.0是正确的赋值方法
D.Float a= new Float(1.0)是正确的赋值方法

解析:
  • Float是类,float不是类.
  • 查看JDK源码就可以发现Byte,Character,Short,Integer,Long,Float,Double,Boolean都在java.lang包中.
  • Float正确复制方式是Float f=1.0f,若不加f会被识别成double型,double无法向float隐式转换.
  • Float a= new Float(1.0)是正确的赋值方法,但是在1.5及以上版本引入自动装箱拆箱后,会提示这是不必要的装箱的警告,通常直接使用Float f=1.0f.
Float与float的区别:float是基本数据类型,Float是包装类(封装类)。封装类可将基本数据类型封装后当作对象进行操作,并为各种基本数据类型提供各种转换功能。
例如Float f = new Float(3.4f);,即可实现将3.4f这个float类型的基本数据类型变量封装,然后当作对象处理,进行诸如类型转换(转换为字符串或者十六进制数);也可通过Float类中的静态方法或者非静态方法将字符串转换为基本数据类型,例如float f = Float.parseFloat(“12.3”);。
java中八种基本数据类型:java的八大基本数据类型分别是:1、整型的byte、short、int、long;2、字符型的char;3、浮点型的float、double;4、布尔型的boolean。

3、关于抽象类与最终类,下列说法错误的是?

正确答案: D
A.抽象类能被继承,最终类只能被实例化。
B.抽象类和最终类都可以被声明使用
C.抽象类中可以没有抽象方法,最终类中可以没有最终方法
D.抽象类和最终类被继承时,方法可以被子类覆盖

解析:

1,抽象类中可以有抽象方法,也可以没有抽象方法。
2,抽象类当然可以被继承,因为它就是用来继承的,
3,继承抽象类,若有抽象方法,则子类必须将其抽象方法实现,
4,抽象类中的非抽象方法可以被重写。

最终类和抽象类正好相反
5,加上final的类就叫最终类,加上final的方法就叫最终方法,
6,最终类中可以有最终方法也可以没有
7,最终类不能有子类,最终方法不能被重写

java中的抽象类的定义:
abstract class 抽象类名称{

访问权限返回值类型 方法名称(参数){

return [返回值] ;
    
}

访问权限abstract返回值类型抽象方法名称(参数) ;

//抽象方法,无方法体

}

抽象类的定义规则如下。

(1)包含一个以上抽象方法的类必须是抽象类。
(2)抽象类和抽象方法都要使用abstract关键字声明。
(3)抽象方法只需声明而不需要实现。
(4)如果一个类继承了抽象类,那么该子类必须实现抽象类中的全部抽象方法。
4、对于文件的描述正确的是( )

正确答案: D
A.文本文件是以“.txt”为后缀名的文件,其他后缀名的文件是二进制文件。
B.File类是Java中对文件进行读写操作的基本类。
C.无论文本文件还是二进制文件,读到文件末尾都会抛出EOFException异常。
D.Java中对于文本文件和二进制文件,都可以当作二进制文件进行操作。

解析:

A.文件分为文本文件和二进制文件,计算机只认识二进制,所以实际上都是二进制的不同解释方式。文本文件是以不同编码格式显示的字符,例如Ascii、Unicode等,window中文本文件的后缀名有".txt",“.log”,各种编程语言的源码文件等;二进制文件就是用文本文档打开是看不懂乱码,只要能用文本打开的文件都可以算是文本文件,只是显示的结果不是你想要的,二进制文件只有用特殊的应用才能读懂的文件,例如".png",".bmp"等,计算机中大部分的文件还是二进制文件。

B.File类是对文件整体或者文件属性操作的类,例如创建文件、删除文件、查看文件是否存在等功能,不能操作文件内容;文件内容是用IO流操作的。

C.当输入过程中意外到达文件或流的末尾时,抛出EOFException异常,正常情况下读取到文件末尾时,返回一个特殊值表示文件读取完成,例如read()返回-1表示文件读取完成。

说说JVM的垃圾回收机制

垃圾回收机制主要完成三件事情: 1.哪些内存需要回收:废弃的常量,不再被引用的对象等
2.什么时候回收:当类不再被使用
3.如何回收:用引用计数法判断对象是否存活,采用垃圾收集器进行回收
当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则。而分代收集理论,建立在如下三个分代假说之上,即弱分代假说、强分代假说、跨代引用假说。依据分代假说理论,垃圾回收可以分为如下几类:

  1. 新生代收集:目标为新生代的垃圾收集。
  2. 老年代收集:目标为老年代的垃圾收集,目前只有CMS收集器会有这种行为。
  3. 混合收集:目标为整个新生代及部分老年代的垃圾收集,目前只有G1收集器会有这种行为。
  4. 整堆收集:目标为整个堆和方法区的垃圾收集。

HotSpot虚拟机内置了很多垃圾收集器,其中针对新生代的垃圾收集器有Serial、ParNew、Parallel Scavenge,针对老年代的垃圾收集器有CMS、Serial Old、Parallel Old。
此外,HotSpot还内置了面向整堆的G1收集器。在上述收集器中,常见的组合方式有:

  1. Serial + Serial Old,是客户端模式下常用的收集器。
  2. ParNew + CMS,是服务端模式下常用的收集器。
  3. Parallel Scavenge + Parallel Old,适用于后台运算而不需要太多交互的分析任务。
    年轻代:

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

年老代:

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。