前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单

Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单

作者头像
张拭心 shixinzhang
发布2022-05-06 11:06:02
1410
发布2022-05-06 11:06:02
举报
文章被收录于专栏:拭心的安卓进阶之路

先来一道java面试题:

String s = new String(“zsx”);

问:创建了几个String Object? *************************** 先别往下看,想想答案 ***************************

先上一个图:

这里写图片描述
这里写图片描述

如图所示,问题所示的语句创建了2个String对象和一个引用。

String s = new String(“zsx”); 相当于 String s1=”zsx”; String s=new String(s1);

“zsx”作为一个常量字符串首先被创建,它被保存在“串池”中。

所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在”zsx”这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。(注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。)

然后,new String(“zsx”)也创建了一个对象,”zsx”作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的”zsx”内容一致!

前两步建立的对象都是保存在堆heap上的。

最后String s = new String(“zsx”); 所做的工作是:在栈stack中创建一个引用s,然后s指向上一步new出的对象所在地。结束。

我一直觉得String的内容简单的很,我早就掌握了。直到看到这题,我知道我以前真是too young,too naive。知其然而不知其所以然,谓之“菜鸟”也。

知道真相的我立马滚去学习,现将所获记录如下:

  1. String的两种创建方式
  2. String的常用方法
  3. StringBuffer、StringBuilder
  4. String与StringBuffer的对比
  5. 自己实现String的一些常用方法

2015/8/3 17:09添加:

java里是没有运算符重载的,String+是StringBuffer的append()方法来实现的,如:

请把下面的程序编译后再反编译: String a = “a”; String b = “b”; String c = a + b; String d = c + 1; 得到的结果是: String a = “a”; String b = “b”; String c = (new StringBuilder(String.valueOf(a))).append(b).toString(); String d = (new StringBuilder(String.valueOf(c))).append(1).toString();

所以,重载的是 append() 方法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先来一道java面试题:
    • String s = new String(“zsx”);
      • 问:创建了几个String Object? *************************** 先别往下看,想想答案 ***************************
        • 先上一个图:
          • 如图所示,问题所示的语句创建了2个String对象和一个引用。
            • “zsx”作为一个常量字符串首先被创建,它被保存在“串池”中。
              • 所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在”zsx”这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。(注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。)
            • 然后,new String(“zsx”)也创建了一个对象,”zsx”作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的”zsx”内容一致!
              • 前两步建立的对象都是保存在堆heap上的。
            • 最后String s = new String(“zsx”); 所做的工作是:在栈stack中创建一个引用s,然后s指向上一步new出的对象所在地。结束。
            • 我一直觉得String的内容简单的很,我早就掌握了。直到看到这题,我知道我以前真是too young,too naive。知其然而不知其所以然,谓之“菜鸟”也。
              • 知道真相的我立马滚去学习,现将所获记录如下:
                • java里是没有运算符重载的,String+是StringBuffer的append()方法来实现的,如:
                  • 所以,重载的是 append() 方法。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档