关于String的一点小笔记

---恢复内容开始---

起因是在刷题时偶遇的一道关于String 对象引用的问题

**
 * Created by XIAO on 2017/4/2 0002.
 */
public class stringTest {
    public static void main(String[] args){
        String s1 = "Hello";
        String s2 = s1 + " world";
        System.out.println(s2 == "Hello world");   //false
        String s3 = "Hello" + " world";
        System.out.println(s3 == "Hello world");   //true
    }
}

开始时,我以为只是简单的对象引用不同,但是,再粗略的画了一下堆栈的关系后,我发现我错了,这里的主要问题还是String函数在编译期对内存的分配管理。

String s3 = "Hello" + " world";

这段代码,在编译期会常量重叠,javac会帮助我把值算出来,然后赋值给s3,所以这句话在实质上是等于直接创建 s3而不使用连接符的。也就是以下的代码:

String s3 = "Hello World" ;

然后由于栈中的字符串池的存在,使得中的两个实质上是同一个对象的不同引用。

这个之所以在前面说,是因为我觉得它比较简单,而且这个是首先就应该能想到的。

接下来要说的是我当时并不是特别清楚的一部分

也就是在Java中字符串 "+"的内部实现。

竖起来很惭愧,之前我以为是使用String函数的contact方法实现的,但是在知乎上看到了一个比较好的回答才发现,它在实质上是调用了StringBuilder的append方法实现的。

也就是说:

String s2 = s1 + " world";
//这段代码和下面的代码实质上相同
String s2 = new StringBuilder().append(s1).append("world");

它new了一个对象,new出来的东西位于堆上,也就是说s2指向了堆上的一块内存,而s3指向的位于常量池,所以使用==会返回false

时间: 2024-08-20 08:38:51

关于String的一点小笔记的相关文章

记录自己OCR的一点小笔记,慢慢摸索中

概念的一些积累: Sobel梯度算法: A(i,j): 表示点(i,j)上的灰度值或者RGB值 在竖轴上的一阶导数为A(i, j)-A(i, j-1) 在竖轴上的二阶导数为(A(i,j+1)+A(i,j-1)-2A(i,j))/2 为了保证连续性,求完导数后再对上下点做下加权[1,2,1] 对行,列上的梯度进行累加,可以查找空白区域以及其他一些有意义的事情. 梯度算法计算二值化 连通域

【iOS开发每日小笔记(五)】实测copy到底是个神马玩意

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

新闻发布的一点小总结

经过一段时间的学习,完成了新闻发布的基础功能,进行一点小总结,方便日后回顾.下面是我的一点小总结,不足之处请勿见笑... 我们想要完成一个新闻发布,首先要使其能够成功发布,并且让它能够实现添加.删除.修改.查询.上传.下载等功能.我们还调用AJAX功能查看输出为XML.JSON格式的新闻内容.为完成以上功能,我们首先要进行jdk.tomcat.eclipse的安装和配置.1.各软件的安装和配置1.1.jdk的安装和配置: 1.1.1.下载jdk:下载地址:http://www.oracle.co

关于C#做个小笔记

RichTextBox控件很强大,不用滚动条就能上下移动看文本. 但是编程中它在winform和WPF里,略有不同. 但是一般的TextBox这个控件在两者里面,我暂时没看到区别,都能用textbox1.Clear()清除文本框. 下面是RichTextBox在winform和WPF里有哪些不同. ------------------------------------------ 分割线 1.RichTextBox控件对象 如何追加文本 并换行 在winform中,向RichTextBox控件

【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸的笑.没办法,老老实实修复bug! 来看看今天我遇到的一个问题: 项目中,我将一个简化的H

一点小心得

项目中会遇到这样的逻辑处理:根据不同类型调用不同的方法,通常会用到if else等语句,感觉不太好: 1,应该面向接口编程 2,尽量避免使用if语句 实例:原来代码,接口Iservice的实现类有 ServiceA ,ServiceB,ServiceC public static void main(String[] args) { String type = "C"; Iservice service = null; if (type.equals("A")) {

通读《STL源码剖析》之后的一点读书笔记

[QQ群: 189191838,对算法和C++感兴趣可以进来] 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了ST

转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

http://www.bubuko.com/infodetail-382485.html 这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸

SPComm的一点小诀窍 spcomm的问题导致数据丢失 0x11与0x13错误

最近几天完成了BiasDAC的程序编写.调试的过程还算比较顺利,除了几个有点bt的小问题.其中一个困扰了我两三天的时间,今天上午终于将其解决. 由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm控件.在之前的使用中,SPComm控件一直工作正常,使用的是一般的string进行消息的传递. 而BiasDAC由于通信协议的限制,消息的发送使用的是hex方式,会用到从0x00到0xFF所有的这些字符.在调试中发现,发送0x11和0x13之后