1.Java包含哪两类数据类型?其中基本类型的每种类型的取值范围和默认值分别是多少?请编程验证。
基本数据类型和引用数据类型。
(1)数值型:
byte:可以说是java中最少的数据类型了,它在内存中占用1个字节,也就是8位(bit),值得范围是:-128~127,
也就是-2的7次方到2的7次方减一,默认值是0B.
short:短整型,它在内存中占用的是2个字节,16位,值得取值范围是-32768~32767,也就是-2的15次方到2的15次方减一,
默认值也是0S.
int:整型,在内存中占4个字节,32位,值得取值范围是-2147483648~2147483647,也就是-2的31次方到2的31次方减一,
默认值还是0
long:长整型,在内存中占8个字节,64位,值的取值范围是-2的63次方到2的63次方减一,默认值要注意了,因为是长整型,
所以默认是虽说是0,但是准确的说是0L,必须要加上L来表示它是long类型,不加就成了int类型了.
不声明小数类型的情况下,默认为double
float :单精度浮点型, 在内存中占4个字节,32位,主要用来存储小数的,但是有限制,有效小数位只有6~7位,默认是0.0f ,取值范围是:3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示 乘以10的负45次方)
double:双精度浮点型,在内存中占8个字节,64位,也是用来存储小数的,默认是0.0,取值范围是1.797693e+308 到4.9000000e-324(e+308表示是乘以10的308次方,同样,e-324表示乘以10的负324次方)
(2)字符型:char
字符类型,它在内存中占用2个字节,也就是16 bit,因为java本身的字符集不是用ASCII码来存储的,
而是用的16位的Unicode字符集,所以它的字符存储范围也就是'u0000 -- uffff',默认值呢?就是'u0000'
(3)布尔型:boolean
布尔类型,它比较特殊,布尔类型只允许存储true(真)或者false(假),不可以用0或者非0表示
可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转
换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte数
组来实现的。
2.Java在什么情况下会发生整型溢出?请举例说明。
以下是摘自:http://calvin.javaeye.com/blog/91903,对于java内存泄漏的总结
(1)被生命周期极长的集合类不当持有,号称是Java内存泄漏的首因。
这些集合类的生命周期通常极长,而且是一个辅助管理性质的对象,在一个业务事务运行完后,如果没有将某个业务对象主动的从中清除的话,这个集合就会吃越来越多内存.
(2)Scope定义不对,这个很简单了,方法的局部变量定义成类的变量,类的静态变量等。
(3)异常时没有加finally{}来释放某些资源,JDBC时代也是很普遍的事情。
(4)另外一些我了解不深的原因,如:Swing里的Listener没有显式remove;内部类持有外部对象的隐式引用;Finalizers造成关联对象没有被及时清空等。
3.Java基本类型的包装类分别是哪些?其高频区间数据缓存范围分别是什么?请选择一种包装类型编程验证其数据缓存特性。
byte → Byte,short → Short,int → Integer,long → Long,float → Float,double → Double,char → Character,boolean→ Boolean。
Boolean:使用静态final,就会返回静态值
Byte:-128~127
Short:-128~127
Character:0~127
Long:-128~127
Integer:-128~127
4.什么是自动装箱,什么是自动拆箱,请举例说明。
此处摘自:什么是拆箱和装箱?举例说明_babeyuu的博客-CSDN博客_装箱和拆箱的区别
1.装箱,值类型向引用类型转换:
在托管堆中分配内存,分配的内存量是类型各字段所需的内存量+类型对象指针所需的内存量+同步块索引所需的内存量。
值类型的字段复制到分配好的内存中
返回对象地址,现在对象地址是对象引用
2.拆箱,引用类型向值类型转换:
获取已装箱类型中的未装箱部分,也就是对象的原始值的各个字段
复制字段的值从堆中到栈中的值类型实例中
//装箱的例子
//装箱允许将值类型隐式转化成引用类型还是在Main方法里面
int i = 2008;
object obj = i;
Console.WriteLine("1.i的值为{0},装箱之后的对象为{1}",i,obj);
i = 927;
Console.WriteLine("2.i的值为{0},装箱之后的对象为{1}",i,obj);
Console.ReadKey();
//程序运行结果
//1.i的值为2008,装箱之后的对象为2008.
//2.I的值为927,装箱之后的对象为2008
//拆箱例子
//拆箱允许将引用类型显示转换为值类型,下面通过一个实例演示拆箱的过程
int i = 112;
object obj = i;
Console.WriteLine("装箱操作:值为{0},装箱之后的对象为{1}",i,obj);
int j = (int)obj;
Console.WriteLine("拆箱操作,装箱的对象为{0},值为{1}", obj, j);
Console.ReadKey();
//程序运行后的结果
//装箱操作:值为112,装箱之后对象为112
//拆箱操作:装箱对象为112,值为112
5.int和Integer有什么区别,它们之间的互相转化是怎样的?
int 属于普通数据类型,Integer是 int 所对应的包装类
①int转Integer
int a = 5;
Integer A = new Integer(a);或
Integer A = Integer.valueOf(a);
②Integer转int
Integer A = new Integer(5);
int a = A.intValue();
6.逻辑运算符&和&&的区别是什么?逻辑运算符&与位运算符的区别是什么?请举例说明。
逻辑运算符&和&&的区别:
“&”在执行操作时,运算符左右两边的表达式首先被执行,再对结果进行与运算。而利用“&&”执行操作时,如果从左边的表达式中得到操作数能确定运算结果,则不再对右边的表达式进行运算。
逻辑运算符&与位运算符的区别:
位运算符&:如果相对应位都是1,则结果为1,否则为0;
例如:假设整数变量A的值为60和变量B的值为13。即A = 0011 1100,B = 0000 1101。则(A&B),得到12,即0000 1100。
逻辑运算符&:当&两侧的值都为真时,结果才为真。
例如:
int i = 2,j = 4;则(++i=2)&(j++=4)的结果为false。
先判断++i=2是否成立,结果不成立(false),程序会继续判断下一个表达式是否成立,j++=4,该表达式成立。但是&逻辑运算符要求两侧的值都为真时,结果才为真。
7.Java语言中可以采用什么语句跳出多重循环?请举例说明。
(1)break lab; (跳出多重循环的外层循环),
其中break是关键字;lab是用户定义的标号。
lab:
for(int i =0; i<2; i++) {
for(int j=0; j<10; j++) {
if (j >1) {
break lab;
}
System.out.println(“break");
}
}
输出结果: break break
(2)continue lab;(跳出外层的本次循环,继续外层下一次循环)
lab: for(int i =0; i<2; i++) {
for(int j=0; j<10; j++) {
if (j >1) {
continue lab;
}
System.out.println("continue");
}
System.out.println("************");
}
输出结果: continue continue continue continue



