字符串特性

面试中String字符是比较喜欢出题的一个地方,再次通过查询资料总结一下.

Java的字符串,有一些必须注意的特性:

字符串常量与字符串池.
不可变动(Immutable)字符串.

1.字符串常量与字符串池

来看个程序片段,你觉得以下会显示true还是false?

char[] name = { 'm', 'e', 'n', 'm', '9', '1' };
String name1 = new String(name);
String name2 = new String(name);
System.out.println(name1 == name2);

输入结果为:false.
因为name1与name2分别创建出来的.

下面的代码呢?

String name1 = "menm91";
String name2 = "menm91";
System.out.println(name1 == name2);

输出结果为:true.
代表name1与name2参考到同一对象.

在Java中为了效率考虑,以""包括的字符串称为字符串常量(String literal),只要内容相同(序列、大小写相同),无论在程序代码中出现几次,JVM都只会创建一个 String 实例,并在字符串池(String pool)中维护.在上面程序片段的第一行,JVM会创建一个 String 实例放在字符串池中,并给 name1 参考,而第二行则是让 name2 直接参考至字符串池中的 String 实例,如下图:

Paste_Image.png

再看下题:

String name1 = "menm91";
String name2 = "menm91";
String name3 = new String("menm91");
String name4 = new String("menm91");
System.out.println(name1 == name2);
System.out.println(name1 == name3);
System.out.println(name3 == name4);

输出结果为:true false false
因为"menm91"会建立String实例并在字符串池中维护,所以 name1 与 name2 参考的是同一个对象,而 new 一定是建立新对象,所以 name3 与 name4 分别参考至新建的 String 实例.

Paste_Image.png

2.不可变动字符串

以下会显示true还是false?

String text1 = "Ja" + "va";
String text2 = "Java";
System.out.println(text1 == text2);

有的人会这么说:
因为用了+连接字符串,所以产生新字符串,所以text1 == text2应
该是false吧。如果你这么认为,那就上当了。答案是true。反编译之后就知道为什么了:

String s = "Java";
String s1 = "Java";
System.out.println(s == s1);

编译程序是这么认为的:既然你写死了"Ja" + "va",那你要的不就是"Java"吗?根据以
上反编译之后的程序代码,显示true的结果就不足为奇了。

参考:<<Java JDK 7学习笔记>>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,477评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 9,226评论 0 7
  • 我对烩面一直怀有一种无以言说的情结。但在上个世纪八十年代初期之前,我甚至没有听说过烩面。 烩是一种烹调方法,即把米...
    月照长空阅读 4,520评论 3 0
  • 你摆渡了我,我摆渡了你。 这样,刚刚好。 不管路途经历了多少困难,只要心里有爱,一起坚持下来,最后,一定是幸福的。
    谁与光阅读 1,521评论 0 0