-
数据类型和字节大小对应表:
类型 | 大小 |
---|---|
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 × 103 =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 位将会被丢弃。
-
可以将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.
-
a=a+b与a+=b有什么区别吗?
a+=b会进行隐士类型转换。而a+b不会。
byte a = 127;
byte b = 127;
a = a + b; //报错
a+=b; //正常
当a+b时,程序会首先将a和b转为int类型再进行预算,a+b结果为int,需要强转为byte;a+=b隐士地转为了byte,不需要强转了。
网友评论