zoukankan      html  css  js  c++  java
  • Java-不可变字符串

    一个字符串对象一旦产生,它的内容就是固定不变的。

    String str1 = "Hello";

    str1 = "Hi";

    请问改变了字符对象没有?

    当然没有,只不过是将 str1 这个引用指向了另一个字符串对象。

    String str2 = "staph";

    String str3 = "staph";

    System.out.print(str2 == str3);

    结果为:true

    java运行时会维护一个String池,对于一些可以共享的字符串对象,会先在String池中查找看是否存在相同的字符串,如果有就直接返回该字符串对象,反之,在String池中创建该字符串对象。以减少内存的耗用

    String str4 = new String("goodboy");

    String str5 = new String("goodboy");

    System.out.print(str4 == str5);

    结果为:false

    ①String str4 = "goodboy"; 和 ②String str4 = new String("goodboy"); 字符串内容相同,但是却天差地别。①会现在String池中查找看是否有与之内容相同的字符串,②直接在堆上创建存储空间,存放字符串内容。

    所以上列程序,相当于是创建了两个字符串对象。所以结果为:false

    API 中 String 的 intern()方法

    在intern() 方法被调用的时候,如果String池中已经包含了相同内容的字符串对象(相同与否由equals()决定),那么会从String池中返回给字符串对象,否则原字符串对象会被加到String池中,并返回这个字符串对象。

    String str1 = "fly";

    String str2 = "weight";

    String str3 = "flyweight"

    String str4 = str1 + str2;

    System.out.print(str4 == str3);

    结果:false

    str4 = (str1 + str2).intern();

    System.out.print(str4 == str3);

    结果:true

    在java中,使用+串联字符串会产生一个新的字符串对象。

  • 相关阅读:
    qt中线程的使用方法
    QT中定时器的使用方法
    Common Lisp学习笔记(八)
    Common Lisp学习笔记(七)
    Common Lisp学习笔记(六)
    vim使用笔记
    Django学习笔记:urlresolvers
    python closures and decorators
    规范命名:变量名的力量
    eclipse openGL glut运行环境配置
  • 原文地址:https://www.cnblogs.com/AI-Cobe/p/8509994.html
Copyright © 2011-2022 走看看