String拼接出现null?你看到的分析可是错的

文章分析了在Java中,字符串拼接时`s+word`与`String.valueOf(s)+word`的常见误解,指出实际是Java编译器优化使用StringBuilder,当s为null时,null被当作null处理。作者通过字节码追踪验证了这一观点,并强调Java基础的重要性,特别是面试准备中需关注大厂面试题库。
摘要由CSDN通过智能技术生成

我在搜索时,看到访问量上万的文章给出的解释竟然错误的。为了排除一些误导,特意为大家分析一下原因。

错误的原因分析

=======

如果对上述问题进行搜索,你可能看到的答案是:

s + " world" 等价于 s = String.valueOf(s)+“word”;

然后附带valueOf方法:

public static String valueOf(Object obj) {

return (obj == null) ? “null” : obj.toString();

}

你信了吗?如果信了可能真的就错了。下面我们就来分析分析为什么错了。

Java编译器的优化

==========

我们知道,当我们写下面的代码时Java编译器会为我们做一些优化:

String a = "Hello ";

String b = “World”;

System.out.println(a + b);

如何优化的?上面这段代码经过编译器优化之后,等价于:

StringBuilder sb = new StringBuilder();

sb.append("Hello ");

sb.append(“World”);

String result = sb.toString();

System.out.println(result);

也就是说,加号操作会被优化基于StringBuilder的操作,而并不是上面提到的String.valueOf操作。

那么,上面为null的情况也就等价于下面的操作了:

StringBuilder sb = new StringBuilder(null);

sb.append(“hello”);

sb.append(" world");

String result = sb.toString();

System.out.println(result);

此时,我们再看一下StringBuilder(null)这个构造方法的底层实现,最终调到它的父类AbstractStringBuilder中的append方法:

public AbstractStringBuilder append(String str) {

if (str == null)

return appendNull();

int len = str.length();

ensureCapacityInternal(count + len);

str.getChars(0, len, value, count);

count += len;

return this;

}

对应的appendNull方法实现为:

private AbstractStringBuilder appendNull() {

int c = count;

ensureCapacityInternal(c + 4);

final char[] value = this.value;

value[c++] = ‘n’;

value[c++] = ‘u’;

value[c++] = ‘l’;

value[c++] = ‘l’;

count = c;

return this;

}

在appendNull方法中就是将null当做字符串“null”来处理了。这也就是为什么会在拼接中出现null的原因。

字节码追踪

=====

针对上述示例,如果你想看编译器是如何处理的,可以通过javap -c 命令来查看对应字节码:

通过字节码可以看出,基本上与上面的分析的一致。所以说,尽信书不如无书。

拓展问题

====

解决了上述问题,再来看看,如果我们单纯地就打印null是怎么输出的?

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-WG52ENh6-1714057497544)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

在C++中,可以使用+运算符或append()函数来拼接字符串。引用中的代码中展示了一些字符串拼接的示例。 使用+运算符: string str1 = "ls"; string str2 = "test.c"; string str3 = str1 + " /tmp/"; // str3的值为"ls /tmp/" string str5 = str1 + " append " + "haha"; // str5的值为"ls append haha" 使用append()函数: string tmp = str1 + " append"; string str5 = tmp.append("haha"); // str5的值为"ls append haha" 另外,引用提到了使用push_back()函数来拼接字符串,这是一种高效的方式。 所以,在C++中,可以使用+运算符、append()函数或push_back()函数来进行字符串拼接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++ String拼接](https://blog.csdn.net/u013105549/article/details/52854368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++ string类型字符串拼接](https://blog.csdn.net/neuzhangno/article/details/128686544)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值