Java基础(二)——2019/12/19

Java基础(二)——2019/12/19

  • Array与ArrayList的区别以及各自的应用场景
  1. Array中的元素可以是基本数据类型,也可以是引用数据类型;ArrayList中的元素只能是引用数据类型。
  2. Array的大小是固定的,ArrayList的大小是动态变化的,ArrayList基于Array实现。
  3. Array适用于对数据数量不变的场景,ArrayList适用于数据数量不确定或者经常变化的场景
  • Java中的值传递和引用传递
  1. 参数为基本数据类型时,按值传递:传递参数的一个副本,在函数内对参数进行修改,不会影响函数外部的值。
  2. 参数为引用数据类型时,按引用传递:传递对象引用的一个副本,可以在函数内通过引用副本对外部对象进行修改,但可以将引用副本指向其他对象,此时该引用副本与原对象的联系切断。
  3. 注意:当参数为String时,虽然也是按引用传递,但由于String类由final关键字修饰,所以试图在函数内部修改字符串都会创建新的String对象,不会影响函数外部的String对象。
  • 请你解释为什么会出现4.0 - 3.6 = 0.40000001这种情况?

简单说来是因为在计算机中所有的数字:整数、小数都是使用二进制表示的,而使用二进制无法精确表示所有的10进制小数。

  1. 以0.3为列:0.3 = 0.25 + 0.03125 + 0.015625 + …… = 2^-2 + 2^-5 + 2^-6 + ……,该序列是无限的,但是在计算机中只能用有限位数(32位或者64位)来表示一个小数,只能用23位(float)或者52位(double)来表示小数部分,所以对于0.3这种小数,计算机只能近似表示。
  2. 以0.75为列:0.75 = 0.5 + 0.25 = 2^-1 + 2^-2,该序列是有限的,所以对于0.75这种小数,计算机能够精确表示。
  • 十进制数在计算机中是如何存储的?

十进制数分为无符号数和有符号数(Java中只支持有符号数),无符号数存储十分简单,只需要存储十进制数相应的二进制就行,有符号数通过二进制补码存储。简单了解三种有符号数的表示方法:

  1. 原码——最高位为符号位,其余n-1位表示数值的绝对值
    比如字长为4的计算机中:
    数值 表示形式
    0 0000 \ 1000
    1 0001
    -1 1001
    2 0010
    -2 1010
    可以观察到0存在两种表示形式,而且 -1 + 1 = 1010 = -2,这明显出现了数值运算的错误,所以不能使用原码表示有符号数。

  2. 反码——最高位为符号位,正数的反码与原码相同,负数的反码是其绝对值按位取反,由此可以得出反码最高位的权重为-(2^(n-1)-1)
    比如字长为4的计算机中:
    数值 表示形式
    0 0000 \ 1111
    1 0001
    -1 1000
    2 0010
    -2 1101
    可以观察到0存在两种表示形式,而且 -1 + 1 = 1001 = -6,这明显出现了数值运算的错误。所以不能使用反码表示有符号数。

  3. 补码——最高位为符号位,正数的补码与原码相同,负数的反码是其绝对值按位取反加1,由此可以得出补码最高位的权重为-(2^(n-1))
    比如在字长为4的计算机中:
    数值 表示形式
    0 0000
    1 0001
    -1 1111
    2 0010
    -2 1110
    可以观察到0只存在一种表示形式,而且各种组合运算均产生正确的结果,证明略过。
  • ==比较什么?

如果“==”比较的是引用数据类型,则比较的是引用是否指向同一个对象;如果比较的是基本数据类型,则比较的是数值是否相等。

  • 解释一下为什么重写equals()时还要重写hashCode()?

在使用HashMap等容器存储对象时,要结合hashCode()和equals()判断一个对象是否已经存在于容器中。首先调用hashCode()计算对象应当存储的位置,然后调用equals()判断对象是否已经存在与容器中。如果不重写hashCode(),那么由equals()判断相等的两个对象很可能hashCode相等(hashCode默认为内存地址),这样它们就会被存储在HashMap的不同位置,这显然是不合逻辑的。

猜你喜欢

转载自blog.csdn.net/a16302010048/article/details/103653911
今日推荐