基本数据类型知识点积累

  • 数据类型和字节大小对应表:
类型 大小
int 4个字节
char 2个字节
byte 1个字节
short 2个字节
long 8个字节
float 4个字节
double 8个字节
  • Integer与int的区别:

Ingeter是int的包装类,int的初值为0,Ingeter的初值为null
Integer i = 1;int ii = 1; i==ii为true;因为Integer与int比较会自动拆装箱

  • Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 10的3次方 =3140,3.14E-3 就是 3.14 x 10的-3次方 =0.00314。

  • 对象、数组都是引用数据类型。

  • byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
    当使用常量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制

  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
    转换过程中可能导致溢出或损失精度,例如:
    int i =128;
    byte b = (byte)i;
    因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。

  • Java中各种数据默认值

Byte,short,int,long默认是都是0
Boolean默认值是false
Char类型的默认值是 ’ ’
Float与double类型的默认是0.0
对象类型的默认值是null

  • 什么是值传递和引用传递?

1.值传递

public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20;

    swap(num1, num2);

    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2);
}

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    System.out.println("a = " + a);
    System.out.println("b = " + b);
}

运行的结果是:

a = 20
b = 10
num1 = 10
num2 = 20

在swap方法中,a、b的值进行交换,并不会影响到num1、num2。因为,a、b中的值,只是从num1、num2的复制过来的。 对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

2.引用传递

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};

    change(arr);

    System.out.println(arr[0]);
}

//将数组的第一个元素变为0
public static void change(int[] array) {
    int len = array.length;
    array[0] = 0;
}

运行的结果是: 0
调用change()的时候,形参array接收的是arr地址值的副本。并在change方法中,通过地址值,对数组进行操作。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
但是对于String类型用于传参,String是对象虽然是引用传递,但是值却是不能被改变的。

请写出下面几个表达式的结果,答案可以用10进制或16进制书写

1). 0xaa | 0x55
2). 15 & 240
3). 10 ^ 12
4). -2 >> 1
5). -2 >>> 1
1). 分析:十六进制数用0x……来表示,后面一个十六进制位是四位,两个十六进制位为一个字节,最多后面可以有8个十六进制位,32个字节,如:0xFFFFFFFF。 或(“ | ”)运算,全0为0,其他为1。
所以:0xaa 用二进制表示为 10101010 ,0x55 用二进制表示为 01010101 ,按位或之后为 11111111 ,十进制数为255,十六进制数为 0xFF 。

2). 分析:10进制转换成2进制,用该数字除以2,记录商和余数,利用商再次除以2,记录商和余数……直到上为0或余数为0停止,余数逆序组成二进制的从低到高位(最后的余数为二进制最低位)。与(“ & ”)运算,全1为1,其他为0 。
所以: 15 等于1111 ,240等于 11110000,15前面用0补齐为00001111 ,按位与之后为 00000000 ,即结果为0

3). 分析: 亦或(“ ^ ”)运算,相同取0,不同取1 。
所以:1010 ^ 1100 =0110 , 十进制表示为6,十六进制表示为 0x06 。

4). 分析: 带符号右移(“ >> ”),即有符号位时,负数符号位补1,正数符号位补0, -2 的二进制求法是正数取反加1,因此 2 的二进制表示为0000 0000 0000 0000 0000 0000 0000 0010 ,取反加一为
1111 1111 1111 1111 1111 1111 1111 1110 ,即 -2 的二进制表示。
注: >> , << , >>> , 运算符只针对int型和long型,byte ,short ,char型需要转换成Int型在进行操作。
所以: 带符号右移之后为 1111 1111 1111 1111 1111 1111 1111 1111 ,除符号位之外,减一取反,得到带符号十进 制数为 -1 。

5). 分析:无符号右移 (“ >>> ”) ,即无论正负数,右移之后符号位均补 0 。
所以: -2 的二进制无符号右移一位之后为 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方减一。
注:右移和无符号右移主要区别就在于左面最高位补 0 还是补 1 的问题,无符号右移任何时候最高位都补 0 , 有符号右移则是正数补 0 ,负数补 1 。(没有无符号左移!)。

  • Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
  • 可以将int强转为byte类型么?会产生什么问题?

我们可以做强制转换,但是Java中int是32位的而byte是8 位的,所以,如果强制转化int类型的高24位将会被丢弃,byte 类型的范围是从-128到127

  • 64位的JVM当中,int的长度是多少?

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

  • 我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

不能,必须要强制。

  • 3*0.1 == 0.3 将会返回什么?true 还是 false

答案是false,因为有些浮点数不能完全精确的表示出来。
因为浮点数进行运算是先会转为二进制,二进制会精确地表示浮点数的大小,所以出现浮点数的保留位数会加长,最终结果保留了这个长度。


image.png
  • int 和 Integer 哪个会占用更多的内存?(答案)

Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。同理,包装类型比基本类型占内存更多。

  • ArrayList 和 HashMap 的默认大小是多数?(答案)

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。

  • ceil floor round使用规则

ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;
floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;
round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11.

你可能感兴趣的:(基本数据类型知识点积累)