共创建了几个String对象

本文通过分析四个函数示例,探讨了Java中不同情况下String对象的创建情况。在function1中,常量池中创建了两个对象;function2中,由于编译期优化,只创建了一个"ab"对象;而在function3和function4中,对象创建数量因编译器对变量确定性的判断而有所不同。final关键字的使用影响了对象的创建策略。
摘要由CSDN通过智能技术生成

1.例子

Test.java

package TestObject;

public class Test {

	public static void main(String[] args) {
		function1();
		function2();
		function3();
		function4();
	}
	
	public static void function1() {
		System.out.println("----------------------function1----------------------");
		String s1 = "a";//创建一个
		String s2 = new String("a");//创建两个
		System.out.println(s1 == s2);
	}
	
	public static void function2() {
		System.out.println("----------------------function2----------------------");
		String s1 = "a" + "b";//创建一个
		String s2 = "ab";//不再创建
		String s3 = "a";//创建一个
		String s4 = s3 + "b";//创建一个
		System.out.println(s1 == s2);
		System.out.println(s1 == s4);
	}
	
	public static void function3() {
		System.out.println("----------------------function3----------------------");
		String a = "a";//创建一个
		String b = "b";//创建一个
		String s1 = a + b;//创建一个
		String s2 = a + b;//创建一个
		System.out.println(s1 == s2);
	}
	
	public static void function4() {
		System.out.println("----------------------function4----------------------");
		final String a = "a";//创建一个
		final String b = "b";//创建一个
		String s1 = a + b;//创建一个
		String s2 = a + b;//不再创建
		String s3 = "ab";//不再创建
		System.out.println(s1 == s2);
		System.out.println(s1 == s3);
	}
}

运行结果
在这里插入图片描述
反编译工具查看Test.class

在这里插入图片描述

2.分析

2.1 function1

String s1 = "a";

在常量池中创建了一个字符串对象。

String s2 = new String("a");

在常量池中创建了一个字符串对象"a",在堆中开辟了一个空间又放了一个"a"。

2.2 function2

String s1 = "a" + "b";//创建一个
String s2 = "ab";//不再创建

在编译期,jvm将"a"+“b"自动识别成"ab”。
在这里插入图片描述

2.3 function3

String a = "a";//创建一个
String b = "b";//创建一个
String s1 = a + b;//创建一个
String s2 = a + b;//创建一个

第三和第四行,各创建了一个对象,因为对于编译器来说,创建s1和s2时候,a和b的值被当做是不确定的,所以各自开辟空间创建对象。
在这里插入图片描述

2.4 function4

final String a = "a";//创建一个
final String b = "b";//创建一个
String s1 = a + b;//创建一个
String s2 = a + b;//不再创建
String s3 = "ab";//不再创建

在String前边加个final,后边再用这个对象的时候,对编译器来说a的值是确定的,和"a"是一个东西都是“字面常量字符串”。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>