通常在面试中,面试官会提出一些冷的基础知识,比如基础数据类型占用的字节数,或者Unicode和UTF-8的区别,所以很多考生会回答错误。此外,在正常编码过程中,除法经常用于计算。例如,对于一个长度为100万的List中的所有元素进行除16操作,CPU对element的计算将快于element/16操作 因此,本文总结了一些容易被遗忘的基知识,适合有一定Java基础的技术人员阅读。有些内容可能对初学者来说比较困难,希望能帮助大家轻松应对面试官的基本技术问题,提高编码效率。 1、Java中的基本数据类型和内存大小。(1)整形 byte1字节。 short2字节。 int4字节。 long8字节。 (2)浮点型。 float4字节。 double8字节。 (3)字符类型。 char2字节(Unicode-16) (4)布尔类型。 布尔型boolean很特别。虽然Java虚拟机定义了boolean类型,但虚拟机对boolean类型的支持有限,没有为boolean值单独设计JVM指令。编译后,操作布尔值的表达式使用JVM的int数据类型,即占用4个字节。 JVM不会直接支持boolean数组。boolean数组编译后,其元素采用byte数据类型,0表示false,1表示true,即boolean数组的元素只占用一个字节。 2、UTF-8与Unicode的关系。Unicode是一个统一的编码标准,对所有现有字符进行唯一的编码。在第一个Unicode版本中,使用两个字节(16位)来表示一个字符。请注意,这里的字节不是指计算机内存中的存储单元,而是数学长度单元。然而,Unicode字符在内存中存储的长度需要一个特定的编码规则,如UTF-8、因此,Unicode只是一个编码标准,UTF-8是该标准的实现。UTF-8规定了Unicode字符在内存中占用的空间(英语和中文占用的空间不同,感兴趣的读者可以查阅相关信息)。 代码点是指可用于编码字符集的数字。例如,在16位Unicode编码字符集中,字符A编码为U+0041、0041为代码点。 代码单元是指字符占用空间的单元。例如,在UTF-32中,一个代码单元为32位,一个字符占32位,只是使用一个代码单元,这将消耗大量的内存。在UTF-16中,一个代码单元为16位,值U+0000-U+FFFF代码对应一个字符,每个字符占用一个代码单元。然而,对于超出此范围的增加字符的编码,需要两个这样的单元(即32位)。在UTF-8中,一个代码单元为8位,UTF-8使用一到四个字节序列编码Unicode代码点,原则与UTF-32和UTF-16相同。 3、String字符串常量。在Java语言中,一个String字符串的常量对应于一个String对象,是不可改变和继承的(因为String类被final关键字修改)。Java语言的设计主要是为了分享字符串的常量(注意字符串的常量,字符串的变量不符合这里提到的规则),因为JVM将字符串的常量放入公共存储池中,不同的变量可以引用相同的字符串常量。 上述代码的运行结果是:true。这表明a和b引用相同的String对象。 4、基本数据类型转换规则。在双操作数操作中,低级型将根据操作数类型转换为高级型。 1)只要两个操作数中有一个是double类型,另一个将转换为double类型,结果也是double类型; 2)只要两个操作数中有一个是float类型,另一个将转换为float类型,结果也是float类型; 3)只要两个操作数中有一个是long类型,另一个将转换为long类型,结果也是long类型; 4)两个操作数(包括byte、short、int、char)都会转换成int类型,结果也是int类型。 5、按值调用和引用调用。按值调用表示方法接收调用人提供的参数值。根据引用调用表示方法,调用人提供调用人提供的参数地址。Java程序设计语言总是按值调用。以下是反例代码: 上述代码启动交换a和b引用的对象,但实际编译执行会发现交换不成功。这证明Java不是按引用调用的,a和b只代表两个Person对象的值,而不是两个对象的引用,在参数传输上与int等基本类型的值没有区别。 |
|