基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下与基本类型相关的知识。
基本类型共有八种,它们分别都有相对应的包装类。关于它们的详细信息请看下表:
基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:
public class PrimitiveTypeTest {
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("包装类:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("包装类:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("包装类:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("包装类:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
System.out.println("包装类:java.lang.Character");
// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最小值:Character.MIN_VALUE="
+ (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最大值:Character.MAX_VALUE="
+ (int) Character.MAX_VALUE);
}
}
运行结果:
大家将运行结果与上表信息仔细比较就会发现float、double两种类型的最小值与Float.MIN_VALUE、 Double.MIN_VALUE的值并不相同,这是为什么呢?实际上Float.MIN_VALUE和Double.MIN_VALUE分别指的是 float和double类型所能表示的最小正数。也就是说存在这样一种情况,0到±Float.MIN_VALUE之间的值float类型无法表示,0 到±Double.MIN_VALUE之间的值double类型无法表示。这并没有什么好奇怪的,因为这些范围内的数值超出了它们的精度范围。
基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
需要注意的一件事情是,当java编译器计算表达式时,它会按照需要自动提升类型。总的说来,java编译器将表达式中的byte和short类型提升为int类型。如果一个操作数是long类型,那么整个表达式为long类型。类似的,如果一个操作数是float类型,那么整个表达式为float类型。这里面需要注意类型转化。看下面的代码:
byte btye1 = 10; byet byte2 = 20; byte byte3; //错误代码 //byte3 = (btye1 * btye2) / 100; //正确代码 byte3 =(byte) ((btye1 * btye2) / 100);
最后说下字符串,java以类的方式实现字符串,而不是固有的数据类型,这样的优势之一是可以利用字符串对象提供的许多方法。但是字符串是编程的基础部分。
在java中,有两种字符串类:String和StringBuffer。
使用String类创建不能改动的文本字符;使用StringBuffer类创建可以改动的字符串。
String类的重要方法:
1、static String valueOf(基本数据类型):产生基本数据类型参数的字符串表示。这是一个静态方法。同时,为了将字符串转换为数字,可以使用数字包装器类,例如Integer、Long、Float等等,使用Integer.parseInt和Long.parseLong等方法。
2、获取字符串长度 :length()方法
3、字符串连接
1)使用+操作符
2)String concat(Sting str)
StringBuffer类
1、构造器:
StringBuffer():构造一个StringBuffer,其中没有字符,它可以包含16个字符
StringBuffer(int length):构造一个StringBuffer,其中没有字符,它包含字符的数目由给定的length参数决定
StringBuffer(String str):构造一个StringBuffer,它代表和字符串参数相同的字符序列
2、一些重要的方法:
StringBuffer append(参数):在StringBuffer对象后面附加参数代表的字符串
int capacity():得到StringBUffer的容量
char charAt(int index):按照index参数的指定,产生StringBuffer表示的字符序列
StringBuffer delete(int start,int end):删除这个StringBuffer中子字符串中的字符
StringBuffer deleteCharAt(int index):删除这个StringBuffer中给定位置的字符,StringBuffer的长度缩短一个字符