常量池(1)

Java包装类与String常量池解析
本文深入探讨了Java中包装类如Boolean、Byte、Short、Integer、Long、Character以及String类的常量池机制。通过实例演示了不同类型的常量池在内存中的存储方式,特别关注于它们在特定数值范围内的表现。此外,文章还对比了基本类型与包装类之间的区别。
package constantPool;
//1.基本类型对包装类(除Float,Double外),比如Boolean,Byte,Short,Integer,Long,Character都有常量池
//2.String类也有常量池
public class Pools {
	public static void main(String[] args) {
		System.out.println("Boolean测试");
		Boolean b1 = true;
		Boolean b2 = true;
		System.out.println(b1==b2);
		
		System.out.println("Byte测试");
		Byte by1 = 127;
		Byte by2 = 127;
		System.out.println(by1==by2);
		
		System.out.println("Character测试");
		Character ch1 = 127;
		Character ch2 = 127;
		System.out.println(ch1==ch2);
		
		Character ch3 = 128;
		Character ch4 = 128;
		System.out.println(ch3==ch4);
		
		System.out.println("Double测试");
		Double d1 = 127D;
		Double d2 = 127D;
		System.out.println(d1==d2);
		
		System.out.println("String测试");
		String s1 = "abc";
		String s2 = "abc";
		String s3 = "a"+"b"+"c";
		System.out.println(s1==s2);
		System.out.println(s1==s3);
		//其他对痘差不多......Integer,Long,Short,Byte只在 -128~127之间生效
		//(Byet只能表示-128~127之间对数,超过128会报错),Character在0~127之间生效
		//Boolean在true,false之间生效
		//String暂时不清楚
	}
}

结果:
在这里插入图片描述
说明:
在这里插入图片描述

<think>好的,我现在需要回答用户关于Java字符串常量池中s1等于s2时equals行为的解释。首先,我要回忆字符串常量池的相关知识。 用户提到的引用中,有关于直接赋值和new String的区别。例如,直接赋值会指向常量池中的引用,而new String会在堆中创建新对象。同时,字符串不可变性使得相同内容的字符串可以共享。这些信息都是关键点。 接下来,用户的问题是关于s1和s2在常量池中使用equals的情况。equals方法在String类中被重写,用于比较内容是否相同,而不仅仅是引用地址。因此,无论s1和s2是通过直接赋值还是new创建的,只要内容相同,equals就会返回true。 需要区分==和equals的不同。==比较的是对象地址,而equals比较的是内容。例如,直接赋值的两个变量可能指向同一个常量池对象,所以==为true。而通过new创建的变量即使内容相同,==也会返回false,但equals仍然为true。 用户可能混淆了这两种比较方式,所以需要明确说明。同时,引用中的例子,如引用[1]和引用[4]提到的不同创建方式,应该结合到回答中,说明不同情况下的结果。 还要注意字符串常量池的位置,在JDK1.7之后移到了堆内存,这可能影响垃圾回收,但这里可能不需要详细展开。重点还是equals的行为。 总结回答的结构:先解释equals方法的作用,然后对比==和equals的不同,接着用直接赋值和new创建的例子说明两种情况下的结果,最后引用相关的文献支持结论。</think>在Java中,`s1.equals(s2)`的行为与字符串常量池的特性密切相关,具体可分为以下两种情况分析: --- ### 1. **当`s1`和`s2`都指向字符串常量池中的同一对象时** 若`s1`和`s2`均通过**直接赋值**(如`String s1 = "abc"; String s2 = "abc";`)创建,则它们会直接指向字符串常量池中的同一对象。此时: - `s1 == s2`返回`true`(引用地址相同) - `s1.equals(s2)`也返回`true`(内容相同) **原因**:字符串常量池会复用相同字面量的对象,确保内容相同的字符串共享同一内存地址[^1][^3]。 --- ### 2. **当`s1`或`s2`通过`new String()`创建时** 若通过`new String("abc")`创建对象(如`String s1 = new String("abc"); String s2 = "abc";`): - `s1 == s2`返回`false`(`s1`指向堆内存新对象,`s2`指向常量池对象) - `s1.equals(s2)`仍返回`true`(内容相同) **原因**:`String.equals()`方法重写了`Object.equals()`,实际比较的是字符序列的内容是否一致,而非内存地址[^2][^4]。 --- ### 关键区别总结 | 比较方式 | 比较内容 | 常量池对象示例结果 | `new String`对象示例结果 | |----------------|--------------------|--------------------|--------------------------| | `s1 == s2` | 内存地址 | `true` | `false` | | `s1.equals(s2)`| 字符序列的实际内容 | `true` | `true` | --- ### 示例代码说明 ```java String a = "程序新视界"; // 常量池对象 String b = "程序新视界"; // 复用常量池对象 String c = new String("程序新视界"); // 堆内存新对象 System.out.println(a == b); // true System.out.println(a.equals(b)); // true System.out.println(a == c); // false System.out.println(a.equals(c)); // true ``` --- ### 底层原理 - **字符串不可变性**:Java字符串不可修改,JVM可安全共享相同内容的字符串对象[^2]。 - **`equals()`实现**:`String`类通过逐字符比较实现内容匹配,时间复杂度为$O(n)$[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值