- Java包含哪两大类数据类型?其中基本类型的每种类型的取值范围和默认值分别是多少?请编程验证。
答:基本类型(primitive type):
Java语言提供了八种基本类型。Java数据类型有六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
整数类型:
byte,占用1个字节(范围:-128-127)
例如:byte b = 100;byte b = -50;
short,占用2个字节(范围:-32768-32767)
例如:short s = 1000;short s = -2000;
int,占用4个字节(范围:-2147483648-2147483647)
例如:int i = 10000;short i = -20000;
long,占用8个字节(范围:-9223372036854775808-9223372036854775807)
例如:long l = 1000000L;long l = -2000000L;
浮点类型:
float,占用4个字节
例如:floata f = 1.1F;
double,占用8个字节
例如:double d = 1.1111111;
字符类型:
char,占用两个字节
例如:char c = “c”;
注:字符的本质还是数字,System.out.println((int)a); // 会强制转换输出97
boolean类型:
boolean,占用一位
例如:boolean b = true;
引用类型:
在Java中,引用类型的变量非常类似C的指针,引用类型指向的是一个对象,指向对象的变量就是引用变量。变量一旦声明后,类型就不能被改变。
对象、数组都是引用数据类型
例如:String s = “猿氏凯”;
-
Java在什么情况会发生整型溢出?请举例说明,并给出解决方案。
答:由于数的类型选择不当而造成溢出,例如下面的代码add就存在着潜在的溢出问题,从而为程序带来Bug 。
用数据范围比自己大的。
public static void main(String[] args) {
int m = Integer.MAX_VALUE/2+1; //1073741824
int n = Integer.MAX_VALUE/2+1;
int overflow = m + n;//->将overflow换为long类型,强转long(m+n)
System.out.println(overflow); //-2147483648
} -
Java基本类型的包装类分别是哪些?其高频区间数据缓存范围分别是什么?请选择一种包装类型编程验证其数据缓存特性。
答:Java有八大基本类型及包装类,分别是:
byte 包装类是 Byte
short 包装类是 Short
int 包装类是 Integer
long 包装类是 Long
float 包装类是 Float
double 包装类是 Double
char 包装类是 Character
boolean 包装类是 Boolean
这几种包装类都是在JAVA.lang中的。
其中Integer ,Byte,Float,Double,Short,Long都属于Number类的子类,Character和Boolean是属于Object子类。
高频区间数据缓存范围
其中Double和Float没有缓存,其他类型都有高频缓存区间。其高频缓存区间的缓存范围是:
Boolean:使用静态final,就会返回静态值
Byte:-128~127
Short:-128~127
Character:0~127
Long:-128~127
Integer:-128~127
如果所使用的包装类的值在这个缓存区间内,就会直接复用已有对象,在缓存区间之外的数值会重新在堆上产生。此时比较两个值是否相等要用equals方法
双等号“ == ”,对于基本数据类型,比较的是它们的值,对于非基本类型,比较的是它们在内存中的存放地址,或者说是比较两个引用是否引用内存中的同一个对象。
boolean包装类举例:
Boolean
一个Boolean类型的对象只包含一个类型为boolean的字段,此类还为boolean和String的相互转换提供了很多方法。
构造方法
Boolean(boolean value);
该方法创建一个表示value参数的Boolean对象
创建一个表示value参数的Boolean对象
Boolean b=new Boolean(true);
以String变量为参数,创建Boolean对象
Boolean bool=new Boolean(“ok”);
返回值为 boolean 的方法
1.booleanValue() 将Boolean对象的值以对应的boolean值返回
2.equals(Object obj) 判断调用该方法的obj是否相等
3.parseBoolean(String s) 将字符串参数解析为boolean值
4.valueOf(String s) 返回一个用指定字符串表示的boolean值
返回值为 String
1.toString() 返回表示boolean值得String对象
1
package org.day05hk;
public class GetBoolean {
public static void main(String[] args){
Boolean b1=new Boolean(true);
Boolean b2=new Boolean(“ok”);
System.out.println(“b1:”+b1.booleanValue());
System.out.println(“b2:”+b2.booleanValue());
}
}
常量
(1).TRUE 对应基值true的Boolean对象
(2).FALSE 对应基值 false 的Boolean对象
(3).TYPE 基本类型boolean的class对象
4.什么是自动装箱,什么是自动拆箱,请举例说明。
自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。
Integer sum = 0;
for(int i=1000; i<5000; i++){
sum+=i;
}
sum = sum.intValue() + i;
Integer sum = new Integer(result);
- int与Integer有什么区别,它们之间的相互转化是怎样的?
请通过JDK文档自主学习Integer类,对主要方法进行测试。
答: int和Integer的区别
(1)、Integer是int的包装类,int则是java的一种基本数据类型
(2)、Integer变量必须实例化后才能使用,而int变量不需要
(3)、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
(4)、Integer的默认值是null,int的默认值是0
延伸:
关于Integer和int的比较
(1)、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
(2)、Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true
- 逻辑运算符&和&&的区别是什么?逻辑运算符&与位运算符&的区别是什么?请分别举例说明
答:逻辑运算符 & 运算符左右两边的表达式首先被运算执行,再对两表达式的结果进行与运算
逻辑运算符 && 如果从左边的表达式中得到操作数能确定运算结果,则不再对右边的表达式进行运算。
逻辑运算符&
参与运算的都是布尔值
x&y,x,y都为true时,结果为true
位运算符&
x&y,x,y按位进行与操作 - Java语言中可以采用什么语句跳出多重循环?请举例说明
答:break语句通常有下述不带标号和带标号的两种形式:
break;(跳出本层循环)
break lab; (跳出多重循环的外层循环)
其中:break是关键字;lab是用户定义的标号。
break lab语句用在循环语句中,必须在外循环入口语句的前方写上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
continue语句只能用于循环结构中,其作用是使循环短路。
continue;(跳出本层的本次循环,继续本层下一次循环)
continue lab;(跳出外层的本次循环,继续外层下一次循环)
lab是用户定义的标号。
当程序中有嵌套的多层循环时,为从内循环跳到外循环,可使用带标号的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