java学习笔记12--基本数据类型

Java语言中的数据类型分为基本类型和引用类型
        基本类型:float double byte short int long char boolean
        引用类型:类类型(String等) 接口类型 数组类型
数据类型本身是描述程序中数据所具备的特点的,同时数据类型也可以用来定义变量,而变量又是用来接收和存储数据的。
所以java中的变量也只有俩大种类:基本类型变量和引用类型变量

计算机中:1字节=8位

基本数据类型又可以分为:整型 浮点类型 布尔类型 字符类型
    整型
    byte        8位(bit)    1字节
    short       16位        2字节
    int           32位        4字节
    long        64位        8字节
 
    浮点类型
    float        32位    4字节
    double    64位    8字节
    
    布尔类型
    boolean   8位    1字节
    
    字符类型
    char        16位    2字节

    注意:java中采用unicode编码,用俩个字节表示一个字符,但是在其他字符编码中可能不是使用俩个字节表示一个字符

boolean
        boolean类型数据的值为true或者false,在JVM中会转换为1或者0
        注意:0代表的是false  1代表的是true
        例如:
        boolean flag = ture;
        boolean bool = false;

char是字符,String是字符串
        String是类类型,而char是基本数据类型(如Integer是类类型,int是基本数据类型)
        一个String是由0个或者n个char组成的

        1)字符编码
            Java语言对文本字符采用Unicode字符编码。由于计算机内存只能存取二进制数据,因此必须为各个字符进行编码。
                例如:a --编码-->0000 0000 0110 0001
        2)常见的字符编码包括:
            a.ASCII字符编码
              ASCII--Amecian Standard Code for Information Interchange(美国信息交换标准代码). 主用于表达现代英语和其他西欧语言中的字符。它是现今最通用的单字节编码系统,它只用一个字节的7位,一共表示128个字符。

            b.ISO-8859-1字符编码
              又称为Latin-1, 是国际标准化组织(ISO)为西欧语言中的字符制定的编码,用一个字节(8位)来为字符编码,与ASCII字符编码兼容。所谓兼容,是指对于相同的字符,它的ASCII字符编码和ISO-8859-1字符编码相同。

            c.GB2312字符编码
              它包括对简体中文字符的编码,一共收录了7445个字符(6763个汉字+682个其他字符). 它与ASCII字符编码兼容。

            d.GBK字符编码
              对GB2312字符编码的扩展,收录了21886个字符(21003个字符+其它字符), 它与GB2312字符编码兼容。

            e.Unicode字符编码:
              由国际Unicode协会编制,收录了全世界所有语言文字中的字符,是一种跨平台的字符编码。
              UCS(Universal Character Set)是指采用Unicode字符编码的通用字符集。
              Unicode具有两种编码方案:
                 用2个字节(16位)编码,被称为UCS-2, Java语言采用;
                 用4个字节(32位)编码,被称为UCS-4;

            f. UTF字符编码
              有些操作系统不完全支持16位或32位的Unicode字符编码,UTF(UCS Transformation Format)字符编码能够把Unicode字符编码转换为操作系统支持的编码,常见的UTF字符编码包括UTF-8, UTF-7和UTF-16.

        3)字符编码表
            每一种字符编码都有一个与之字符编码表,例如在Unicode编码表中十六进制的数字6136对应的汉字是愶
            例如:
            char c = '\u6136';
            System.out.println(c);
        
        4)char值的形式
            Java语言采用Unicode字符编码,字符占2个字节。
            字符a
            二进制数据形式为         0000 0000 0110 0001
            十六进制数据形式为     0x0061
            十进制数据形式为         97
            
            char c = 'a';
            //设定"a"的十六进制数据的Unicode字符编码
            char c = '\u0061';     
            //设定"a"的十六进制数据的Unicode字符编码
            //0x开头的数字位十六进制
            char c = 0x0061;     
            //设定"a"的十进制数据的Unicode字符编码
            char c = 97;            
            //设定"a"的八进制数据的Unicode字符编码
            //0开头的数字为八进制
            char c = 0141;        
            
            注意:一个中文汉字就是一个字符
            char c = '中';

        5)转义字符
            Java编程人员在给字符变量赋值时,通常直接从键盘输入特定的字符,而不会使用Unicode字符编码,因为很难记住各种字符的Unicode字符编码值。

            对于有些特殊字符,比如单引号,如不知道它的Unicode字符编码,直接从键盘输入编译错误:

            //编译出错
            char c = ''';           

            为了解决这个问题,可采用转义字符(\)来表示单引号和其他特殊字符:
                                                    //指单行注释
            char c = '\'';
            char c = '\\';

            转义字符以反斜杠开头,常用转义字符:
            \n           换行符,将光标定位到下一行的开头
            \r            回车,把光标移动到行首(和环境有关)
            \t           垂直制表符,将光标移到下一个制表符的位置
            \\           反斜杠字符
            \'           单引号字符
            \"           双引号字符

        6)空字符串和\u0000
            键盘上任何一个按键都是一个字符,例如回车键、空格键、Esc键、Shift键等等
            
            //空格字符
            char c1 = ' ';

            //字符串s1包含了一个空格字符
            String s1 = " ";
            
            //字符串s2不包含任何字符,即空字符串(不是null)
            String s2 = "";
            
            //这样表示是错误的
            //没有空字符
            char c2 = '';
            
            //这俩个值是一样的,是char类型的默认值
            //只是会占一个字符的位置
            char c3 = 0;
            char c4 = \u0000;

            例如:
            //通过三个字符构建一个字符串
            char[] c1 = {0,0,0};
            String str1 = new String(c1);
            
            //32表示空格
            char[] c2 = {32,32,32};
            String str2 = new String(c2);
            
            //打印效果一样,看起来都是三个空格
            System.out.println(str1);
            System.out.println(str2);
            //字符串的长度也都是3
            System.out.println(str1.length());
            System.out.println(str2.length());
            //false 说明0和32表示的是不一样的
            System.out.println(str1.equals(str2));

整数类型
        byte, short, int和long都是整数类型,并且都是有符号整数(正负)。与有符号整数对应的是无符号整数,两者的区别在于把二进制数转换为十进制整数的方式不一样。
        
        有符号整数把二进制数的首位作为符号数,当首位是0时,对应十进制的正整数,当首位是1时,对应十进制的负整数。对于一个字节(byte)的二进制数, 它对应的十进制数的取值范围是-128~127
        
        无符号整数把二进制数的所有位转换为正整数。对于一个字节(byte)的二进制数, 它对应的十进制数的取值范围是0~255
        
        在Java语言中,为了区分不同进制的数据,八进制数以“0”开头,十六制以“0x”开头,JDK1.7还支持了二进制的直接表示,0b开头
        例如:
            byte b1 = 97;        十进制
            byte b2 = 0141;        八进制
            byte b3 = 0x61;        十六进制
            byte b4 = 0b01100001;    二进制
            
            //都是97打印出来
            System.out.println(b1);
            System.out.println(b2);
            System.out.println(b3);
            System.out.println(b4);
        
        整数类型的默认类型是int,对于给出一个字面值是99的数据,在没有指明这个数据是什么具体的类型的情况下,那么java默认认为是int类型。
        例如:
            //编译报错
            //a+1中a是byte类型,字面值1没有声明类型,那么默认是int
            //byte是8位,int是32位,那么结果是32位的数字
            //b只是一个byte类型的变量,那么只能接收8位的数字
            //修改为int b = a+1;就可以编译通过
            byte a = 1;
            byte b = a+1;

            //编译通过
            //虽然1+1中的1都是默认的int类型
            //但是这个俩个1都是固定的字面值
            //编译器可以判断出其结果是否超出了byte表示的范围
            //上面例子中a+1不能判断出结果的原因是:
            //a是变量,是有可能发生变化的
            byte c = 1+1;

            //编译报错
            //编译器判断出其结果超出了byte的表示范围(-128~127)
            byte d = 1+127;
            
            //编译报错
            //原因:32位的数据赋值给byte类型的变量
            //因为使用的1这些都是字面值,默认是int
            //所以它默认是在前面补了24个0
            byte e = 0b11111111;
            
            //编译通过
            //输出结果为255
            //因为1的前面补了24个0
            int e = 0b11111111;
            
            //编译通过
            //输出结果为-1
            byte f = (byte)0b11111111;

        四种整型类型的声明
            byte  a1 = 1;    (内存中占8位)
            short a2 = 1;    (内存中占16位)
            int   a3 = 1;      (内存中占32位)
            long  a4 = 1L;  (内存中占64位)

            使用long类型数据的时候后面要加大写L或者小写l,建议加上大写的L,因为小写的l和数字1很像似。

        四种整型类型的表示范围
            byte     8位  范围:负2的7次方~2的7次方减1
            short    16位  范围:负2的15次方~2的15次方减1
            int        32位  范围:负2的31次方~2的31次方减1
            long    64位  范围:负2的63次方~2的63次方减1

    12.3 浮点型
        float和double都是java中的浮点型,浮点型可以用来表示小数.
        
        float是32位, 1符号位+8指数位+23尾数位
        double是64位,1符号位+11指数位+52尾数位

        float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的.
        float的精度为7位左右有效数字
        double的精度为16位左右有效数字


        俩种浮点型数据的声明
            //后面加f或者F
            float f = 10.5f;
            //后面加d或者D
            double d = 10.5d;
        

        浮点型的二进制形式
            参考样例:
            float f = 10.5f;
            int b = Float.floatToIntBits(f);
            System.out.println(Integer.toBinaryString(b));


        浮点型的默认类型是double,对于给出一个字面值是10.8的数据,在没有指明这个数据是什么具体的类型的情况下,那么java默认认为是double类型。
            例如:
            //编译通过
            //字面值1.5默认类型是double
            double d = 1.5;
            
            //编译报错
            //字面值1.5默认类型是double
            //double和float的精确度不一样
            float f = 1.5;
            
            //f2编译通过,因为字面值1的类型是int
            //f3编译报错,因为字面值1.5的类型是double
            float f1 = 10.5f;
            float f2 = f1+1;
            float f3 = f1+1.5;
        
        浮点型的精度丢失
            例如:
                System.out.println(1.0-0.66);
                输出结果:
                0.33999999999999997

            Java中的简单浮点数类型float和double不能够进行精确运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。


    要保证精度就要使用BigDecimal类,而且不能直接从double直接转BigDecimal,要将double转string再转BigDecimal。也就是不能使用BigDecimal(double val)方法,而是需要使BigDecimal(String val)方法。
                 (常用于电子商务)
            例如:
            BigDecimal d1 = new BigDecimal("1.0");
            BigDecimal d2 = new BigDecimal("0.66");
            double result = d1.subtract(d2).doubleValue();
            System.out.println(result);
            输出结果:0.34

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值