String类内存分析

本文探讨了 Java 中使用不同方式创建 String 对象的数量,并分析了这些对象间的相等问题。详细解释了直接量与 new 创建的区别,以及它们在常量池与堆内存中的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试题

1、下列代码分别创建了几个String对象

String str1 = "abcd";

最多创建一个对象,最少不创建对象。

如果常量池中,已经存在“abcd”,那么str1直接引用,此时不创建String对象。

否则,先在创建“abcd”内存空间,str1再引用。

String str2 = new String("abcd");

最多创建两个String对象,最少创建一个String对象。

new关键字绝对会在堆空间创建内存区域,所以最少创建一个String对象。

如果常量池没有“abcd”对象,则先在常量池中创建该对象,new对象再引用该对象。


以下是内存分析


2、比较以下String对象是否相等

package com.mipo.javase.reference;
/**
 * String对象比较:
 * 1、单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中
 * 2、使用new String() 创建的对象会存储到堆内存中,是运行期才创建
 * 3、使用只包含直接量的字符串连接符如"ab"+"cd"创建的也是直接量,编译期就能确定,已经确定存储到常量池中("a"+"b"+"c"+"d"="abcd"编译器优化)
 * 4、使用包含String直接量(无final修饰符)的字符串表达式,如temp+"cd",创建的对象是运行期才创建的,存储在堆中
 *    通过变量/调用方法去连接字符串,都只能在运行时期确定变量的值和方法的返回值,不存在编译优化操作
 * @author Administrator
 *
 */
public class StringDemo1 {

	public static void main(String[] args) {
		String str1 = "abcd";
		String str2 = "a"+"b"+"c"+"d";
		String str3 = "ab"+"cd";
		String str4 = new String("abcd");
		String temp = "ab";
		String str5 = temp+"cd";
		String str6 = getXx() + "cd";
		
		System.out.println(str1 == str2);//true
		System.out.println(str1 == str3);//true
		System.out.println(str1 == str4);//false
		System.out.println(str1 == str5);//false
		System.out.println(str1 == str6);//false
	}
	
	private static String getXx() {
		return "ab";
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值