文章目录
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类型的最大值是怎么计算出来的(2的7次方-1)?
byte是1个字节,是8个比特位,所以byte可以存储的最大值是:01111111
注意:在计算机当中,一个二进制位最左边的是符号位,当为0时表示正数,当为1时表示负数。所以byte类型最大值是:01111111,那么是不是2的7次方-1呢?
有几个取值范围是需要记住的
(1个字节)byte: [-128 ~ 127]
(2个字节)short:[-32768 ~ 32767] 加起来也是可以表示65535个不同的数字
(4个字节)int: [-2147483648 ~ 2147483647]
(2个字节)char: [0~65535] char不是字符吗,怎么和数字挂钩了呢?再是汉字,底层存储的也是二进制的方式。可以表示65535个不同的数字
short和char实际上容量相同,不过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
装箱和拆箱
装箱:将基本数据类型转化为包装类的过程叫装箱
比如 int装Integer long转Long
拆箱:将包装类转化为基本数据数据类型的过程叫拆箱
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);