20220921String面试题

本文主要探讨了Java中String与StringBuffer的区别,解释了String的不可变性原理,通过实例分析了String对象在JVM中的创建机制,并通过三个实验解析了String对象拼接的内存行为。同时,提到了final关键字在变量封印中的作用。
摘要由CSDN通过智能技术生成

20220921String面试题

1.String s1 = “hsp”;String s2 = new String(“hsp”);这两者的区别在哪里?

String s2 = new String(“hsp”);

1创建对象栈空间

2.1看String常量池,有的话直接拷贝其地址。

2.2没有的话,⭕️在栈中 创建字符串

String s1 = “hsp”;

1看String常量池有无"hsp",有的话拷贝地址

2没有的话,⭕️在String常量池 创建字符串

2.String为什么是不可变字符串?但是我们在实际应用中 String是可以被改变的,能详细说一下嘛?

1.保存字符串内容的池子叫做:value数组

2.value数组有final修饰

小知识点final如何封印变量

1.final修饰基本数据类型:值不可改变

2.final修饰引用数据类型:地址不可改变

3.与==相关面试题

//指向字符串池
String str1 = "java";

//指向字符串池
String str2 = "blog";

String s = str1+str2;
String str1 = "java";的底层代码String str1 = String.valueOf("java");这里创建了一个对象

这段代码块总共创建了3个对象

详细:+ 运算符会在堆中建立起两个 String 对象,这两个对象的值分别是 “java” , “blog” ,也就是说从字符串常量池中复制这两个值,然后再堆中创建两个对象。然后再建立对象 s ,然后将 “javablog” 的堆地址赋给 s 。String s = str1+str2这句话共创建了3个 String 对象。

实验1

//结果是false
System.out.println(s=="javablog");

实验2

String s = “java” + “blog”;
jvm没有那么傻,这里是创建一个对象
//直接将javablog对象放入字符串常量池中
String s = "java" + "blog";

//结果是true
System.out.println(s=="javablog");

实验3

//不放在字符串常量池中,而是在堆中分分配
String s=str1+"blog"; 

//结果是false;
System.out.println(s=="javablog");

4.实话讲:我对String这个东西,创建对象时的jvm机制还是很不理解,比方说上面的3个实验我还是理解不透…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值