• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

Java的String相关的几个经典笔试题

Java基础 tiantian 2455次浏览 6个评论 扫描二维码

String作为Java语言中的字符串模拟类,无论是实际的编程工作还是笔试面试过程,都需要我们都String类非常熟悉,对于String类的大部分字符串操作方法,都必须达到熟练运用的程度才行。但是,笔试和面试过程中,面试官往往喜欢问一些Sting特性相关的题目,来考察面试者对于String基础知识的掌握是否牢固。笔者是非常认可这种方式的。

创建对象的两种方式

Java中的字符串对象比较特殊,比普通Java类多有一种创建对象的方法,就是 字符序列法。所以,在Java中,我们可以使用如下的两个方式来创建String对象:

String strA = "www.tiantianbianma.com";
String strB = new String("www.tiantianbianma.com");

那它们之间有什么区别呢?本质上来说,两个方式创建的对象存储于JVM内存布局模型中的不同区域。

我们通过代码演示的形式来看看两种方式的区别:

String strA = "www.tiantianbianma.com";
String strB = "www.tiantianbianma.com";
System.out.println(strA == StrB);
System.out.println(strA.equals(StrB));

String StrC = new String("天天编码");
String StrD = new String("天天编码");
System.out.println(strC == strD);
System.out.println(strC.equals(strD));

关于 “==” 与 ”equals” 的功能与区别,可参看 深入分析Java的String类的方法与特点。建议仔细思考得出答案后,在上机验证。正确答案是:true、true、false、true。本后的机制在于JVM内存模型的方法区中有一个String常量池,对于使用字符序列方式创建对象,JVM首先会查看 字符串常量池 中是否已经存在该对象,如果存在,则直接已存在对象而不会新建对象;对于使用new运算符方式创建对象,JVM会直接在 中分配一个新的String对象。上述代码片段的内存布局简图如下:

Java的String相关的几个经典笔试题

值传递 VS 引用传递

Java中有一个关于String的经典问题是:String类型的参数是指传递还是引用传递?首先抛出答案,Java中只有值传递机制,而没有引用传递机制。但是,有非常多的关于String参数传递类型的问题出现在 stackoverflow 网站上,而且网站上正确的和错误的答案都非常多。如果你不想太多的话,这个问题的答案非常简单。但是,如果你左思右考,你很有可能会犯迷糊。
首先,我们先来看一段有趣的代码:

public static void main(String[] args) {
String arg = new String("www.tiantianbianma.com");
change(arg);
System.out.println(arg);
}

private static void change(String arg) {
arg = "tiantianbianma";
}

建议仔细思考得出答案后,再上机验证。答案是:

www.tiantianbianma.com

这验证了我们开头抛出的答案:Java中的String参数是值传递方式。


天天编码 , 版权所有丨本文标题:Java的String相关的几个经典笔试题
转载请保留页面地址:http://www.tiantianbianma.com/java-string-interview-questions.html/
喜欢 (5)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(6)个小伙伴在吐槽
  1. 哈哈 建议变量命名能不能统一。一会儿首写字母是大写一会儿又是小写,打印语句的变量也是和申明的变量都不是同一个。
    匿名2017-08-02 18:08 回复 Windows 7 | Chrome 59.0.3071.109
    • 嗯,谢谢你的建议,马上改正。
      匿名2017-08-03 15:00 回复 Windows 10 | Chrome 59.0.3071.115
  2. “Java中只有值传递机制,而没有引用传递机制。“ java没有引用传递么?
    匿名2017-10-17 15:46 回复 未知操作系统 | Firefox 54.0
  3. String strA = "www.tiantianbianma.com"; String strB = "www.tiantianbianma.com"; System.out.println(strA == StrB); System.out.println(strA.equals(StrB)); 就当你是把strB写成了StrB,strA==strB 确定是true吗?明显的两个不同的引用变量,怎么可能相等?如果是以上两个结果都是true,那么equals 存在的意义是什么?
    IAM四十二2018-01-28 16:44 回复 Windows 10 | Chrome 65.0.3322.4
    • equals是经过String重载了的啊, 你可以看下源代码,==比较的是两个对象是否具有相同引用,而他们初始同一个字符串啊。
      他卡被2018-05-04 20:21 回复 Windows 10 | Chrome 58.0.3029.110
  4. String strA = "www.tiantianbianma.com"; String strB = "www.tiantianbianma.com"; System.out.println(strA == StrB); System.out.println(strA.equals(StrB)); 就当你是把strB写成了StrB,strA==strB 确定是true吗?明显的两个不同的引用变量,怎么可能相等?如果是以上两个结果都是true,那么equals 存在的意义是什么?
    IAM 四十二2018-01-28 16:45 回复 Windows 10 | Chrome 65.0.3322.4