数据类型的分类
基本数据类型(Primitive Type)
基本类型共有八种,其中包括六种数值型与两个非数值型。基本数据类型的信息如下:
数据类型 | 大小(单位:bit/位) | 所属包装类 | 最小范围 | 最大范围 |
---|---|---|---|---|
byte | 8 | java.lang.Byte | -128 | +127 |
short | 2byte = 16 | java.langShort | -32768 | +32767 |
int | 4byte = 32 | java.lang.Integer | -2^31 | +2^31-1 |
long | 8byte = 64 | java.lang.Long | -2^63 | +2^63-1 |
float | 4buye = 32 | java.lang.Float | -3.4 * 10^38 | +3.4 * 10^38 |
double | 8byte = 64 | java.lang.Double | -1.7 * 10^308 | +1.7 * 10^308 |
char | 2byte = 16 | java.lang.Character | 0 | 65535 |
boolean | 所占大小不明确 | java.lang.Boolean | 只有"true"和"false"两个取值 |
(注解:内存的存储最小单位是“bit/位”,1byte/字节 = 8bit/位)
(注意:在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,boolean类型没有给出明确的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,在虚拟机中boolean类型的值:false/true是用0/1来表示的,所以不确定。原因如下:)
大小为1bit:
boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。大小为1byte:
虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。大小为4byte:
来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。所以boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。
整数类型:
Java中整数类型一般默认为int型,
整型有四种表示形式:
- ①二进制(锋二进一)、
- ②八进制(锋八进一)、
- ③十进制(也就是我们生活中所表达的类型,锋十进一)、
- ④十六进制(锋十六进一); (注意:十六进制从第十位开始就不是数字了,而是字母,如:10就为A,11为B,16为10,28为1C)
(注意:我们一般声明整型时默认的就是十进制,若要声明其他进制形式,需要在值的最前面加上特定的标识)
byte a = 0b100; //声明一个二进制byte型变量a,给定值为4(二进制为100),(二进制以0b标识)
short b = 0100; //声明一个八进制short型变量b,给定值为144(八进制为100),(八进制以0标识)
int c = 0x100; //声明一个十六进制int型变量c,给定值为400(十六进制为100),(十六进制以0x标识)
声明一个byte型变量:
byte a = 1;
声明一个short型变量:
short a = 22;
声明一个int型变量:
int a = 123;
声明一个long型变量:
(注意:若声明了long类型,且该值在int范围内,则后面可以不加“L”,否则需要在后面加上“L”)
long b = 5555555555555555L;
浮点类型:
Java中浮点类型一般默认为double型
- float:单精度浮点(小数点后可精确到7位有效数字)
- double:双精度浮点(小数点后可精确到float的二倍有效数字)
声明一个float型变量:
(注意:声明float型需要在后面加上“f”或“F”)
float c = 3.14f;
float d = 3.14F;
声明一个double型的变量:
double e = 3.1415;
(注意:浮点类型存在舍入误差,如果需要不产生误差的小数类型用来精确计算可以使用java.math包下的BigDecimal类)
字符型:
我们知道Java中的字符是基于Unicode码表的,所以字符型是用来表示Unicode编码中的字符的,范围在:“0 - 65535”,也就是说char也可以用数字来表示;
字符型在赋值的时候与其他类型有点区别,char作为单个字符型,在赋值时要加上单引号。
声明一个char型变量:
char a = 'A';
布尔型:
boolean型只有两个值,true(正确/真)和false(错误/假);一般用boolean来做判断或者接收判断结果;
声明一个boolean型变量:
boolean flag = true;
boolean boo = false;
引用数据类型(Reference Type)
类
具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。
// 定义一个类TestDemo:
public class TestDemo{
}
接口 interface
接口可以理解为:定义了一系列规范,在编写程序的时候“必须”遵循接口所规定的所有要求。
// 定义一个接口TestInterface:
public interface TestInterface{
}
数组 Array []
用于储存多个相同类型数据的集合。
// 定义一个int型的数组:给定值“0,1,2”
int[] array = {0,1,2};
字符串 String ""
- Java中也有字符串类型,而且与C/C++一样都是String,只不过在Java中String(字符串类型)是作为一个类来实现的,也就是说,Java中String类型是属于引用类型的,属于类。
- 不过String类型在使用时并没那么麻烦,String在声明赋值时与char不同,因为是字符串,所以要带双引号。
// 声明一个String型变量:
String str = "Hello";
总结
可以这样理解:只要不是基本数据类型的八种,以外的都是属于引用数据类型的。
常用的进制
日常生活中都是 十进制; 计算机使用的语言是二进制的,
有哪些: 二进制、八进制、十进制、16进制:
正式进制转换为二进制的方法
十进制45 转换为 二进制的结果是:
// 任何数*的0次方*都等于1
=> 2的8次方 --------------------------- 2的0次方
=> 2^8 + 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1
=> 128 64 32 16 8 4 2 1
/**
*找比45小的相近权重32, 再相减得13, 再次找比13小的相近权重8,
*再相减得5, 再次找比5小的相近权重4, 再相减得1, 再次找比1小的相近权重1, 再相减得0,就完了
*/
// 有权重的就为1,没有的为0
=> 128 64 32 16 8 4 2 1
=> 0 0 1 0 1 1 0 1
得到的值是010 1101
正二进制转为十进制的方式
二进制 0010 1101 转为十进制的结果是: 45
=> 0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0
=> 2的7次方 ------------------------------------------- 2的0次方
=> 对应二进制的 0010 1101
=> 0 0 1 0 1 1 0 1
=> 0 0 32 0 8 4 0 1
=> 32 + 8 + 4 + 1 = 45
面试题
1. Java语言的主要版本有? [多选题]
A、Java SE
B、Java ME
C、Java HE
D、Java EE
正确答案是:ABD
具体解析如下:
- Java SE(Java Platform, Standard Edition)称之为“Java 平台标> 准版”。
- Java EE(Java Platform,Enterprise Edition)称之为“Java 平台企业版”。
- Java ME (Java Platform,Micro Edition)称之为 Java 平台微型版。
2. 下面关于标识符命名法则正确的是 [多选题]
A、标识符名称可以由数字、字母、下划线以及美元符号任意组合。
B、标识符名称区分大小写,长度有限制。
C、标识符名称中不可以使用数字开头。
D、标识符名称可以支持中文,只是通常不使用。
正确答案是:CD
具体解析如下:
- 标识符名称中数字不允许开头,主要是为了与特殊直接量进行区分。
- 标识符名称的长度没有限制,但是不宜过长,否则给使用带来了灾难。
3. 属于Java语言中基本数据类型的类型有 [多选题]
A、int
B、Long
C、String
D、double
正确答案是:AD
具体解析如下:
- Long 是基本数据类型 long 类型的包装类,所以注意区分大小写哦。
- String 是 Java 官方提供的核心类,属于引用数据类型的一种。
4. 关于类型转换下列说法正确的是 [多选题]
A、自动类型转换就是指从小类型到大类型的转换。
B、自动类型转换就是指从大类型到小类型的转换。
C、强制类型转换就是指从大类型到小类型的转换。
D、强制类型转换就是指从小类型到大类型的转换。
正确答案是:AC
具体解析如下:
- 从小类型到大类型的转换可以存放的下,因此叫做自动类型转换。
- 从大类型到小类型的转换不可以存放的下,因此需要强制类型转换。
5. 下列运算符中属于关系运算符的有 [多选题]
A、>>
B、>
C、=
D、!=
正确答案是:BD
具体解析如下:
- ( > ) 表示是否大于运算符
- ( >= ) 表示是否大于等于运算符
- ( < ) 表示是否小于运算符
- ( <= ) 表示是否小于等于运算符
- ( == ) 表示是否等于运算符
- ( != ) 表示是否不等于运算符
6. 布尔类型变量初始化的方式可以是 [多选题]
A、boolean b1 = true;
B、boolean b1 = 1;
C、boolean b1 = ‘真’;
D、boolean b1 = (2 > 3);
正确答案是:AD
具体解析如下:
- boolean 类型变量的数值只能是:true 和 false。
7. 下列代码的执行结果是? [单选题]
int ia = 5;
System.out.println(ia++ + ++ia);
A、11
B、10
C、12
D、13
正确答案是:C
具体解析如下:
- ia++这个表达式是后++,因此表达式的结果为 5,但是 ia 变量已经变成了 6。
- 而++ia 这个表达式是前++,因此先++再作为表达式的结果,所以表达式结果是 7。
- 两个表达式进行加法运算的最终结果为: 5 + 7 = 12。
8. 关于for循环的下列说法中正确的是 [多选题]
A、for循环的循环体中可以使用大括号包含多条语句。
B、break关键字不能用于for循环的跳出功能。
C、for循环只能用于明确循环次数的场合中。
D、for循环是判断条件成立后执行循环体。
正确答案是:AD
具体解析如下:
- break 关键字可以跳出 switch-case 分支结构和循环结构。
- for 循环更适合于明确循环次数的场合,不是只能用于该场合中。
9. switch结构中不支持的数据类型有 [多选题]
A、int。
B、boolean。
C、double。
D、String。
正确答案是:BC
具体解析如下:
- switch()中支持的数据类型有:byte,short,char 以及 int 类型,从 jdk1.5开始支持枚举类型,从 jdk1.7 开始支持 String 类型。
10. 下列程序输出的结果是[单选题]
int i = 5;
while( i > 0 ) {
i = i + 1;
if ( 5 == i ) {
break;
}
}
A、while循环执行10次。
B、死循环。
C、循环一次都不执行。
D、循环执行一次。
正确答案是:B
具体解析如下:
- 进入循环体后先执行了 i=i+1,因此 i 的数值变成了 6,所以 5==i 这个条件没有机会成立。
11. 下列程序的运行结果 [单选题]
int i=3;
switch (i) {
default: System.out.println("default");
case 0: System.out.println("zero"); break;
case 1: System.out.println("one"); break;
case 2: System.out.println("two"); break;
}
A、default。
B、zero。
C、default zero。
D、two。
正确答案是:C
具体解析如下:
- 由于 i 的数值不匹配任意的 case 分支,因此执行 default 语句,但是 default 语句后没有break 关键字因此进行了 case 穿透,执行了 case 0 后面的语句,直到 break 跳出该结构。
12. 关于数组的说法中正确的是[多选题]
A、数组中的元素类型可以不同。
B、数组的长度不可以发生改变。
C、数组的指向可以发生改变。
D、数组的内存空间必须连续。
正确答案是:BCD
具体解析如下:
- 当需要在 Java 程序中记录多个类型相同的数据内容时,则声明一个一维数组即可。一维数组本质上就是在内存空间中申请一段连续的存储单元。数组是相同数据类型的多个元素的容器。
13. 下列能够对数组正确声明或初始化的是[单选题]
A、int[] arr;
B、arr = {10, 20, 30, 40, 50};
C、int[] arr = new int[5];
D、int[] arr = new int[5]{10, 20, 30, 40, 50};
正确答案是:C
具体解析如下:
- 数据类型[] 数组名称 = new 数据类型[数组的长度];
- 数据类型[] 数组名称 = {初始值 1, 初始值 2, ...};
- 选项 D 的[]中不能指定长度。
14. 数组工具类中的方法描述正确的是 [多选题]
A、sort方法可以实现数组中元素的从大到小排序。
B、toString方法可以实现数组中元素的遍历。
C、binarySearch方法可以实现数组中元素的查找。
D、fill方法可以实现对数组中元素的赋值。
正确答案是:BCD
具体解析如下:
- static void sort(int[] a) 对数组中的元素进行从小到大排序。