Skip to content
0

JavaSE - 数据类型

数据类型

Java 是一种强类型语言,每个变量都必须声明其类型。

扩展:各种字符集和编码详解(https://www.cnblogs.com/cmt/p/14553189.html)

1、强弱类型语言

  • 强类型语言

    强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括 Java、.net 、Python、C++等语言。

    举个例子:定义了一个整数,如果不进行强制的类型转换,则不可以将该整数转化为字符串。

  • 弱类型语言

    弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括 vb 、PHP、javascript 等语言。

    在 VB Script 中,可以将字符串‘12’和整数 3 进行连接得到字符串‘123’,也可以把它看成整数 123,而不需 要显示转换。是不是十分的随便,我们 Java 就不是这样的。

  • 区别

    无论是强类型语言还是弱类型语言,判别的根本是是否会隐性的进行语言类型转变。强类型语言在速度上略逊于弱类型语言,但是强类型定义语言带来的严谨性又能避免不必要的错误。

2、数据类型

Java 的数据类型分为两大类:基本类型(primitive type)和引用类型 (reference type)

【注:引用数据类型的大小统一为 4 个字节,记录的是其引用对象的地址!】

如果你看到这一堆头疼的话,没关系,不用记,JDK 中类型对应的包装类都帮忙写好了,我们需要时候可 以直接看到!可以把以下代码拷贝进行查看结果:

java
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);
}

字节相关知识:

位(bit):是计算机 内部数据 储存的最小单位,11001100 是一个八位二进制数。

字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示。

​ 1B(byte,字节)= 8bit(位)

字符:是指计算机中使用的字母、数字、字和符号

ASCIIS 码:

内容占用大小
1 个英文字符(不分大小写)1 个字节
1 个中文汉字2 个字节
1 个 ASCII 码1 个字节

UTF-8 编码:

内容占用大小
1 个英文字符1 个字节
英文标点1 个字节
1 个中文(含繁体3 个字节
中文标点3 个字节

Unicode 编码:

内容占用大小
1 个英文字符2 个字节
英文标点2 个字节
1 个中文(含繁体2 个字节
中文标点2 个字节

1bit 表示 1 位 1Byte 表示一个字节

1B=8b 1024B=1KB 1024KB=1M 1024M=1G


那有人会问:电脑的 32 位和 64 位的区别是什么呢?

  • 32 位操作系统只可以使用 32 位的 cpu,而 64 位的 CPU 既可以安装 32 位操作系统也可以安装 64 位操作 系统。

  • 寻址能力简单点说就是支持的内存大小能力,64 位系统最多可以支达 128 GB 的内存,而 32 位系统最 多只可以支持 4G 内存。

  • 32 位操作系统只可以安装使用 32 位架构设计的软件,而 64 位的 CPU 既可以安装使用 32 位软件也可以 安装使用 64 位软件。

  • 现在的电脑都是 64 位了!

回到正题,我们了解了这些知识后,我们自己定义一些变量来看!

java
public static void main(String[] args) {
    //整型
    int i1=100;
    //长整型
    long i2=998877665544332211L;
    //短整型
    short i3=235;
    //浮点型
    double d1=3.5; //双精度
    double d2=3;
    float f1=(float)3.5; //单精度
    float f2=3.5f; //单精度
    //布尔类型 boolean true真/false假
    boolean isPass=true;
    boolean isOk=false;
    boolean isBig=5>8;
    if(isPass){
    System.out.println("通过了");
    }else{
    System.out.println("未通过");
    }
    //单字符
    char f='女';
    char m='男';
}

Java 语言的整型常数默认为 int 型,浮点数默认是 Double

3、整型拓展

在我们计算机中存在很多进制问题,十进制,八进制,十六进制等等的问题,他们怎么表示呢?

  • 十进制整数,如:99,-500,0。

  • 八进制整数,要求以 0 开头,如:015。

  • 十六进制数,要求 0x 或 0X 开头,如:0x15 。

演示:

java
//整型
int i= 10;
int i2= 010;
int i3= 0x10;
System.out.println(i); //10
System.out.println(i2); //8
System.out.println(i3); //16

4、浮点型拓展

【金融面试问:银行金融业务用什么类型表示?】

浮点类型 float,double 的数据不适合在不容许舍入误差的金融计算领域。

如果需要进行不产生舍入误差的精确数字计算,需要使用 BigDecimal 类。

java
public static void main(String[] args) {
    float f = 0.1f;
    double d = 1.0/10;
    System.out.println(f==d); //false

    float d1 = 2131231231f;
    float d2 = d1+1;
    if(d1==d2){
        System.out.println("d1==d2");
    }else{
        System.out.println("d1!=d2");
    }
}

最后运行结果:

false d1==d2

主要理由:

由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很 多数字无法精确表示,其结果只能是接近,但不等于;二进制浮点数不能精确的表示 0.1,0.01,0.001 这样 10 的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。

大数值:Java.math 下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数 值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。

浮点数使用总结:

  1. 默认是 double
  2. 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需 要使用 BigDecimal 类。
  3. 避免比较中使用浮点数

5、字符型拓展

单引号用来表示字符常量。例如‘A’是一个字符,它与「A」是不同的,「A」表示一个字符串。

char 类型用来表示在 Unicode 编码表中的字符。

Unicode 编码被设计用来处理各种语言的所有文字,它占 2 个字节,可允许有 65536 个字符;

科普:2 字节=16 位,2 的 16 次方=65536,我们用的 Excel 原来就只有这么多行,并不是无限的

【代码演示:字符转 int 看结果】

java
public static void main(String[] args) {
    char c1 = 'a';
    char c2 = '中';
    System.out.println(c1);
    System.out.println((int) c1); //97
    System.out.println(c2);
    System.out.println((int) c2); //20013
}

Unicode 具有从 0 到 65535 之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode)

java
char c3 = '\u0061';
System.out.println(c3); //a

Java 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义,有如下常用转义字符:

【以后我们学的 String 类,其实是字符序列(char sequence)。在这里给大家一个思考题】

java
//代码1
String sa=new String("Hello world");
String sb=new String("Hello world");
System.out.println(sa==sb); // false
//代码2
String sc="Hello world";
String sd="Hello world";
System.out.println(sc==sd); // true

大家可以先思考下为什么,之后我们学到对象的时候,会给大家进行内存级别的分析,那时候你会恍然 大悟!

6、布尔型拓展

boolean 类型(一位,不是一个字节),就是 0|1

boolean 类型有两个值,true 和 false,不可以 0 或非 0 的整数替代 true 和 false ,这点和 C 语言不同。

boolean 类型用来判断逻辑条件,一般用于程序流程控制。

java
boolean flag = false;
if(flag){
    // true分支
}else{
    // false分支
}

【编码规范:很多新手程序员喜欢这样写】

java
if (is == true && un == false ) {...}

只有新手才那么写。对于一个熟练的人来说,应该用如下方式来表示:

java
if ( is && !un ) {....}

前面加个 ! 表示否定

这点都不难理解吧。所以要习惯去掉所有的==fasle 和 ==true。Less is More!! 代码要精简易读!

最近更新