数据类型
编写的代码,是后缀名为(.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);
}
}
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
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