美文网首页
StringBuffer、String

StringBuffer、String

作者: hao小子 | 来源:发表于2017-03-18 23:38 被阅读0次

    介绍

    StringBuffer是一个可以动态修改的字符串类,

    String类是不可以修改的,如果被修改的话,它会产生一个新的对象,而不是它本身原来的。

    两者是不同的类型,一般不能强制性转换,可以通过这样的方法。

    String-->StringBuffer:

    String string="123";
    StringBuffer stringBuffer=new StringBuffer(string);
    

    StringBuffer->String:

    StringBuffer stringBuffer=new StringBuffer("123");
    String string=stringBuffer.toString();
    

    下面还是用例子来说明String一般不可修改的原因:

    package blogTest;
    
    /*
     * String类是不可以修改的 如果修改了那么它和之前的 不是同一个对象
     * 从它们的地址可以看出 这里我们用hashCode获取它们的地址.
     */
    
    public class TestStringBuffer {
        
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            System.out.println("-----------------String类:------------------");
            
            String string="123";
            
            System.out.println("原先的string:\t"+string);
            System.out.println("它的hashCode:\t"+Integer.toHexString(string.hashCode()));
            
            System.out.println("\n***************\n");
            
            string=string+"1";
            System.out.println("经过修改的string:\t"+string);
            System.out.println("修改后的它的hashCode:\t"+Integer.toHexString(string.hashCode()));
            
            System.out.println("\n-----------------StringBuffer类:------------------");
            
            StringBuffer stringBuffer=new StringBuffer("123");
            
            System.out.println("原先的stringBuffer:\t"+stringBuffer);
            System.out.println("它的hashCode:\t"+Integer.toHexString(stringBuffer.hashCode()));
            
            System.out.println("\n***************\n");
            
            stringBuffer.append("1");
            System.out.println("经过修改的string:\t"+stringBuffer);
            System.out.println("修改后的它的hashCode:\t"+Integer.toHexString(stringBuffer.hashCode()));
            
        }
    
    }
    /*
     结果如下:
             -----------------String类:------------------
            原先的string:  123
            它的hashCode: be32
            
            ***************
            
            经过修改的string:    1231
            修改后的它的hashCode: 17083f
            
            -----------------StringBuffer类:------------------
            原先的stringBuffer:    123
            它的hashCode: 2a139a55
            
            ***************
            
            经过修改的string:    1231
            修改后的它的hashCode: 2a139a55
    
     */
    
    

    结论:

    我们可以很容易的看出,
    String类经过修改后它的地址发生了变化,这说明它已经不是本身原来的对象而是一个新的对象。
    而StringBuffer则没有这个改变。

    下面就开始介绍StringBuffer了。

    创建就是最基本的了。

    源码如下:(可以带参数也可以不带参数)

    StringBuffer stringBuffer=new StringBuffer("123");
    

    使用的话,一般就是这几个方法了

    append() 追加字符串
    insert() 插入
    delete() 删除
    indeOf() 索引第一次出现的
    charAt() 获取值
    toString() 转换为字符串
    length() 返回字符串长度

    比较不常的:
    capacity() 容量长度
    reverse() 翻转字符串
    trimToSize() 将容量减少到和字符串长度一致
    subString() 返回一个新的String

    基本参数你在IDE上输入的时候基本上后边都有,不记录了。

    这里书写一下

    最常用的append();

    和其它的

    reverse() 修改了本身的值

    trimTosize()

    capacity() 初始化容量好像是16

    subString() 返回的是一个字符串

    package blogTest;
    
    /*
     * String类是不可以修改的 如果修改了那么它和之前的 不是同一个对象
     * 从它们的地址可以看出 这里我们用hashCode获取它们的地址.
     */
    /*
     * 几个主要方法
     * append()
     * reverse()
     * insert()
     * delete()
     * replace()
     */
    
    /*
     * 查看源码还是挺有意思的
     * 
     */
    
    public class TestStringBuffer {
        
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            //  -----------append()  capacity() length()-------------
            System.out.println("-----------append()  capacity() length()-------------\n");
            StringBuffer stringBuffer=new StringBuffer();//初始化默认容量 16
            System.out.println("stringBuffer容量为:\t\t\tstringBuffer.capacity()="+stringBuffer.capacity());//当前容量
            stringBuffer.append('h');
            stringBuffer.append(1);
            stringBuffer.append("hello");
            System.out.println("stringBuffer输出默认为字符串:\t\t"+stringBuffer);//输出默认为字符串 你可以重写toString()方法修改
            System.out.println("stringBuffer容量为:\t\t\tstringBuffer.capacity()="+stringBuffer.capacity());//当前容量
            System.out.println("stringBuffer字符串长度为:\t\tstringBuffer.length()="+stringBuffer.length());//当前字符串长度
            
            // -------------trimToSize()--------------------
            System.out.println("\n-------------trimToSize()--------------------\n");
            stringBuffer.trimToSize();  //将容量缩短为字符串长度
            System.out.println("stringBuffer容量为:\t\t\tstringBuffer.capacity()="+stringBuffer.capacity());//当前容量
            System.out.println("stringBuffer字符串长度为:\t\tstringBuffer.length()="+stringBuffer.length());//当前字符串长度
            
            // -------------reverse()---------------------
            System.out.println("\n-------------reverse()---------------------\n");
            System.out.println("原先的stringBuffer为:\t"+stringBuffer);
            System.out.println("stringBuffer.reverse():\t"+stringBuffer.reverse());
            System.out.println("这时候的stringBuffer为:\t"+stringBuffer);
    
            // -------------subString()---------------------
            System.out.println("\n-------------subString()---------------------\n");
            stringBuffer.reverse();
            System.out.println("stringBuffer:\t\t\t"+stringBuffer);
            
            String strTest=stringBuffer.substring(2);
            System.out.println("stringBuffer.subString(2):\t"+strTest); //忽然发现这里也可以用来转换字符胡灿
        }
    
    }
    /*
    结果如下:
                -----------append()  capacity() length()-------------
                
                stringBuffer容量为:            stringBuffer.capacity()=16
                stringBuffer输出默认为字符串:       h1hello
                stringBuffer容量为:            stringBuffer.capacity()=16
                stringBuffer字符串长度为:     stringBuffer.length()=7
                
                -------------trimToSize()--------------------
                
                stringBuffer容量为:            stringBuffer.capacity()=7
                stringBuffer字符串长度为:     stringBuffer.length()=7
                
                -------------reverse()---------------------
                
                原先的stringBuffer为:   h1hello
                stringBuffer.reverse(): olleh1h
                这时候的stringBuffer为:  olleh1h
                
                -------------subString()---------------------
                
                stringBuffer:           h1hello
                stringBuffer.subString(2):  hello
                    
     */
    
    

    还有两个有意思的:
    StringBuffer的容器扩充方法没找到,只能大概推出来是这样的规则

    // 0--16 1--17 8--24 14-30 15-31 16--32 18--34

    // 注:如果初始化new StringBuffer() 默认是16 .append() 容量一直不变 直到为16 这时候扩充到(16+1)*2=34
    //     如果初始化new String("123") 则默认capacity是3+16 以此类推
    

    关于replace():

    StringBuffer stringBuffer=new StringBuffer();
            stringBuffer.append("12345677654321");
            System.out.println(stringBuffer.replace(1, 3, "1234"));// 1--1234-45677654321
    

    // 后边的是显示结果:
    "1234"替代了stringBuffer的1、2号位"23"。

    也就是
    "23"<--"1234"

    好了就到这里了。
    呃,好像有点乱。

    忽然发现看源码挺好的,

    直接看String和StringBuffer的源码里面,这些方法是怎么实现的。

    下面把Python爬虫整理下,

    那时候不会写博客,不会用Markdown,排版不忍直视。o(╯□╰)o

    之前电脑还原了一次,Python笔记丢失部分,无奈。

    -- 补充 --

    StringBuffer和StringBuilder都可以动态修改字符串,StringBuilder有速度优势,但是StringBuffer是线程安全的。

    所以如果用了线程的话,最好用StringBuffer。

    相关文章

      网友评论

          本文标题:StringBuffer、String

          本文链接:https://www.haomeiwen.com/subject/danpnttx.html