-
数据类型和字节大小对应表:
类型 | 大小 |
---|---|
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,因为有些浮点数不能完全精确的表示出来。
因为浮点数进行运算是先会转为二进制,二进制会精确地表示浮点数的大小,所以出现浮点数的保留位数会加长,最终结果保留了这个长度。
-
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.