JAVA11-int和Integer自动装箱拆箱介绍以及String类的简介

Java基本数据类型与包装类
本文详细介绍了Java中基本数据类型及其对应的包装类,并解释了装箱与拆箱的过程及应用场景。此外还探讨了字符串与基本数据类型之间的转换方法。

基本数据类型与其包装类
八个基本数据类型:
byte short int char float double char boolean
思考:
int a = 1;
如何让1变成对象,如果是对象,我们就可以调用相关行为
想要有对象,首先必须要有类
基本数据类型对应的包装类
java给我们提供这样的一个类,称之为基本数据类型的包装类

byte short int     long  float double char      boolean
Byte Short Integer Long  Folat Double Character Boolean

拆装箱
装箱
将基本数据类型的变量变成引用数据类型

		int a=1;
		//虽然i的值也是1,但是i指向了一个新的对象,拥有属性和行为
		Integer i=a;//Integer.valueOf(a);
		
		//合并起来
		Integer i=1;//自动装箱

好处:
1.将数值当成对象去研究,有很多的属性和行为去帮我们完成一些事情
2.变量声明时,使用包装类,默认值将不会有实际意义
要求:以后javaBean中的变量不允许使用基本数据类型
因为0和null不是一个概念
验证:

package com.qf;

public class Demo{
    int a;
    Integer b;
}

package com.qf;

public class Demo1 {
    public static void main(String[] args) {
        Demo demo =new Demo();
        System.out.println("int属性a的值"+demo.a);
        System.out.println("Integer属性b的值"+demo.b);
    }
}

在这里插入图片描述
拆箱
将引用数据类型转化为基本数据类型

		Double b=new Double(3.14);
		double c=b;//b.doubleValue();
		//合并起来
		double c1=new Double(3.14);//自动拆箱

总结:
1。包装类和包装类之间是引用数据类型的内容判断,需要使用.equals()
2.基本数据类型和包装类型做比较时,先将包装类型自动转化为基本数据类型,然后做值判断
3.Integer包装类中存在缓存,装箱的方法ValueOf(),自动调用,范围是-128~127

Integer a1=1;//Integer a1=cache[129];
		Integer a2=1;//Integer a1=cache[129];
		System.out.println(a1==a2);//true
		
		Integer a3=1000;//Integer a3=new Integer(1000);
		Integer a4=1000;//Integer a4=new Integer(1000);
		System.out.println(a3==a4);//false

字符串和基本数据之间的转换
基本数据类型转换为字符串类型

123===>"123"
3.14===>"3.14"
true==>"true"
String.valueOf(xxx)
    	int a=123;
		System.out.println(a+1);//124
		String a1=String.valueOf(a);
		System.out.println(a1+1);//1231//"+"号相当于连接符

字符串转换为基本数据类型

"123"===>123
 "true"===>true
 "3.14"===>3.14
    
        String a="123";
		System.out.println(a+1);//1231
		int a1=Integer.parseInt(a);
		System.out.println(a1+1);//124
		
		String b="3.14";
		double b1=Double.parseDouble(b);
		System.out.println(b1+1);//4.14

注意:没有Character.parseCharacter(str)这样的方法
字符串转换为字符
"a"===>'a'
.charAt(0);

		String a="a";
		char c=a.charAt(0);
		System.out.println(c+1);//98

常用的Integer方法

int a=97;
		System.out.println(a+"的二进制是"+Integer.toBinaryString(a));
		System.out.println(a+"的八进制是"+Integer.toOctalString(a));
		System.out.println(a+"的十六进制是"+Integer.toHexString(a));

## String类
java程序中所有的字符串都是String类的具体实例,String类提供的都是值不能修改的字符串
静态式

String a="abc";

动态式

String a=new String("abc");

注意

	String a="abc";
		String a1="abc";
		String b1=new String("abc");
		String b=new String("abc");
		
		System.out.println(b==b1);//false
		System.out.println(b.equals(b1));//true
		
		//使用静态的方式初始化字符串,
		//会先在堆内存中的字符串常量池中查找有没有该值出现过,
		//如果有,则直接指向该值
		//如果没有,则重新在字符串常量池中创建对象
		System.out.println(a==a1);//true
✅ **你的说法部分正确,但需要更精确的解释。** 我们来详细说明 Java 中 `Integer` 的**自动装箱(autoboxing)缓存机制**,特别是 `-128 ~ 127` 这个范围的意义。 --- ### ✅ 正确结论: > 在 Java 中,`Integer` 型在 **自动装箱时会对 -128 到 127 范围内的值进行缓存**,以提高性能节省内存。 > 因此在这个范围内,相同的数值可能会**复用同一个对象实例**。 但这不是“装箱拆箱的功能范围”,而是 **缓存优化机制的范围**。 --- ### 🔍 自动装箱拆箱回顾 - **自动装箱**:基本型 `int` → 包装 `Integer` - **自动拆箱**:包装 `Integer` → 基本型 `int` ```java Integer a = 100; // 自动装箱 int b = a; // 自动拆箱 ``` 这在整个 `int` 取值范围内都有效(即从 -2³¹ 到 2³¹-1),**不限于 -128~127**。 但关键区别在于:**对象引用是否相等(==)?** --- ### 🧪 示例代码:展示缓存效果 ```java public class IntegerCacheExample { public static void main(String[] args) { Integer a = 100; Integer b = 100; System.out.println(a == b); // true:缓存中复用同一对象 Integer x = 200; Integer y = 200; System.out.println(x == y); // false:超出缓存范围,新建对象 Integer m = 128; Integer n = 128; System.out.println(m == n); // false Integer p = -129; Integer q = -129; System.out.println(p == q); // false } } ``` 输出结果: ``` true false false false ``` 👉 所以只有在 `-128 ~ 127` 范围内,通过自动装箱得到的 `Integer` 对象才可能使用缓存对象,导致 `==` 返回 `true`。 --- ### ⚙️ 底层原理:Integer.valueOf() 与 缓存池 当你写: ```java Integer a = 100; // 实际调用的是 Integer.valueOf(100) ``` 而 `valueOf()` 方法内部实现了缓存逻辑: ```java public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` 其中: - `IntegerCache.low = -128` - `IntegerCache.high = 127`(默认) 这个缓存是在 JVM 启动时初始化的,可以被 JVM 参数调整。 --- ### 🔧 可配置缓存范围 你可以通过 JVM 参数修改上限(只能改高,不能改低): ```bash -Djava.lang.Integer.IntegerCache.high=500 ``` 这样 `-128 ~ 500` 都会被缓存。 > 注意:下限固定为 -128,无法更改。 --- ### ❗重要提醒:永远不要用 `==` 比较 Integer 对象! 因为 `==` 比较的是引用地址,而不是数值。 ✅ 正确做法是使用 `.equals()`: ```java Integer a = 200; Integer b = 200; System.out.println(a.equals(b)); // true:比较的是值 ``` 或者直接比较 `int` 型(自动拆箱): ```java System.out.println(a == b); // 不推荐用于 Integer 对象 ``` 但在某些情况下会出错(如上面的例子),所以应避免。 --- ### 其他包装也有似机制吗? | 型 | 是否有缓存 | 范围 | |------|------------|------| | `Byte` | ✅ 是 | 全部值(-128 ~ 127) | | `Short` | ✅ 是 | -128 ~ 127 | | `Long` | ✅ 是 | -128 ~ 127 | | `Character` | ✅ 是 | 0 ~ 127 | | `Boolean` | ✅ 是 | `TRUE`, `FALSE` 两个常量 | > Float Double 没有缓存机制。 --- ### ✅ 总结 | 说法 | 正误 | 解释 | |------|------|------| | “Integer 装箱拆箱只在 -128~127 有效” | ❌ 错误 | 装箱拆箱适用于所有 int 值 | | “Integer-128~127 范围内自动缓存” | ✅ 正确 | 提高性能,复用对象 | | “超出范围每次都会创建新对象” | ✅ 正确 | 不走缓存路径 | | “可以用 == 比较 Integer” | ❌ 危险 | 在缓存范围内可能碰巧对,但不可靠 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值