zoukankan      html  css  js  c++  java
  • 《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么

    在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况:
    (1) 对于String s1=new String(“abc”)语句与String s2=new String(“abc”)语句,存在两个引用对象s1、s2,两个内容相同的字符串对象”abc”,它们在内存中的地址是不同的。只要用到new总会生成新的对象。

    (2) 对于String s1 = “abc”语句与String s2 = “abc”语句,在JVM中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,s1、s2引用的是同一个常量池中的对象。由于String的实现采用了Flyweight的设计模式,当创建一个字符串常量的时候,例如String s = “abc”,会首先在字符串常量池中查找是否已经有相同的字符串被定义,它的判断依据是String类equals(Object obj)方法的返回值。如果已经定义,则直接获取对其的引用,此时不需要创建新的对象,如果没有定义,则首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。由于String是不可变类,一旦创建好了就不能被修改,因此String对象可以被共享而且不会导致程序的混乱。
    具体而言:
    String s=“abc”; //把“abc”放到常量区中,在编译时产生。
    String s=“ab”+”c”; //把“ab”+“c”转换为字符串常量“abc”放到常量区中。
    String s=new String(“abc”); //在运行时把“abc”放到堆里面的。
    例如:
    String s1=“abc”; //在常量区里面存放了一个”abc”字符串对象
    String s2=“abc”; //s2引用常量区中的对象,因此不会创建新的对象
    String s3=new String(“abc”) //在堆中创建新的对象
    String s4=new String(“abc”) //在堆中又创建一个新的对象
    为了便于理解,可以把String s = new String(“abc”)语句的执行人为地分解成两个过程:第一个过程是新建对象的过程,即new String(“abc”),第二个过程是赋值的过程,即String s=。由于第二个过程中只是定义了一个名为s的String类型的变量,将一个String类型对象的引用赋值给s,因此在这个过程中不会创建新的对象。第一个过程中new String(“abc”)会调用String类的构造函数:
    public String(String original){
    //body
    }
    在调用这个构造函数的时候,传入了一个字符串常量,因此语句new String(“abc”)也就等价于”abc”和new String()两个操作了。如果在字符串池中不存在”abc”,则会创建一个字符串常量”abc”,并将其添加到字符串池中,如果存在,则不创建,然后new String()会在堆中创建一个新的对象。所以str3与str4指向的是堆中不同的String对象,地址自然也不相同了。如图 5 5所示。

    下图两种字符串存储方式
    绘图1
    引申:对于String类型的变量s,赋值语句s=null与s=“”是否相同?
    对于赋值语句s=null,其中s是一个字符串类型的引用,它不指向任何一个字符串。而赋值语句s=“”中 s是一个字符串类型的引用,它指向另外一个字符串(这个字符串的值为“”,即空字符串)。
    常见笔试题:
    new String(“abc”)创建了几个对象?
    答案:一个或两个。如果常量池中原来有“abc”,那么只创建一个对象,如果常量池中原来没有字符串“abc”,那么就会创建两个对象。


  • 相关阅读:
    洛谷 P1991 无线通讯网/一本通OJ 1487【例 2】北极通讯网络
    [NOIP2016TG] 洛谷 P1850 换教室
    洛谷 P1169 [ZJOI2007]棋盘制作
    C#中数组、ArrayList和List三者的区别
    【转载】C#读写注册表
    UninstallTool(Windows软件卸载工具)--快捷、方便卸载电脑中的软件
    C#启动一个外部程序-CreateProcess
    C# 调用外部程序Process类
    学习C#,每天一话
    C#中字符串处理(随时更新)
  • 原文地址:https://www.cnblogs.com/anyuan9/p/6171653.html
Copyright © 2011-2022 走看看