006.数据类型

数据类型

编写的代码,是后缀名为(.java)的文件。被JDK编译后能够运行的文件后缀为(.class)。这些文件都是有大小的,占用着你的硬盘。你写的代码越多,文件占用越多。这些文件都是静态的。

当程序被运行起来的时候,虚拟机都会把class文件加载到内存里,因为内存的读写速度比硬盘快很多.快多少呢,你就当成人走路和汽车飞机比吧.本身内存的产量有限,技术限制,所以内存比硬盘贵很多。

我们加载class文件,就是加载我们定义的类,类本身会有定义,占用空间,同时类中定义的方法,变量也会占用空间。我们重点关注的一般是变量占用的空间。这也是经常出问题的地方。

先从变量的基本数据类型说起。

Java中基本数据类型有byte(字节型),short(短整型),int(整型),long(长整型),float(单精度浮点数),double(双精度浮点数),char(字符型),boolean(布尔型),它们都会占用内存空间.

十进制与二进制

十进制

生活中,我们说的都是十进制,三位长度的整数,能代表多少数字?000~999。算上负数,就是 -999~999。

最大值:10^3 - 1

最小值:-(10^3 - 1)

同样的,4位长度 (-9999~9999),8位长度 (-99999999 ~ 99999999),16位长度(-9999999999999999 ~ 9999999999999999),就是修改指数大小,可以得到表示的范围,以及最大值和最小值。

十进制就是0,1,2,3,4,5,6,7,8,9组成的数。以加法为例,就是在对应位为9的时候,再加1就需要进位。比如:

09 + 01 = 10, 099 + 001 = 100, 099 + 010 = 109

十进制的值,比如9999,其实可以拆成:9000+ 900 + 90 + 9 = 9*10^3 + 9*10^2 + 9*10^1 + 9*10^0 = 9999

二进制

这个概念作为计算机基础,很重要。对于正常开发人员,只要知道概念就好

对于二进制呢,就是只能由0,1组成的数。至于为什么只能由0,1组成呢,这是硬件技术的限制。

那么, 0(二进制)= 0(十进制)

​ 1(二进制)= 1(十进制)

当再加1的时候,就需要进位,01 + 1 = 10 (二进制)= 2 (十进制)

同样的, 11(二进制)= 3(十进制)

​ 100 (二进制)= 4(十进制)

​ 101 (二进制)= 5(十进制)

​ 110 (二进制)= 6(十进制)

​ 111 (二进制)= 7(十进制)

​ 1000 (二进制)= 8(十进制)

​ ……

比如对于长度为4位数的1011(二进制),对应十进制计算方式为:1*2^3 + 0 * 2^2 + 1 *2^1 + 1 *2^0 = 11 (十进制)

对于总长度为n的二进制值大小就依次类推。

最大值为 2^n -1

最小值为:-(2^n - 1)

计算机中的二进制

计算机中之所以由0,1组成,是因为电子器件表示开和关,或者高电压和低电压这两种状态比较稳定。

那么表示0和1的一个单位叫做bit(比特),计算机中存储表示数据一般以8个bit为单位,既一个Byte(字节)。

1024Byte = 1KB, 1024KB = 1MB, 1024MB = 1GB, 1024GB = 1TB, 1024TB = 1PB

另外在数据传输时大多是以“位”(bit“比特”)为单位,所以你家里的百兆宽带都是100Mb。是小b。

Java中的基本数据类型

byte类型

在Java中的byte,是基本数据类型,大小是8位,既一个Byte。然后取最高位为符号位,即0表示正,1表示负。

那么Java中byte的最大值:0111 1111 = 1* 2^6 + 1 * 2^5 + 1 * 2^4 + + 1 * 2^3 ++ 1 * 2^2 ++ 1 * 2^1 ++ 1 * 2^0 = 127 (十进制)

零的表示: 0000 0000 = 0 (十进制)

最小值(源码方式): 1111 1111 = -127 (十进制)

实际上在计算机中,负数的表示一般不用原码,而是用反码和补码的概念。这里就不细讲了,知道下面的代码怎么用就行

所以byte类型的最小值为 -128

运行如下代码:(项目路径:src\main\java\github\brad\easy\a006\A01_Byte.java)

public class A01_Byte {
    public static void main(String[] args) {
        //这里的Byte是一个包装类,后面会讲到.值上等价于基本类型.同理后面的Short,Integer,Long,Float,Double,Boolean.
        System.out.println("基本类型:byte,二进制位数:" + Byte.SIZE);
        System.out.println("最大值:" + Byte.MAX_VALUE);
        System.out.println("最小值:" + Byte.MIN_VALUE);
        //定义一个byte
        byte a = 20;
        //定义一个班级的人数
        int b = 50;
        System.out.println(b);
    }
}

**备注:**byte占用空间很小只有8位,一般都是用在比较大的数组中,节约空间,只有short的一半,int的四分之一。

short(短整型)

byte太小了,有些场景不够用,于是就有了2个字节的short。

short 数据类型是 16 位、有符号的以二进制补码表示的整数。

运行如下代码:

public class A02_Short {
    public static void main(String[] args) {
        //这里的Short是一个包装类
        System.out.println("基本类型:short,二进制位数:" + Short.SIZE);
        System.out.println("最大值:" + Short.MAX_VALUE);
        System.out.println("最小值:" + Short.MIN_VALUE);
        //定义一个整型
        short a = 10;
        //定义学校的人数
        short student = 11100;
        System.out.println(student);
    }
}

int(整型)

short一样有些场景不够用,于是有了4个字节的int。

int 数据类型是32位、有符号的以二进制补码表示的整数

运行如下代码:

public class A03_Int {
    public static void main(String[] args) {
        //这里的Integer是一个包装类,后面会讲到.值上等价于基本类型.同理后面的Long,Double,Boolean.
        System.out.println("基本类型:int,二进制位数:" + Integer.SIZE);
        System.out.println("最大值:" + Integer.MAX_VALUE);
        System.out.println("最小值:" + Integer.MIN_VALUE);
        //定义一个整型
        int a = 10;
        //定义一个城市的人数
        int cityPeople = 5000000;
        //定义一个人很穷,资产是负整数
        int fortune = -100;
        System.out.println(fortune);
    }
}

long(长整型)

int一样有些场景不够用,于是有了8个字节的long。

long 数据类型是 64 位、有符号的以二进制补码表示的整数

运行如下代码:

public class A04_Long {
    public static void main(String[] args) {
        System.out.println("基本类型:long,二进制位数:" + Long.SIZE);
        System.out.println("最大值:" + Long.MAX_VALUE);
        System.out.println("最小值:" + Long.MIN_VALUE);
        //定义一个长整型
        long a = 60L; //有一个尾巴L,表示是长整型.l也是可以的.但为了防止看错成数字'1',一般用L.
        //定义地球的人口数量,值已经大于int最大值.
        long earthNumber = 7200000000L;
        //定义一个大型公司的负债
        long loan = -10000000000L;
        System.out.println(loan);
    }
}

浮点数(float,double)

现实中有小数,那么Java中如何表示呢?

float 数据类型是单精度、32位,节约内存。

double 数据类型是双精度、64 位。

浮点数不能用来表示精确的值,如货币。

一般用于科学计算,或者需要进行舍入误差的方式显示(保留前几位的小数).

或者用BigDecimal计算结果精确要求比较高的小数.

一般计算金钱,可以取单位为分,比如1元等价于100分.用整数计算.就不会存在精度问题.

public class A05_Float_Double {
    public static void main(String[] args) {
        //float
        System.out.println("基本类型:float,二进制位数:" + Float.SIZE);
        System.out.println("最大值:" + Float.MAX_VALUE);
        System.out.println("最小值:" + Float.MIN_VALUE);
        //定义一个单精度浮点数
        float aValue = 0.1f; //有一个尾巴F(f),表示是float.
        System.out.println("浮点数的不精确:" + aValue/1.0);

        //double
        System.out.println("基本类型:double,二进制位数:" + Double.SIZE);
        System.out.println("最大值:" + Double.MAX_VALUE);
        System.out.println("最小值:" + Double.MIN_VALUE);
        //定义一个双精度浮点数
        double dValue = 0.01d; //D(d),默认可以省略.
        System.out.println("浮点数的不精确:" + dValue/0.1);
    }
}

01_double_float

boolean(布尔值)

boolean数据类型表示一位的信息;

只有两个取值: true 和 false;

这种类型作为一种标志/状态.

public class A06_Boolean {
    public static void main(String[] args) {
        //boolean
        boolean wisdom = true;
        boolean wealth = false;
        System.out.println("wisdom:" + wisdom);
        System.out.println("wealth:"+wealth);
    }
}

char(字符)

char类型是16位的,是表示一个Unicode 字符的。Unicode 字符是代表现实中,各种符号,字母,文字的.

可以浏览器搜索unicode编码转换,或者浏览器访问下面网址看看。

http://tool.chinaz.com/tools/unicode.aspx

02

public class A07_Char {
    public static void main(String[] args) {
        //Unicode 字符是代表现实中,各种符号,字母,文字的,
        System.out.println("基本类型:char,二进制位数:" + Character.SIZE);
        char character = 'A';
        System.out.println(character);
        char special_one = '$';
        System.out.println(special_one);
        char han_zi = '\u4f60';
        System.out.println(han_zi);
        System.out.println('\u52a0');
        System.out.println('\u6cb9');
    }
}

上面的byte,short,float,char不常用。

数组

数组是用来存储同类型元素的变量。数组的长度是固定的.

数组作为重要的数据结构,对于一般业务开发,用得不多。但是很多数据集合底层都是用的数据存储的数据。

所以知道基本用法还是有必要的。

声明数组变量

dataType[] arrayVar;
或
dataType arrayVar[]; //看起来怪,不建议这样。

创建数组

使用new操作符来创建数组,语法如下:

arrayVar = new dataType[arraySize];
//创建了大小为arraySize的数组,然后赋值给声明的数组变量。

创建数组的其它写法

dataType[] arrayVar = new dataType[arraySize];
dataType[] arrayVar = {value0, value1, ..., valuen-1};//此方式数组长度为花括号里value的总数n。

数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 arrayVar.length-1。

比如记录一天的账单,消费一笔就记录一下,几十笔放在一起,最后计算出总账单。

参见代码:

public class A08_Array {
    public static void main(String[] args) {
        int size = 10;
        int[] billArray = new int[size];
        billArray[0] = 8; //早饭;
        billArray[1] = 4; //交通费;
        billArray[2] = 18; //午饭
        billArray[3] = 6; //水果
        billArray[4] = 20; //晚饭
        billArray[5] = 4; //交通费;
        billArray[6] = 10; //长胖的零食;
        // 计算一天所有的总消费
        double total = 0;
        for (int i = 0; i < 7; i++) { //for循环后面会讲。
            total += billArray[i];
        }
        System.out.println("今日总消费为:" + total);
        System.out.println("size:"+billArray.length);

        char[] charArray = {'\u52a0','\u62fc','\u97f3'};
        System.out.println("size:"+charArray.length);
        System.out.println(charArray);
    }
}

引用类型

  • 引用类型指向一个对象,指向对象的变量是引用变量。

  • 对象、数组都是引用数据类型。

  • 所有引用类型的默认值都是null。

  • 一个引用变量可以用来引用任何与之兼容的类型。

String类(字符串)

字符串广泛应用 在编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

public class A09_String {
    public static void main(String[] args) {
        String easyCourse = "最简单的Java教程。";
        String author = "柳五苏世_Brad";
        String sentence = "教程:" + easyCourse +"\n"+ "作者:"+author;// \n是换行。
        System.out.println(sentence);
        System.out.println("这句字符串长度:"+sentence.length());

        String special = "输出特殊符号.制表符:" + "\t空了几格。";// \t 是输出制表符(Tab)
        System.out.println(special);
        special = "输出特殊符号.双引号:" + "\"";
        System.out.println(special);
        special = "输出特殊符号.单引号:" + "\'";
        System.out.println(special);
        special = "输出特殊符号.反斜杠:" + "\\";
        System.out.println(special);
    }
}

数据类型的综合应用

定义B01_CreditCard类,新建DataTypeApplication程序,并启动。

使用浏览器访问如下链接:

http://localhost:8080/a006/defaultValue   //访问信用卡类,没有设置任何数据,可以看到它们的初始值。返回到界面。
http://localhost:8080/a006/initValue    //设置初始化数据,计算账单信息,返回。

​ 扫码关注小程序,进群讨论提问,获取源代码.获得最新更新,关注下方公众号.

本文版权归作者所有,欢迎转载,但未经作者同意, 必须保留小程序和二维码,且在文章首行位置标注如下转载说明:

文章转载自 “原文链接URL”, 作者: 柳五苏世_Brad

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值