JAVA的基本类型及自动转换问题

JAVA的基本类型及自动转换问题

488人阅读 评论(0) 收藏 举报
category_icon.jpg 分类:

Java提供了一组基本数据类型,包括

boolean, byte, char, short,  int, long, float, double, void. 

同时,java也提供了这些类型的封装类,分别为

Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void


什么Java会这么做?

在java中使用基本类型来存储语言支持的基本数据类型,这里没有采用对象,而是使用了传统的面向过程语言所采用的基本类在型,主要是从性能方面来考虑的:因为即使最简单的数学计算,使用对象来处理也会引起一些开销,而这些开销对于数学计算本来是毫无必要的。但是在java中,泛型类包括预定义的集合,使用的参数都是对象类型,无法直接使用这些基本数据类型,所以java又提供了这些基本类型的包装器。


java里一共有八大数据类型 boolean(未定) char(2字节) byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节),还有与之对应的包装类 Boolean Character Byte Short Integer Long Float Double, 基本数据与包装类之间的转换叫做装箱与拆箱



        Integer i = new Integer(10);//装箱这个在java1.5之前只能这样new一个出来
        Integer i1 = 10;//java1.5之后可以直接这样初始化一个integer对象出来;
        
        Integer j = new Integer(10);
        int k = j; //这叫做拆箱
    
复制代码

int i 与Integer i 到底有什么区别呢,看程序:

复制代码
        Integer n1 = 127;
        Integer n2 = 127;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

结果是true
     true
     false
     true
java里"=="比较的是对象的地址,而equal比较的是内容,n3与n4比较的结果不以外,那么为什么n1跟n2 "=="比较也是true呢,看数值127 是byte的最大值,java里对于byte范围的数据因为使用多,所以这个对象会放到内存中保存,n1与n2指向的是同一个内存地址,但是超过127或者小于-128结果就是

复制代码
        Integer n1 = -129;
        Integer n2 = -129;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

true
false
false
true

包装类有一些常用的方法,主要就是数据类型转换,除了boolean char之外的构造方法除了构造方法有两种,不过Float有三种。

数制转换方法,用Integer做例子。byteValue();doubleValue();floatValue;intValue;shorValue;这些方法都是拆箱,返回的都是基本数据类型。

反过来 valueOf(int i)是放回包装类的。

 

ps:基本数据类型转换遵循的原则:

  1 容量小的类型自动转换成容量大的数据类型,数据类型按照容量大小排序是

 byte,short,char<int<long<float<double; 注意这是是容量大小不是所占字节数

(例:int是整型,用来表示整数,其值是精确值。

float是浮点型,用来表示实数,其值是近似值。

所以当int转换为float时,是由准确值变成了近似值,所以会丢失精度。

比如int 的1000,转换为浮点型时,可能会被存成1000.00000000001,用来计算或者输出时看不出区别,实际上是已经有变化了。


在32位和64位的编译器中,int和float都是占四字节。

int可以表示范围为-2147483648~2147483647。

float可以表示-3.40E+38 ~ +3.40E+38。

从这个角度上看,float可以表示的范围比int的大太多了,对于比较大的数值,自然就会差距越大。

比如下面的代码)

    

  2 容量大的数据类型转换成容量小的数据类型时,要加上强制转换符,但是可能造成精度降低,或者溢出。

  3 有多种数据类型混合运算是,系统将自动所有数据转换成最大的那个类型,然后进行运算。

  4 实数常量,系统默认为double;

  5 整数常量,系统默认为int;

所以long lg = 10000000000l;后面要加一个l,不然系统会保存因为默认为int就超出范围了


        Integer i = new Integer(10);//装箱这个在java1.5之前只能这样new一个出来
        Integer i1 = 10;//java1.5之后可以直接这样初始化一个integer对象出来;
        
        Integer j = new Integer(10);
        int k = j; //这叫做拆箱
    
复制代码

int i 与Integer i 到底有什么区别呢,看程序:

复制代码
        Integer n1 = 127;
        Integer n2 = 127;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

结果是true
     true
     false
     true
java里"=="比较的是对象的地址,而equal比较的是内容,n3与n4比较的结果不以外,那么为什么n1跟n2 "=="比较也是true呢,看数值127 是byte的最大值,java里对于byte范围的数据因为使用多,所以这个对象会放到内存中保存,n1与n2指向的是同一个内存地址,但是超过127或者小于-128结果就是

复制代码
        Integer n1 = -129;
        Integer n2 = -129;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

true
false
false
true

包装类有一些常用的方法,主要就是数据类型转换,除了boolean char之外的构造方法除了构造方法有两种,不过Float有三种。

数制转换方法,用Integer做例子。byteValue();doubleValue();floatValue;intValue;shorValue;这些方法都是拆箱,返回的都是基本数据类型。

反过来 valueOf(int i)是放回包装类的。

 

ps:基本数据类型转换遵循的原则:

  1 容量小的类型自动转换成容量大的数据类型,数据类型按照容量大小排序是

    byte,short,char<int<long<float<double; 注意这是是容量大小不是所占字节数

  2 容量大的数据类型转换成容量小的数据类型时,要加上强制转换符,但是可能造成精度降低,或者溢出。

  3 有多种数据类型混合运算是,系统将自动所有数据转换成最大的那个类型,然后进行运算。

  4 实数常量,系统默认为double;

  5 整数常量,系统默认为int;

所以long lg = 10000000000l;后面要加一个l,不然系统会保存因为默认为int就超出范围了

0
0
 
 

Java提供了一组基本数据类型,包括

boolean, byte, char, short,  int, long, float, double, void. 

同时,java也提供了这些类型的封装类,分别为

Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void


什么Java会这么做?

在java中使用基本类型来存储语言支持的基本数据类型,这里没有采用对象,而是使用了传统的面向过程语言所采用的基本类在型,主要是从性能方面来考虑的:因为即使最简单的数学计算,使用对象来处理也会引起一些开销,而这些开销对于数学计算本来是毫无必要的。但是在java中,泛型类包括预定义的集合,使用的参数都是对象类型,无法直接使用这些基本数据类型,所以java又提供了这些基本类型的包装器。


java里一共有八大数据类型 boolean(未定) char(2字节) byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节),还有与之对应的包装类 Boolean Character Byte Short Integer Long Float Double, 基本数据与包装类之间的转换叫做装箱与拆箱



        Integer i = new Integer(10);//装箱这个在java1.5之前只能这样new一个出来
        Integer i1 = 10;//java1.5之后可以直接这样初始化一个integer对象出来;
        
        Integer j = new Integer(10);
        int k = j; //这叫做拆箱
    
复制代码

int i 与Integer i 到底有什么区别呢,看程序:

复制代码
        Integer n1 = 127;
        Integer n2 = 127;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

结果是true
     true
     false
     true
java里"=="比较的是对象的地址,而equal比较的是内容,n3与n4比较的结果不以外,那么为什么n1跟n2 "=="比较也是true呢,看数值127 是byte的最大值,java里对于byte范围的数据因为使用多,所以这个对象会放到内存中保存,n1与n2指向的是同一个内存地址,但是超过127或者小于-128结果就是

复制代码
        Integer n1 = -129;
        Integer n2 = -129;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

true
false
false
true

包装类有一些常用的方法,主要就是数据类型转换,除了boolean char之外的构造方法除了构造方法有两种,不过Float有三种。

数制转换方法,用Integer做例子。byteValue();doubleValue();floatValue;intValue;shorValue;这些方法都是拆箱,返回的都是基本数据类型。

反过来 valueOf(int i)是放回包装类的。

 

ps:基本数据类型转换遵循的原则:

  1 容量小的类型自动转换成容量大的数据类型,数据类型按照容量大小排序是

 byte,short,char<int<long<float<double; 注意这是是容量大小不是所占字节数

(例:int是整型,用来表示整数,其值是精确值。

float是浮点型,用来表示实数,其值是近似值。

所以当int转换为float时,是由准确值变成了近似值,所以会丢失精度。

比如int 的1000,转换为浮点型时,可能会被存成1000.00000000001,用来计算或者输出时看不出区别,实际上是已经有变化了。


在32位和64位的编译器中,int和float都是占四字节。

int可以表示范围为-2147483648~2147483647。

float可以表示-3.40E+38 ~ +3.40E+38。

从这个角度上看,float可以表示的范围比int的大太多了,对于比较大的数值,自然就会差距越大。

比如下面的代码)

    

  2 容量大的数据类型转换成容量小的数据类型时,要加上强制转换符,但是可能造成精度降低,或者溢出。

  3 有多种数据类型混合运算是,系统将自动所有数据转换成最大的那个类型,然后进行运算。

  4 实数常量,系统默认为double;

  5 整数常量,系统默认为int;

所以long lg = 10000000000l;后面要加一个l,不然系统会保存因为默认为int就超出范围了


        Integer i = new Integer(10);//装箱这个在java1.5之前只能这样new一个出来
        Integer i1 = 10;//java1.5之后可以直接这样初始化一个integer对象出来;
        
        Integer j = new Integer(10);
        int k = j; //这叫做拆箱
    
复制代码

int i 与Integer i 到底有什么区别呢,看程序:

复制代码
        Integer n1 = 127;
        Integer n2 = 127;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

结果是true
     true
     false
     true
java里"=="比较的是对象的地址,而equal比较的是内容,n3与n4比较的结果不以外,那么为什么n1跟n2 "=="比较也是true呢,看数值127 是byte的最大值,java里对于byte范围的数据因为使用多,所以这个对象会放到内存中保存,n1与n2指向的是同一个内存地址,但是超过127或者小于-128结果就是

复制代码
        Integer n1 = -129;
        Integer n2 = -129;
        Integer n3 = new Integer(10);
        Integer n4 = 10;
        System.out.println(n1.equals(n2));
        System.out.println(n1==n2);
        
        System.out.println(n3==n4);
        System.out.println(n3.equals(n4));
    
复制代码

true
false
false
true

包装类有一些常用的方法,主要就是数据类型转换,除了boolean char之外的构造方法除了构造方法有两种,不过Float有三种。

数制转换方法,用Integer做例子。byteValue();doubleValue();floatValue;intValue;shorValue;这些方法都是拆箱,返回的都是基本数据类型。

反过来 valueOf(int i)是放回包装类的。

 

ps:基本数据类型转换遵循的原则:

  1 容量小的类型自动转换成容量大的数据类型,数据类型按照容量大小排序是

    byte,short,char<int<long<float<double; 注意这是是容量大小不是所占字节数

  2 容量大的数据类型转换成容量小的数据类型时,要加上强制转换符,但是可能造成精度降低,或者溢出。

  3 有多种数据类型混合运算是,系统将自动所有数据转换成最大的那个类型,然后进行运算。

  4 实数常量,系统默认为double;

  5 整数常量,系统默认为int;

所以long lg = 10000000000l;后面要加一个l,不然系统会保存因为默认为int就超出范围了

猜你喜欢

转载自blog.csdn.net/Alpha_Paser/article/details/74015279