zoukankan      html  css  js  c++  java
  • java String、StringBuilder

    Java中的String和StringBuilder类:

    1.String对象是不可变的。每一个看起来修改了String值的方法,实际上都是创建了全新的String对象。代码示例如下:

    String str12="abc";
            str12.toUpperCase();
            System.out.println(str12);

    上面程序输出结果为 abc

     str12.toUpperCase();该方法是将str12大写,但实际上是给大写之后的字符串重新开辟了空间,丝毫不会影响str12的值。

    在计算机的程序设计中,对字符串的操作是非常频繁的。为了提高效率,不会为每一个字符串都开辟空间。相当于一个“拘留池”,创建的字符串变量都存储在拘留池中,当有新的String变量时,jdk会先判断
    一下,拘留池中是否已经存在该字符串。如果有,直接将变量的引用指向该字符串,如果没有才会去开辟空间。
    注意:
    这个拘留池效应,只针对非new出来的字符串,如果是String str=new String("abc");那么不管拘留池中是否已经存在“abc”这个字符串,都会给重新开辟空间。因为这个语句的执行顺序是:先为abc开辟
    一个空间,然后再将str这个引用指向这个空间。

    2.我们在程序中经常会写

    System.out.println("a"+1+"b");

    这里深入讲解一下,重载操作符“+”;

    1.println()是将括号内的值转换成string字符串,然后输出的。其实就是去调用toString()方法。

    2.当有"+"这个重载操作符的时候,编译器会自动创建StringBuilder对象来处理括号内的字符串操作。

      这里稍微分析下,为什么编译器会这么干:因为String是不可变的,当我们每次给字符串“a”连接一个字符串“b”的时候,必然需要重新开辟一个新的空间,然后将值copy进去。效率低,还会产生需要垃圾回收的一系列对象。因此这里最好使用可变的StringBuilder对象来处理。

    3.这里介绍下StringBuilder:

      它是可变的,当需要增加某个字符串长度的时候,直接append就可以了。

      当使用StringBuilder str=new StringBuilder()这个无参构造函数来创建StringBuilder对象的时候,会默认创建长度为16的char[]类型的数组。当你调用append()方法追加的字符串长度大于16的时候(str.length=19),就会需要重新开辟空间。此时内部会将value的值左移+2(如当前是16,二级制是10000,左移之后就是100000(对应10进制数是32),32+2=34),比较value左移+2的值与当前字符串长度与新追加的字符串长度之和,谁的值比较大就取这个大的值去开辟相应的空间长度。

      因为默认开辟的空间只有16个字符大小,在我们还用StringBuilder对象的时候,如果超出这个长度就需要重新开辟空间,就失去了StringBuilder的优势。所以,当我们可以大致确定所需要的字符串长度时,建议使用StringBuilder(XXX)这个构造函数,用来减少重新分配的次数,提升性能。

  • 相关阅读:
    c#添加托盘图标右键后显示菜单选项
    mysql workbench修改字段报错
    mysql增删改查语句
    连接win7的mysql很慢解决方法
    uvm_cmdline_processor
    cadence help文件库调出指令 :cdnshelp
    设置开机自动运行vncserver
    Vector bit-select and part-select addressing verilog片选写法
    Verilog三段式状态机描述
    同步FIFO学习
  • 原文地址:https://www.cnblogs.com/shen-qiang/p/9777703.html
Copyright © 2011-2022 走看看