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

    String&StringBuilder&StringBuffer的关联与不同

     
    1. 首先String是不可以改变的,也就是说,java内置的基本数据类型String被表示为final类,final类不可以被继承。
    2. 当一个方法以String类型为参数,返回以个String类型的对象,那么,被引入为参数的String对象,其地址引用时没有改变的,返回的新的String对象,是新创建的。
    3. 当“+”与String对象进行操作时,实际上是调用了String对象内置的append方法(MayBe),实际上,java虚拟机非显示的调用了java.lang.StringBuilder类,StringBuilder类具有append方法,StringBuilder对象被创建时预定了一定的内存大小,我们可以手动的为其指定大小。
    4. StringBuilder还有其他的方法,如reverse , delete ,insert , replace , subString。
    5. StringBuffer与StringBuilder的功能相同,StringBuilder出现于java se5 , StringBuffer是线程安全的。

    StringBuilder线程不安全的例子

    Stringbuilderdemo代码  
    package com.xiva.demo;  
    
    public class StringBuilderDemo extends Thread {   
    
        private StringBuilder sb;   
    
        public StringBuilderDemo(String name,StringBuilder sb) {   
    
            super(name);   
    
            this.sb = sb;   
    
        }   
    
          
    
        @Override   
    
        public void run() {   
    
            for (int i = 0; i < 10000; i++) {   
    
                sb.append("abc");  
    
    //          System.out.println(Thread.currentThread().getName()+sb.toString());  
    
            }   
    
        }   
    
       
    
      
    
        public static void main(String[] args) {   
    
            StringBuilder sBuilder = new StringBuilder();   
    
            StringBuilderDemo mt = new StringBuilderDemo("sBuilder线程",sBuilder);   
    
    //      new Thread(mt).start();  
    
            mt.start();  
    
            for (int i = 0; i < 10000; i++) {   
    
                sBuilder.append("abcd");   
    
            }  
    
            System.out.println("main"+sBuilder.length());  
    
    //      System.out.println("main"+sBuilder.toString());   
    
        }  
    
    }   

     main所打印出的sBuilder的长度不定,也就是说mt线程执行的时候,main函数对sBuilder仍在影响,而下面的例子中,所打印出的(线程是安全的)长度是一定的!

    Stringbufferdemo代码  
    package com.xiva.demo;  
    
      
    
    public class StringBufferDemo extends Thread {   
    
        private StringBuffer sBuffer;   
    
        public StringBufferDemo(String name,StringBuffer sb) {   
    
            super(name);   
    
            this.sBuffer = sb;   
    
        }   
    
          
    
        @Override   
    
        public void run() {   
    
            for (int i = 0; i < 10000; i++) {   
    
                sBuffer.append("abc");  
    
    //          System.out.println(Thread.currentThread().getName()+sb.toString());  
    
            }  
    
              
    
        }   
    
       
    
      
    
        public static void main(String[] args) {   
    
            StringBuffer sBuffer = new StringBuffer();   
    
            StringBufferDemo mt = new StringBufferDemo("sBuffer线程",sBuffer);  
    
            mt.start();  
    
    //      new Thread(mt).start();  
    
    //      new Thread(mt).start();  
    
            for (int i = 0; i < 10000; i++) {   
    
                sBuffer.append("abcd");   
    
            }  
    
            while(mt.isAlive()){   
    
            }  
    
            System.out.println(sBuffer.length());   
    
        }  
    
    }  

    代码转载自:

     

  • 相关阅读:
    Django连接SQL Server,安装相关扩展包及相关配置
    安装pipenv
    报错及网络上的解决方案
    Nucleus-SE迁移:未实现的设施和兼容性
    RTOS诊断和错误检查
    Nucleus SE RTOS初始化和启动
    Nucleus 实时操作系统中断(下)
    Nucleus 实时操作系统中断(上)
    系统时间
    应用程序计时器
  • 原文地址:https://www.cnblogs.com/tatame/p/2625902.html
Copyright © 2011-2022 走看看