Java基础3月15号-Java八种数据类型

1.1、数据类型有什么用,

 *    数据类型用来声明变量,程序在运行过程中根据不同的数据类型分配不同大小的空间
 *    int i = 10;
 *    double d = 1.23
 *    那么i变量和d变量类型不同,分配的空间大小就不同。
 *

1.2、数据类型在java语言中包括两种:

 *    第一种:基本数据类型
 *        基本数据类型又可以划分为4大类8小种:
 *            第一类:整数型  byte(1个字节),short(2),int(4),long(8)
 *            第二类:浮点型  float,double
 *            第三类:布尔型  boolean  只有两个值true和false,true表示真,false表示假
 *            第四类:字符型  char    java中规定字符字面量必须使用单引号括起来,属于文字。
 *        8小种:
 *            byte,short,int,long
 *            float,double
 *            boolean
 *            char
 *
 *    第二种:应用数据类型
 *        字符串型String属于引用数据类型,他不属于基本数据类型范畴,java中除了基本数据类型之外,剩下的都是引用数据类型。

1.3、8种基本数据类型分类

 *     整数型:byte,short,int,long有什么区别
 *     浮点型:float和double有什么区别
 *     区别:占用的空间大小不同
 *
 *     关于计算机存储单位?
 *         计算机只能识别二进制。(10010010011100.....)
 *         1字节 = 8bit(8比特) ---> 1byte = 8bit
 *         1bit就是一个1或0
 *
 *         byte b = 2;  在计算机中是这样表示的:00000010
 *         short s = 2;在计算机中是这样表示的:00000000 00000010
 *         int i = 2;   在计算机中是这样表示的:00000000 00000000 00000000 00000010;
 *
 *         类型         占用字节数量
 *         ---------------------------------
 *         byte            1
 *         short           2
 *         int             4
 *         long            8
 *         float           4
 *         double          8
 *         boolean         1
 *         char            2

在这里插入图片描述

1.4、byte类型的取值范围?

    byte[-128 ~ 127]共可以标识256个不同的数字。
    byte类型的最大值是怎么计算出来的(27次方-1)?
      byte1个字节,是8个比特位,所以byte可以存储的最大值是:01111111
     注意:在计算机当中,一个二进制位最左边的是符号位,当为0时表示正数,当为1时表示负数。所以byte类型最大值是:01111111,那么是不是27次方-1呢?

   有几个取值范围是需要记住的
      (1个字节)byte[-128 ~ 127]
      (2个字节)short[-32768 ~ 32767]  加起来也是可以表示65535个不同的数字
      (4个字节)int[-2147483648 ~ 2147483647]
      (2个字节)char[0~65535]   char不是字符吗,怎么和数字挂钩了呢?再是汉字,底层存储的也是二进制的方式。可以表示65535个不同的数字

     shortchar实际上容量相同,不过char可以标识更大的数字。因为char表示的是文字,文字没有正负之分,所以char可以表示更大的数字。

1.5、对于8种基本数据类型来说

 *      其中byte,short,int,long,float,double,boolean,这7种类型计算机表示起来比较容易,因为他们都是数字。其中布尔类型只有两个值true和false,
 *      实际上true和false分别在C++中对应的是1和0,1为true,false为0.
 *      
 *      对于char类型来说计算机表示起来就比较麻烦,因为char对应的是文字,每一个国家的文字都不一样,文字不能直接通过“自然算法”转换成二进制。
 *      这个时候怎么办呢?这个时候字符编码就诞生了。
 * 
 *      什么是字符编码?
 *          字符编码是人为(某个计算机协会)定义的一套转换表,
 *          在字符编码中规定了一系列的文字对应的二进制。
 *          字符编码其实本质上就是一本字典,该字典中描述了文字与二进制之间的对照关系。
 *
 *      字符编码涉及到编码和解码两个过程,编码和解码的时候必须采用同一套字符编码方式,不然就会出现乱码。
 *          关于字符编码的发展过程?
 *          起初计算机是不支持文字的,只支持科学计算。实际上计算机最开始时为了战争而开发的,是为了计算导弹的运动轨迹...
 *
 *          后来随着计算机的发展,计算机开始支持文字,最先支持的文字是英文,英文对应的字符编码方式是:ASCII吗。
 *
 *          ASCII码采用1byte进行存储,因为英文字母只有26个。(键盘上所有的键全部加起来也不超过256个。
 *          1byte可以表示256种不同的情况。所以英文本身在计算机方面就占有优势。)
 *              'a' -----> 97(采用ASCII码进行编码)---> 01100001---(采用ASCII码进行解码)--->'a'
 *              'b' -----> 98
 *              'c' -----> 99
 *               ......
 *              'A' -----> 65
 *              'B' -----> 66
 *               ......
 *              '0' -----> 48
 *
 *          随着计算机语言的发展,后来国际标准组织制定了ISO-8859-1编码方式,又称为latin-1编码范式,向上兼容ASCII码,但不支持中文
 *
 *          后来发展到亚洲,才支持中文,日文,韩文.....
 *          中文的编码方式(简体中文):GB2312 < GBK < GB18030 (容量的关系)
 *          繁体中文:big5 (台湾使用的大五码)
 *
 *          Java语言为了支持全球所有的文字,采用了一种字符编码方式叫 unicode编码。unicode编码统一了全球所有文字,支持所有语言。
 *          unicode的具体实现包括:UTF-8 UTF-16 UTF-32

字符型:char

/**
 * @author lei
 * @date 2023-03-16 14:08
 * @description  字符型:char
 *                1.char占用2个字节
 *                2.char的取值范围是:[0~65535]
 *                3.char采用unicode编码方式
 *                4.char类型的字面量使用单引号括起来
 *                5.char可以存储一个汉字
 */
public class DataTypeCharTest02 {
    public static void main(String[] args) {
        /**
         * char类型可以存储一个汉字吗?
         * 可以的,汉字占用两个字节,java中的char类型占用2个字节,正好。
         */
        char c1 = '中';
        System.out.println(c1);
        char c2 = 'a';
        System.out.println(c2);
        //0如果加上单引号的话,0就不是数字0了,就是文字0了,此时他就是一个字符了
        char c3 = '0';
        System.out.println(c3);

        //不兼容的类型: java.lang.String无法转换为char
        char c4 = "a"; //这种赋值是错误的,双引号是String变量,
        
        /**
         * 未结束的字符文字,不是语句;java解析c5这个变量时,人为a后面应该是单引号,结果没找到所以就报错不是语句
         * 归根结底还是因为char类型只能容纳一个字符,注意是一个字符,
         * 经过此时我个人认识,不如说char类型是一个只能容纳一个字符的类型,这个字符的最大容量不能超过个2字节。
         */
        char c5 = 'ab';
    }
}

在这里插入图片描述
在这里插入图片描述

转义字符

正斜杠“/”反斜杠“\” 上坡为正,下坡为反。

/**
 * @author lei
 * @date 2023-03-16 15:38
 * @description 转义字符
 */
public class TransitionCharTest03 {

    /**
     * Java语言中斜杠“\”负责转义。
     *  "\t"表示制表符tab
     * @param args
     */
    public static void main(String[] args) {
        char c1 = 't';
        System.out.println(c1);

        /**
         * 经过测试,'\t'不是两个字符串,而是一个字符,不要被里面的t字母蒙蔽,眼睛看到的并不一定是真的
         * 这里'\t'则表示的是制表符,就是键盘上的tab键的功能。
         * 你就理解成,在这里'\t'被定义成了一个制表的功能。
         */
        char c2 = '\t';
        System.out.println(c2);
        System.out.println("abcdtefg");
        /**
         * 斜杠'\'的出现会将紧挨着的后面的字符进行转义。
         * '\t':制表
         * '\n':换行
         */
        System.out.println("abcd\tefg");//t前面加上一个斜杠,t就不是t了,就是一个转义成两个字符合起来的制表符的含义了
        System.out.println("abcd\nefg");
        System.out.println('\'');
        System.out.println('\\');
        System.out.println("\"test\"");
    }
}

在这里插入图片描述
在这里插入图片描述
思考
假设想在控制台输出一个单引号,输出一个斜杠,输出一个带双引号的“test”
在这里插入图片描述
\u反斜杠U表示后面的是一个字符的unicode编码,unicode编码是十六进制的。
在这里插入图片描述

包装类的意义

如果某个方法参数是Object类型的,那该方法是不接受八大基本数据的,Object接受的对象,而八大基本数据不是对象,八大基本数据类型只是Java关键字,你会发现八大基本数据类型是没有源码,就是你用鼠标是点不进去的。而包装类如Integer就有源码,
在这里插入图片描述
在这里插入图片描述

为什么Java要给八大基本类型提供包装类
  1.面相对象要求:Java是面相对象的编程语言,要求所有的数据都应该是对象。但是八大基本数据类型不是对象,它们没有成员方法和其他面相对象的特征。
    因此Java为八大基本数据类型提供了包装类,使得它们具有面相对象的特征。
  2.泛型要求:泛型是Java中很重要的特征,它提供了类型安全和代码重用的功能,但是泛型要求类型参数必须是对象类型,不能是基本数据类型。
    因此如果想在泛型中使用基本数据类型就需要使用对应的包装类。
  3.null值表示:包装类可以表示null值,而基本数据类型不能。这在开发中前后端联调传参时很有用,
    使用包装类的参数即使前端不传参也不会报错,而基本数据类型就很报错。
    还比如有时候,某个字段没有值就没有值,不希望系统会有默认值,而int类型就有默认值0
                                                                          --摘自磊哥聊Java

在这里插入图片描述

装箱和拆箱

装箱:将基本数据类型转化为包装类的过程叫装箱
     比如 intInteger  longLong
拆箱:将包装类转化为基本数据数据类型的过程叫拆箱

JDK1.5之后已经实现了自动装箱和拆箱

Integer包装类

在这里插入图片描述

Java中为了提高程序的执行效率,将[-128~127]之间所有的包装对象提前创建好,放在了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据就不想哟new了,直接从整数型常量池当中取出来。以上截图中:x变量中保存的对象的内存地址和y变量中保存的对象的内存地址是一样的(如下图)。“==”永远判断的都是两个对象的内存地址是否相同。

Integer的内存结构
在这里插入图片描述

Integer缓存源码

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

Integer常用方法

parseInt():将字符串类型的数字转换成int
   //Integer常用方法
   int retValue = Integer.parseInt("123");
   System.out.println(retValue + 100);//223

   //静态的:int --> Integer
   Integer i1 = Integer.valueOf(100);
   System.out.println(i1);
   //静态的:String --> Integer
   Integer i2 = Integer.valueOf("200");
   System.out.println(i2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值