17. Java的基础类型和字节大小?【掌握】
考核点:基本数据类型占用空间大小。
答:
布尔型boolean:8位;
字节型byte:8位;
字符型char:16位;
短整型short:16位;
整形int:32位;
长整形long:64位;
浮点型float:32位;
双精度double:64位;
引申,boolean类型分析:
占用1个bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
占用1个字节
理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
占用4个字节
理由来源是《Java虚拟机规范》一书中的描述:“boolean数据类型,单独使用是4个字节,在数组中又是1个字节。
总结:
boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义。
18. 数组在内存中如何分配?【重点】
考核点:数组的内存原理
答:
如果一个对象使用new关键字创建,会在堆上分配内存空间,然后返回该对象的引用;
因为数组也是一个对象,所以也会在堆上分配内存空间,然后返回该对象的引用,简单的值类型的数组,每个数组成员是一个引用到运行时常量池上的空间。
19. 在.java源文件中可以有多个类,不包括内部类?【重点】
考核点:编译机制。
答:
一个Java源文件中可以包括多个类,但是单个文件中只能有一个public类,并且该public类必须与文件名相同。
20. String是基本数据类型吗?【掌握】
考核点:String类。
答:
String类不是基本类型,而是一个引用类型。
String类是final类型的,因此不可以继承这个类、不能修改这个类。
实际编码中为了提高效率、节省空间,应该用StringBuffer类、StringBuilder类来更改字符串的值。
21. 什么是值传递和引用传递?【掌握】
考核点:值传递和引用传递。
答:
基本数据传递参数时采用值传递。值传递意味着传递了值一个副本,因此,就算是改变了值副本,也不会影响源值;
引用类型传递参数时采用引用传递。引用传递意味着传递的并不是实际的对象,而是对象的引用,因此,外部对引用对象所做的改变会反映到传递的对象上。
22. JDK和JRE的区别是什么?【重点】
考核点:JDK的组成。
答:
Java运行时环境(JRE)是执行Java程序的Java虚拟机,它同时也包含了执行Applet需要的浏览器插件。
Java开发工具包(JDK)是完整的Java软件开发包,包含了Java开发工具(比如:JavaDoc、Javac)、JRE、Java编译器、Java SE API,可以让开发者开发、编译、执行Java应用程序。
23. 字符串常量池到底存在于内存空间的哪里?【重点】
考核点:Java内存原理。
答:
在JDK1.7之前运行时常量池逻辑包含字符串常量池,并存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代;
在JDK1.7字符串常量池被从方法区拿到了堆中,这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区,也就是hotspot中的永久代;
在JDK1.8 hotspot移除了永久代用元空间(Meta Space)取而代之,这时候字符串常量池还在堆,运行时常量池还在方法区,只不过方法区的实现从永久代变成了元空间(Meta Space)。
扩展:
Sun的JDK版本从1.3.1开始运用Hotspot虚拟机,2006年底开源,主要使用C++实现,JNI接口部分用C实现。
Hotspot是较新的Java虚拟机,用来代替JIT(Just in Time),可以大大提高Java运行的性能。Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢,Hotspot将常用的部分代码编译为本地(native)代码,提高了性能。