您的位置:首页 > 编程语言 > Java开发

Java 7之基础类型第1篇 - Java数据类型

2014-02-23 20:23 169 查看

一、数据类型

Java主要有如下几种数据类型



1.整数类型

   1) 在Java中,整数类型共有4种,它们有固定的表述范围和字段长度,且不受具体的操作系统的影响,保证了Java的跨平台性

   2) Java语言中,整数有三种表现形式,分别是:

    a. 十进制整数,如 120, -31, 0

    b. 八进制整数,要求以0开头(注意这是数字0,不是字母o),如:012,

    c. 十六进制整数,要求以0x开头(注意这是数字0,不是字母o),如: 0x12

   3) Java语言中,默认的整数类型是int类型,声明long类型的时候,后面必须要加个l或者L

   4) Java中四种整数类型的表述范围:



有必要说明一下表数范围,以byte类型为例:
由于byte是8位的,当最高位为符号位时,表示的最大整数就是二进制:0111-1111,也就是2^7-1=127
而能够表示的最小负数的二进制表示形式为:1111-1111,按理说应该为-127.但是我们都知道byte占8位。则不同的组合为2的8次方等于256,也就是byte最多可以表示256个不同的数,

0~127:128个

-0~127:128个

但是这里0与-0表示一样的数了,所以就用-0的二进制补码表示到-128里面去了。(注意:0与-0的二进制表示形式不一样,一个为0000-0000,另外一个为1000-0000)其他的就类似了。

2.浮点类型

   1) 与整数类型一样,同样有固定的表述范围和字段长度,且不受具体的操作系统的影响,保证了Java的跨平台性

   2) Java语言中,浮点类型有两种表现形式,分别是:

    a. 十进制数形式, 如3.14

    b. 科学计数法,如,3.14e2, 3.14e-2, -3.14E2

   3) Java语言中,默认的浮点数类型是double,声明float类型的时候,后面必须添加字母f或者F,如3.14F,3.14f。

   例如:float a=5.6f;//直接将5.6给float赋值是错误的,5.6默认的类型为double。

        而如果将float a=5;这样复制后,编译就不会报错,只是将5看作默认的double类型,打印输出值为5.0。

   4) Java中两种浮点类型的表述范围:



其实在实际的应用中,如果要进行精确的小数计算或者是大数计算,建议使用java.math.BigDecimal类。例如使用这个类进行除法的计算:

public static double div(double v1,double v2) {
return div(v1,v2,10);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
*/
public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}


3. 字符类型

   1) 字符类型是用''单引号括起来的单个字符,例如char c = 'w'; char a = '中',可以看到Java中的char类型是可以表示中文字符的;

   2) Java字符采用Unicode(全球语言统一编码)编码,每个字符占两个字节,因而可用16进制编码形式表示,如:char c = '\u0061'

   3) Java中允许使用转义字符'\'将其后面的字符转换成其他含义, 如: char c = '\n';  //表示换行

 4.布尔类型

   1) boolean类型的值只有两种:true,false

   2) boolean类型不可以转换为其他的数据类型,所以有过C语言编程基础的人可能认为1也能在Java中表示为true,这是错误的。

在C语言中是不存在bool类型的,但是0可以表示假,任何的非0可以表示真,包括负数。

5.基本数据类型的转换

   1) boolean不可以转换为其他的数据类型

   2) 整数型,浮点类型,字符型是可以相互转换的,转换时遵守下面的原则:

    a. 容量小的类型自动转换为大的类型,数据类型按容量大小排序为:

     byte, short, char < int < long <float < double

    b. byte, short, char 三种类型间不会相互转换,他们三者在计算时,首先会转换为int类型

    c. 容量大的类型在转换为小的类型的时候,必须加上强制转换符,此时可能造成精度降低或者溢出问题

    d. 有多种数据类型混合计算的时候,系统首先自动转换为容量最大的那个类型再来继续计算

    e. 实数类型默认为double类型,如, 1.2; 整数类型默认为int类型,如 1

如图所示:



二、数据类型对应的包装类

先介绍Java基本类型对应的8个包装类型,如下图所示。



为什么要使用包装类型呢?
1. 更加体现了面向对象的特点,有人说java不是纯面向对象语言,纯度只有百分之九十,就是因为java中仍然使用了基本数据类型和static。而包装类的出现,则更好的体现了面向对象的设计理念。

2. 由于包装类型本质是一个类,有属性有方法,所以就比基础类型的功能强大了许多。假如需要将一个字符串的类型转化为整数,这时候怎么办?就需要包装类型的方法了。

String x="123";
int p=Integer.parseInt(x);
Integer p2=new Integer(x);

3.在jdk1.5之后,出现了自动拆箱和自动装箱,大大的缩减了繁琐的代码,更加方便了代码的编程

int a = 3;
Collection c = new ArrayList();
c.add(a);  // 自动转换成Integer.
Integer b = new Integer(2);
c.add(b + 2);// 这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.

下面是包装类型中共有的一些方法,这些方法也是在项目开发中经常使用的。

1、带有基本值参数并创建包装类对象的构造函数.如可以利用Integer包装类创建对象,Integer obj=new Integer(145);

2、带有字符串参数并创建包装类对象的构造函数.如new Integer("-45.36");

3、可生成对象基本值的typeValue方法,如obj.intValue();

4、将字符串转换为基本值的 parseType方法,如Integer.parseInt(args[0]);

5、生成哈稀表代码的hashCode方法,如obj.hasCode();

6、对同一个类的两个对象进行比较的equals()方法,如obj1.eauqls(obj2);

这里的equals()方法比较的原始的基础类型,其jdk7原代码如下:

public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}


7、生成字符串表示法的toString()方法,如obj.toString().

三、注意问题

1、int和Integer区别    

(1)包装类和原始类型的区别。int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类,类中提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,能够表示整数的最大值和最小值的常量等等。

(2)初始默认值不同。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。

    在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

    在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息