zoukankan      html  css  js  c++  java
  • String和StringBuffer的区别

    1.String:

    ​ 是对象不是原始类型.
    ​ 为不可变对象,一旦被创建,就不能修改它的值.
    ​ 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
    ​ String 是final类,是不能被继承的。


    2.StringBuffer:

    ​ 是一个可变对象,对他进行修改时不需要重新创建对象。

    ​ 需要以构造命令进行创建,StringBuilder sb = new StringBuilder();,不能通过赋值命令进行赋值。

    ​ 对象被创建后,会在内存中分配一个内存空间并初始化null,可以通过append方法对他赋值:sb.append();

    如此程序所示,String需要重新创建对象,原内容要被回收,影响性能。

    String str = new String("welcome to ");
    str += "here";
    

    故我们可以将程序改为:

    String str = new String("welcome to ");
    StringBuffer sb = new StringBuffer(str);
    sb.append("here");
    str = sb.toString();
    

    String类重写了equals方法和hashcode方法,但是StringBuffer类没有重写equals方法和hashcode方法,所以请看下面的程序(摘自核心卷Ⅰ P171):

    String s = "OK";
    StringBuffer sb = new StringBuffer(s);
    System.out.println(s.hashCode()+" "+ sb.hashCode());// 2524 1355531311
    String t = new String("OK");
    StringBuffer tb = new StringBuffer(t);
    System.out.println(t.hashCode()+" "+ tb.hashCode());// 2524 1435804085
    

    字符串s与t拥有相同的散列码,这是因为字符串的散列码是由内容导出的。而字符串缓冲sb和tb却有着不同的散列码,这是因为在StringBuffer类中没有定义哈市Code方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。考虑到因为创建StringBuffer时需要分配内存空间,造成 sb 和 tb hashCode不同。

  • 相关阅读:
    P4343 [SHOI2015]自动刷题机
    P1083 [NOIP2012 提高组] 借教室
    [AGC记录] AGC003题解
    [做题记录-乱做] [AGC003E] Sequential operations on Sequence
    [AGC记录] AGC002题解
    [AGC记录] AGC001题解
    [做题记录-乱做] [AGC001F] Wide Swap
    [做题记录-计数] [ARC087D] Squirrel Migration
    [做题记录-计数] [九省联考2018]秘密袭击coat
    [做题记录-计数][AGC024E] Sequence Growing Hard
  • 原文地址:https://www.cnblogs.com/njuptzheng/p/11681592.html
Copyright © 2011-2022 走看看