03、数据类型

1、Java 中 数据类型 的分类


  • Java 是一种 强类型语言。这就意味着必须为每一个变量声明一个类型。
  • Java 中的数据类型分为:
    • 基本数据类型值****类型):Primitive Data Types
    • 引用数据类型对象****类型):Reference Data Types
  • 基本数据类型,直接存储,并不是对象****的引用

2、Java 基本数据类型


  • 基本数据类型由 Java 语言预定义,直接存储数据值
    • 基本数据类型(primitive type)也叫 值类型
类型名称字节数取值范围默认值包装类缓存区间
整数型
(默认 int 型)
byte1-27~27-10-128 ~ 127
short2-215~215-10-128 ~ 127
int4-231~231-1 (最大 2147483647 超 21 亿)0-128 ~ 127
long8-263~263-10L-128 ~ 127
浮点型
(默认 double 型)
float
(小数点后 6 ~ 8 )
41.4E-45f ~ 3.4028235E380.0F
double
(小数点后 15 ~ 17 )
84.9E-324 ~ 1.7976931348623157E3080.0D
字符型char
存储单个字符
如: 字母、符号、汉字
20 ~ 65535‘\u0000’(char)0 ~ (char)127
布尔型boolean1 bittrue、falsefalsetrue、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 类型变量也是占用两个字节
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)
\uXXXXUnicode 转义 (4 位十六进制)\u0041表示 A。
\u1F60A需代理对(实际写作 \uD83D\uDE0A 表示 😊)

7、布尔型变量 占用 空间 是 一位 还是 一个字节?


  • 虽然 boolean 类型的变量或值只要 1 位即可保存,但由于大部分计算机在分配内存时允许分配的最小内存单元是字节(8位)。
    • 因此,boolean 大部分时候实际上占用 8 位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值