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());   
    
        }  
    
    }  

    代码转载自:

     

  • 相关阅读:
    任意文件读取与下载漏洞
    命令执行与代码执行漏洞原理
    安全面试知识汇总
    科学使用Github(gayhub)搜索想要的项目
    业务逻辑漏洞--注册-登录-改密码页面总结
    Linux提权之SUID提权
    攻防世界XCTF--伪造请求头XFF和Referer(第九题)
    攻防世界XCTF--两种传输方式get_post(第八题)
    攻防世界XCTF--一个简单的PHP后端验证(第七题)
    课时14.DTD文档声明上(掌握)
  • 原文地址:https://www.cnblogs.com/tatame/p/2625902.html
Copyright © 2011-2022 走看看