Java基本数据类型

Java数据类型

  • Java中的数据类型分为两类,分别是***基本数据类型*** 和 引用数据类型 ,这里先介绍基本数据类型

基本数据类型分类

  • Java中的基本数据类型分为三类,数值型,布尔型字符型
  • 数值型数据分为两类,分别是整数类型浮点数类型
  • 整数类型的默认值为0
  • 浮点数类型的默认值是0.0
  • 布尔型数据的默认值是false
  • 字符型数据的默认值是**’\u0000’**
  • 整数类型包含四种数据类型,按数据储存范围从小到大依次为byte,short,int,和long
  • 浮点类型包含两种数据类型,按数据储存范围从小到大依次为是float和double
  • int型的保存范围为**-2147483648~2147483647**
  • boolean型的保存范围为true和false

如何给一个变量赋值

数据类型 变量名称 = 内容 ;

例子

int num = 10 ;
boolean flag = true ;
double number = 10.1 ;
char c = '葱' ;
String str = "葱头哥" ;

整数类型

  • 整数类型包括
    byte类型 1字节
    short类型 2字节
    int类型 4字节
    long类型 8字节
    提示 一个字节包含八个位(bit)
  • 整数类型的默认类型int型,当数据的数值大于int类型的范围时,就会发生数据溢出现象

数据溢出现象与解决方法

观察数据溢出现象
public class JavaDemo {
    public static void main ( String args [] ) {
        int max = 2147483647 ;	// 把int类型的最大数值赋值给变量max
        int min = -2147483648 ;	// 把int类型的最小数值赋值给变量min
        System.out.println( max + 1 ) ;
        System.out.println( min - 1 ) ;
    }
}
/* 以下为代码执行后输出的内容
 * -2147483648	 max + 1 的结果
 * 2147483647	 min - 1 的结果
 */

观察后可发现,int类型的最大数值加一,结果为int类型的最小数值

int类型的最小数值减一,结果为int类型的最大数值

这种现象就是数据溢出

数据溢出的原因

拿int型数据为例,byte型数据的保存范围为**-128~127**

我们知道,计算机是由许多晶体管组成的,晶体管只有两种状态,通电和断电,分别用1和0表示,因此任何保存在计算机中的数据,归根结底都是由"0"和"1"来表示

byte型数据共有256个,其中的每一个数字与 0000 0000 ~ 1111 1111(=255)中的每一个数字一 一 对应

(byte)0 ~127 用 0000 0000 ~ 0111 1111 来表示

(byte)-128 ~ -1 用 1000 0000 ~ 1111 1111 来表示,也就是说128 ~ 255 这些数字 在计算机内部用来表示 -1 ~ -128,对应关系为-x 与 256 - x 对应

根据以上信息,

  • 我们可以推测出127 + 1 = 128 即二进制的 0b1000 0000 ,但是因为在Java内部 0b 1000 0000 用来表示 -128,因此计算的结果会显示为 -128
  • 当我们计算-128 - 1的时候,实际执行的运算是 0b 1000 0000 - 1即 ,128 - 1 , 实际的结果是 127

因此会有如下现象

public class JavaDemo {
    public static void main ( String args[] ) {
        byte max = 127 ;
        byte min = -128 ;
        System.out.println( max + 1 ) ;
        System.out.println( min - 1 ) ;
    }
}
执行结果:
128
-129
/* 我们发现此时并没有出现数据溢出,因为Java中整型的默认保存类型为int型,
计算结果超出了byte型的保存范围,自动转化为int型,想要观察数据溢出,则需要
把计算结果强制转化为byte型 */
public class JavaDemo {
    public static void main ( String args[] ) {
        byte max = 127 ;
        byte min = -128 ;
        System.out.println( (byte)(max + 1) ) ;
        System.out.println( (byte)(min - 1) ) ;
    }
}
执行结果:
-128
127
数据溢出解决方法

方法一 将int型常量转换成long型常量,在数字后加"L"或者"l"即可,建议加"L",因为"l"和数字"1"容易混淆

方法二 将int型变量转换成long型变量,使用"(long) 变量名称"即可

方法一代码如下所示

public class JavaDemo {
    public static void main ( String args [] ) {
        int max = 2147483647 ;
        int min = -2147483648 ;
        System.out.println( max + 1L ) ;
        System.out.println( min - 1l ) ;
    }
}
/* 以下为代码的输出结果
 * 可以观察到在常量1后加上"L"或者"l"后
 * 输出的结果就是正确结果
 * 2147483648
 * -2147483649
 */

方法二代码如下所示

public class JavaDemo {
    public static void main ( String args [] ) {
        long max = 2147483647 ;
        long min = -2147483648 ;
        System.out.println( max + 1 ) ;
        System.out.println( min - 1 ) ;
    }
}
/* 以下为代码执行后输出的结果
 * 2147483648
 * -2147483649
 * 观察后发现本次计算的结果正确
 */

整数类型的进制

二进制/八进制/十进制/十六进制的数字在Java中都默认保存为int型

  • 二进制用0b表示,比如0b11表示十进制的数字3
  • 八进制用0+数字表示,比如010表示十进制的数字8
  • 十六进制用0x表示,比如0x10表示十进制的数字16
    下面用代码验证一下
public class JavaDemo {
    public static void main(String[] args) {
        int a0 = 10;
        int a1 = 0b1;
        int a2 = 010;
        int a3 = 0x10;
        int a4 = 0xA;
        int a5 = 0xB;
        int a6 = 0xC;
        int a7 = 0xD;
        int a8 = 0xE;
        int a9 = 0xF;
        System.out.println("10 = "+ a0);
        System.out.println("0b1 = "+ a1);
        System.out.println("010 = "+ a2);
        System.out.println("0x10 = "+ a3);
        System.out.println("0xA = "+ a4);
        System.out.println("0xB = "+ a5);
        System.out.println("0xC = "+ a6);
        System.out.println("0xD = "+ a7);
        System.out.println("0xE = "+ a8);
        System.out.println("0xF = "+ a9);
    }
}
执行结果:
10 = 10
0b1 = 1
010 = 8
0x10 = 16
0xA = 10
0xB = 11
0xC = 12
0xD = 13
0xE = 14
0xF = 15

浮点类型

  • Java中任意一个小数常量对应的类型为double,所以在定义浮点型常量的时候尽量定义为double
  • 如果想要定义一个float变量,必须进行强制转换,否则程序将会报错
public class JavaDemo {
    public static void main ( String args [] ) {
        float x = 10.1 ;
        System.out.println( x ) ;
    }
}
程序执行后报错:
JavaDemo.java:3: 错误: 不兼容的类型: 从double转换到float可能会有损失
        float x = 10.1 ;
                  ^
1 个错误

正确的定义float型变量的操作如下

public class JavaDemo {
    public static void main ( String args [] ) {
        float x = (float) 10.1 ;
        float y = 111.2F ;
        System.out.println( x ) ;
        System.out.println( y ) ;
    }
}
执行结果:
10.1
111.2
  • 整型数据不能整除时,使用int型数据输出的结果会抹去小数位,想要得到准确数据,需要把两个中至少一个强制转换为浮点型,则输出的结果为浮点型数据
public class JavaDemo {
    public static void main ( String args [] ) {
        int x = 10 ;
        int y = 3 ;
        System.out.println( x/y ) ;
    }
}
执行结果:
3

结果为整形数据,并非准确计算结果

public class JavaDemo {
    public static void main ( String args [] ) {
        int x = 10 ;
        int y = 3 ;
        System.out.println( (double) x/y ) ;
        System.out.println( x/ (float) y ) ;
    }
}
执行结果:
3.3333333333333335
3.3333333

结果为double型数据和float型数据,我们发现计算结果同Python一样存在不确定尾数

浮点数类型的bug

观察如下代码

public class JavaDemo {
    public static void main(String[] args) {
        float a = 1896541896418915641F;
        double b = a + 1;
        float c = 0.1F ;
        double d = 0.1 ;
        System.out.println(a == b);
        System.out.println(c == d);
    }
}

执行结果:

true
false

实际上,a和b明显不相等,c和d明显相当,但是Java却给出了截然相反的结论

这是浮点数类型的特点决定的,在今后的比较中,最好完全不要对浮点数进行比较

var关键字的使用

Java为静态语言,为了迎合市场需求,JDK1.10后Java出现动态语言支持

例子

public class JavaDemo {
    public static void main ( String args [] ) {
        var x = 10 ;
        var y = 3.14 ;
        System.out.println( x ) ;
        System.out.println( y ) ;
    }
}

字符类型

字符型变量的定义

char 变量名称 = ‘字符’ ;

public class JavaDemo {
    public static void main ( String args [] ) {
        char c = '吴' ;
        System.out.println( c ) ;
    }
}

英文字母和阿拉伯数字的Unicode编码范围

Java中的所有字符都使用的Unicode编码,此类编码可以表示所有字符,包括中文字符Unicode编码占两个字节,能够表示65536个字符(2^16)

大写字母 65(‘A’)~90(‘Z’)

小写字母 97(‘a’)~122(‘z’)

数字 48(‘0’)~57(‘9’)

char与int的相互转换

  • char与int型常量的强制转换,可利用此特点进行大小写字母的转换
public class JavaDemo {
    public static void main ( String args [] ) {
        int num = (int) 'a' ;
        char c = (char) 65 ;
        char C = (char) (65 + 32) ;
        char Z =  (char) ((int) 'z' +32) ;
        System.out.println( num ) ;
        System.out.println( c ) ;
        System.out.println( C ) ;
    }
}
执行结果:
97
A
a

定义中文字符的乱码问题解决方法

定义中文字符编译时会出现如下错误,可以在Javac 后跟上 -encoding UTF-8即可解决

C:\Users\86131\Desktop>javac JavaDemo.java
JavaDemo.java:3: 错误: 编码 GBK 的不可映射字符 (0xB4)
        char c = '鍚?' ;
                   ^
JavaDemo.java:3: 错误: 未结束的字符文字
        char c = '鍚?' ;
                 ^
JavaDemo.java:3: 错误: 未结束的字符文字
        char c = '鍚?' ;
                    ^
3 个错误

C:\Users\86131\Desktop>javac -encoding UTF-8 JavaDemo.java

C:\Users\86131\Desktop>java JavaDemo
吴

注意字符与字符串的区别

C:\Users\86131\Desktop>javac -encoding UTF-8 JavaDemo.java
JavaDemo.java:3: 错误: 未结束的字符文字
        char c = '吴安师大' ;
                 ^
JavaDemo.java:3: 错误: 未结束的字符文字
        char c = '吴安师大' ;
                      ^
JavaDemo.java:3: 错误: 不是语句
        char c = '吴安师大' ;
                   ^
3 个错误

布尔类型

布尔型是一种逻辑结果,主要储存两类数据:true和false

例子

public class JavaDemo {
    public static void main ( String args [] ) {
        boolean flag = true ;
        if ( flag ) {
            System.out.println("判断结果为true时执行此语句") ;
        }
    }
}
执行结果:
判断结果为true时执行此语句

字符串

字符串的定义

String 变量名称 = “字符串” ;

例子

public class JavaDemo {
    public static void main ( String args [] ) {
        String str = "这是一个字符串" ;
        System.out.println(str) ;
    }
}
执行结果:
这是一个字符串

字符串的连接

public class JavaDemo {
    public static void main ( String args [] ) {
        int x = 10 ;
        int y = 11 ;
        boolean flag = true ;
        String str = "结果为" + x + y ;
        String str1 = "结果为" + (x + y) ;
        String str2 = "结果为:" + x * y ;
        String str3 = "结果为" + flag ;
        String str4 = "结果为" + flag + x ;
        System.out.println( str ) ;
        System.out.println( str1 ) ;
        System.out.println( str2 ) ;
        System.out.println( str3 ) ;
        System.out.println( str4 ) ;
    }
}
执行结果:
结果为1011
结果为21
结果为:110
结果为true
结果为true10
  • java中没有把字符串*N次等于把字符串赋值N遍的操作,这样操作在Java中会报错
  • 对于上面代码执行结果的分析
    字符串与整数或者浮点数进行加法运算,输出结果为字符串
    若整数之间用括号先进行数值运算,则数值运算后的结果与原字符串相加产生新字符串
    若表达式中存在乘法运算,则按四则运算顺序,先进行乘法运算,而后进行字符串连接运算
    字符串与布尔型数据相加,结果为字符串
    布尔型数据不可与整型或者浮点型数据进行运算