1、Java 中 数据类型 的分类
- Java 是一种 强类型语言。这就意味着必须为每一个变量声明一个类型。
- Java 中的数据类型分为:
- 基本数据类型(值****类型):Primitive Data Types
- 引用数据类型(对象****类型):Reference Data Types
- 基本数据类型,直接存储值,并不是对象****的引用。
2、Java 基本数据类型
- 基本数据类型由 Java 语言预定义,直接存储数据值。
- 基本数据类型(primitive type)也叫 值类型。
类型名称 | 字节数 | 取值范围 | 默认值 | 包装类缓存区间 | |
---|---|---|---|---|---|
整数型 (默认 int 型) | byte | 1 | -27~27-1 | 0 | -128 ~ 127 |
short | 2 | -215~215-1 | 0 | -128 ~ 127 | |
int | 4 | -231~231-1 (最大 2147483647 超 21 亿) | 0 | -128 ~ 127 | |
long | 8 | -263~263-1 | 0L | -128 ~ 127 | |
浮点型 (默认 double 型) | float (小数点后 6 ~ 8 位) | 4 | 1.4E-45f ~ 3.4028235E38 | 0.0F | 无 |
double (小数点后 15 ~ 17 位) | 8 | 4.9E-324 ~ 1.7976931348623157E308 | 0.0D | 无 | |
字符型 | char 存储单个字符 如: 字母、符号、汉字 | 2 | 0 ~ 65535 | ‘\u0000’ | (char)0 ~ (char)127 |
布尔型 | boolean | 1 bit | true、false | false | true、false |
1、整型:
- 用于表示没有小数部分的数,可以是负数。
- 在 Java 中,所有数值类型的大小都与平台无关。
- 注意:Java 没有无符号(unsigned)形式****的 int、long、short 或 byte 类型。
- 十六进制:0x10、0X10 表示十进制中的 16 。
- 八进制:010 表示十进制中的 8 。
- 八进制表示法比较容易混淆。所以,很少有程序员使用八进制常数。
- 二进制:0b10、0B10 表示十进制中的 2 。
- 如用 1_000_000 表示十进制中的 100 万。
- 这些下画线只是为了让人更易读,Java 编译器会去除这些下画线。
byte a = 100;
short b = 20000;
int c = 100000;
long d = 10000000000L; //(需加后缀 l / L)
int e = 1_000_000;
2、浮点类型
- 用于表示有小数部分的数值。
- double 类型的数值精度是 float 类型的两倍(有人称之为双精度数( doubleprecision))。
- 所有的浮点数计算都遵循 IEEE 754 规范。
float e = 3.14f; //(需加后缀 f / F)
double f = 3.1415926535; //(默认浮点类型)
- float 最大可以保留 8 位有效小数。
- double 最大可以保留 17 位有效小数。
public static void main(String[] args) {
// 浮点数默认为 double 类型。所以,float 类型的变量值后边需要加上 f/F 。
// 表示将 double 类型强转为 float 类型。
float f1 = 1123456789f;
float f2 = 112345671901212345f;
float f3 = 1.12345678901f;
float f4 = 0.123456719012f;
double d1 = 1123456789101234567810112345678910123456781011234567891012345678109999999999999999D;
double d2 = 1123456789101234567810D;
double d3 = 1.123456789101234567810;
double d4 = 1.123456789101234511810;
double d5 = 0.12345678910123456781011234567891012345678101123456789101234567810999999999999999;
/*
● 整数:float的尾数部分能够有效利用更多的位数来表示整数部分。
因此,整数 1123456789 在转换为 float 时,可以保持 8 位有效小数。
● 小数:小数的尾数部分需要同时表示整数和小数部分,导致有效小数位数减少。
因此,1.12345678901 在转换为 float 时,只能保留 7 位有效小数。*/
// 1.12345677E9 保留了小数点后8位。
System.out.println(f1);
// 1.12345677E9 保留了小数点后8位。
System.out.println(f2);
// 1.1234568 只保留了小数点后7位。
System.out.println(f3);
// 0.12345672 只保留了小数点后8位。
System.out.println(f4);
// 1.1234567891012345E65 只保留了小数点后16位。
System.out.println(d1);
// 1.1234567891012346E21 只保留了小数点后16位。
System.out.println(d2);
// 1.1234567891012346 只保留了小数点后16位。
System.out.println(d3);
// 1.1234567891012346 只保留了小数点后16位。
System.out.println(d4);
// 0.12345678910123457 只保留了小数点后17位。
System.out.println(d5);
System.out.println();
float g1 = (float)d1;
float g2 = (float)d2;
// Infinity
System.out.println(g1);
// 1.1234568E21 只保留了小数点后 7 位。
System.out.println(g2);
}
- **浮点数**有三个特殊值
- 正无穷大:用正浮点数除以 0 就是正无穷大;所有的正无穷大都是**相等**的。
- 负无穷大:用负浮点数除以 0 就是负无穷大;所有的负无穷大都是**相等**的。
- 非数(NaN):用 0.0 除以 0 就是**非数;非数与自己不相等**。
// false
System.out.println(Double.NaN == Double.NaN);
// true
System.out.println(Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY);
// true
System.out.println(Double.NEGATIVE_INFINITY == Double.NEGATIVE_INFINITY);
// false
System.out.println(Float.NaN == Float.NaN);
// true
System.out.println(Float.POSITIVE_INFINITY == Float.POSITIVE_INFINITY);
// true
System.out.println(Float.NEGATIVE_INFINITY == Float.NEGATIVE_INFINITY);
// false
System.out.println(Float.NaN == Double.NaN);
// true
System.out.println(Float.NEGATIVE_INFINITY == Double.NEGATIVE_INFINITY);
// true
System.out.println(Float.POSITIVE_INFINITY == Double.POSITIVE_INFINITY);
3、char 类型
- 原本用于描述 Unicode 字符集中所有的单个字符****。
- 现在只能描述 Unicode 字符集中,基本多语言平面(BMP)中所有的单个字符。
- char 类型的字面量值要用单引号括起来。
- 如:‘A’ 是编码值为 65 的字符常量。它与 “A” 不同。“A” 是包含一个字符的字符串。
- char 类型的值可以表示为十六进制值,其范围从 \u0000 ~ \uFFFF 。
char g = 'A';
char h = '\n'; //(存储:转义字符)
char i = '\u0041'; //(Unicode编码)
char j = '中'; //(存储:部分常用中文)
4、boolean (布尔) 类型
- 有两个值:false 和 true,用来判定逻辑条件。
- 整型值和布尔值之间不能进行相互转换。
boolean k = true;
- 在 C++ 中,数值甚至指针可以代替布尔值。
- 如:值 0 相当于布尔值 false , 非 0 值相当于布尔值 true 。
3、Java 的 引用类型
1、类(Class)
- Java 语言的****预定义类:如 String、Integer、Scanner 等。
示例:String s = “Hello”;- 自定义类:用户定义的类。
示例:Person p = new Person();
2、接口(Interface)
- 定义方法规范,需由类实现。
示例:List list = new ArrayList<>();
3、数组(Array)([])
- 存储同类型数据的集合。
int[] arr1 = {1, 2, 3}; // 基本类型数组
String[] arr2 = new String[5]; // 引用类型数组
4、枚举(Enum)
- 固定常量的集合,通过 enum 关键字定义。
enum Color { RED, GREEN, BLUE }
Color color = Color.RED;
- 默认值为:null
4、Java 为什么需要保留基本数据类型?
- 不会存在**空指针**问题。
- 基本数据类型不需要**垃圾回收,因此,比对象类型多了另一个性能优势**。
- 对两个 1000 * 1000 的矩阵做多次乘法,测量执行时间【单位:秒】。
5、Java 中 char 类型可以存储中文汉字吗? 一个汉字占几个字节?
- char 类型用来存储 Unicode 编码 基本平面(BMP)范围内的字符,BMP中包含部分中文汉字。
- 只不过一些特殊的汉字没有被包含在基本平面(BMP)中。
- Unicode 中的 基本平面(BMP)范围内的编码,占用两个字节,char 类型变量也是占用两个字节。
- BMP(基本多文种平面) 范围内的字符使用 UTF-16 编码,占用 2 个字节;
- 所以, Java 中的 char 类型确实使用 UTF-16 编码的代码单元(code unit)来存储字符。
public static String toUNICODE(String s) {
StringBuilder sb = new StringBuilder();
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)<=256)
{
sb.append("\\u00");
}
else
{
sb.append("\\u");
}
// 把中文转成 十六进制 编码。
sb.append(Integer.toHexString(s.charAt(i)));
}
return sb.toString();
}
public static void main(String[] args) {
char zhong = '中';
// 中 4e2d
System.out.println(zhong + "\t" + Integer.toHexString(zhong));
// \u4e2d\u56fd\u4eba
System.out.println(toUNICODE("中国人"));
// 中
System.out.print('\u4e2d');
// 国
System.out.print('\u56fd');
// 人
System.out.print('\u4eba');
}
6、Java 常见的 转义字符 有哪些?
转义序列 | 描述 | 示例 |
---|---|---|
\t | 水平制表符(Tab) | System.out.println(“Hello\tWorld”); → Hello World |
\n | 换行符(New Line) | System.out.println(“Line1\nLine2”); → 输出两行 |
\r | 回车符(Carriage Return) | 通常与 \n 配合使用(如 \r\n 表示 Windows 换行) |
\ | 表示反斜杠字符 | System.out.println(“Path: C:\Users\”); → Path: C:\Users</font> |
" | 双引号(用于字符串内) | String s = “He said, “Hello!””; → He said, “Hello!” |
' | 单引号(用于字符字面量内) | char c = ‘’‘; → 表示字符 ’ |
\b | 退格符(Backspace) | System.out.println(“Hello\bWorld”); → HellWorld (删除前一个字符) |
\f | 换页符(Form Feed) | 主要用于打印机换页,屏幕输出通常无效果 |
\0 | 空字符(Null Character) | char c = ‘\0’; → 表示 ASCII 值为 0 的字符 |
\ooo | 八进制转义 (最多 3 位数字) | \141表示 ASCII 字符 a(八进制的 141 = 十进制的 97) |
\uXXXX | Unicode 转义 (4 位十六进制) | \u0041表示 A。 \u1F60A需代理对(实际写作 \uD83D\uDE0A 表示 😊) |
7、布尔型变量 占用 空间 是 一位 还是 一个字节?
- 虽然 boolean 类型的变量或值只要 1 位即可保存,但由于大部分计算机在分配内存时允许分配的最小内存单元是字节(8位)。
- 因此,boolean 大部分时候实际上占用 8 位。