• Java总结之String Buffer


    2017年7月5号面试的时候,在String和StringBuffer的区别问题上卡住了,虽然平常这两个类用的比较多,但是还没有认真研究过他们,所以借这个机会写一下二者的区别。

    以及对StringBuffer进行一次系统的复习。

    package cn.wen.basic.test;
    
    import org.junit.Test;
    
    /**
     * StringBuffer api解释为 线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。
     * 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。 优点:
     * 在源码中看到StringBuffer中所有的方法都被synchronized修饰符修饰,这也意味着StringBuffer中的方法在操作过程中需要做到线程同步,来保证在不同的线程中
     * 所执行的线程中调用顺序一致的顺序发生。 替代类: StringBuilder 不同之处
     * :StringBuilder不支持同步。所以比StringBuffer更快 面试题String与StringBuffer的区别:
     * String所存储的字符串不能被修改,覆盖后是与覆盖前是两个不同的对象。 String中不支持线程同步
     * StringBuffer线程安全,在多线程中可以很好的执行,但是因为涉及到同步,可能程序的执行效率会慢一些。
     * StringBuffer是一种辅助类,可以预先在内存中预留指定长度的字符缓冲区,这样使用StringBuffer类的append方法比使用String+操作符添加字符到一个已经存在的
     * 字符串后面要更有效率,因为String在使用+操作符添加字符将一个字符串中时,字符串对象需要寻找一个更大的内存空间来存储数据,这非常耗时间。
     * 
     * @author V
     *
     */
    
    public class testStringBuffer {
    
    	@Test
    	public void testStringBufferConstructor() {
    
    		StringBuffer sb = new StringBuffer();// 构造一个没有字符的字符缓冲区,初始容量为16个字符,如果初始容量不够用,自动增加一倍
    		String str1 = "12345678901234567890";
    		sb.append(str1);
    		System.out.println(sb);
    		/*
    		 * 测试中我发现,如果你指定了支付缓冲区的容量,但是你存储的时候字符多于设置值时,依然会自动增长一倍+2 发现源码中有这样一段代码 int
    		 * newCapacity = (value.length << 1) + 2; if (newCapacity - minCapacity
    		 * < 0) { newCapacity = minCapacity; }
    		 * 意思就是说如果当前将要存储的字符串长度大于容量,先将容量的大小增加一倍并+2,如果还不够就将容量 设置为字符串的长度
    		 * 如果增長后仍然不滿足其需要的容量,會將容量設置為字符串的字符長度。
    		 */
    		StringBuffer sb1 = new StringBuffer(20);// 构造一个没有字符指定容量为20个字符的字符缓冲区
    		String str2 = "1234567890abcdefghijklmnopqrstuvwxyz";
    		sb1.append(str2);
    		System.out.println(sb1.capacity());
    		System.out.println(sb1 + ";长度:" + sb1.length());
    		StringBuffer sb2 = new StringBuffer(25);
    		System.out.println(sb2.capacity());
    		String str3 = "12345678900123456789asdfghjklqwertyuiopasdfghjklzxcvbnm";
    		sb2.append(str3);
    		System.out.println(sb2.capacity() + ";字符长度:" + sb2.length());
    
    		// 如果在构造方法中传入一串字符时,缓冲区容量会默认为字符长度+16;
    		StringBuffer sb3 = new StringBuffer("abcdefghijekeererad");
    		System.out.println("字符串长度:" + sb3.length() + "; 字符缓冲区容量:" + sb3.capacity());
    	}
    
    	/**
    	 * 测试StringBuffer的方法
    	 */
    	@Test
    	public void testStringBufferMethod() {
    		String str = "addfdfa";
    		StringBuffer sb0 = new StringBuffer(str);
    		System.out.println("-------末尾添加-------");
    		sb0.append("d");// 在序列末尾加一个字符
    		System.out.println(sb0.toString());
    		char[] ch = { 's', 'o', 'f', 't' };
    		/**
    		 * 末尾添加数据的类型还有很多,包括boolean char String int double object等 不在一一列举
    		 */
    		sb0.append(ch);// 在序列末尾加一个字符(char)数组
    		System.out.println(sb0.toString());
    		sb0.append(ch, 1, 3);// 在序列末尾加一个字符数组并指定从数组的第1个位置向后长度为3
    		System.out.println(sb0.toString());
    		String str1 = "big";
    		sb0.append(str1);// 在序列末尾加一串String的字符串
    		System.out.println(sb0.toString());
    		sb0.append(str1, 1, 2);// 在序列末尾加一串指定起始位置为1结束位置为2的字符串
    		System.out.println(sb0.toString());
    		int i = 0;
    		sb0.append(i);// 在序列末尾加一个int类型的数据 插入后类型变为StringBuffer类型
    		System.out.println(sb0);
    		/*
    		 * 查找方法使用
    		 */
    		System.out.println("-------查找方法-------");
    		char a = sb0.charAt(0);
    		System.out.println(a);
    		String str2 = "add";
    		int index = sb0.indexOf(str2);// 返回str2字符串第一次出现的索引值
    		System.out.println(index);
    		char[] ch1 = new char[100];
    		sb0.getChars(0, 5, ch1, 8);//查找StringBuffer中的从0开始到5的并重新分配给一个char数组
    		for (char c : ch1) {
    			if (c != '') {
    				System.out.print(c);
    			}
    		}
    		System.out.println("----------插入-----------");
    		char[] ch2={'w','a','r','e'};
    		sb0.insert(0, ch2);
    		System.out.println(sb0.toString());
    		sb0.insert(0, ch2, 1, ch2.length-1);//在stringBuffer的0位置插入ch2并指定插入ch2的开始位置与长度
    		System.out.println(sb0.toString());
    		sb0.delete(1, 5);//删除1到5的字符 不包含5
    		System.out.println(sb0.toString());
    
    	}
    
    }
    

      

  • 相关阅读:
    struts2工作流程
    单播,多播(组播),广播,详细讲解呀
    UDP和TCP两种协议的传输数据长度分析
    内置方法 call enter exit
    内置方法 new-del
    内置方法 str-repr
    疏忽知识点记忆(待补充)
    判断一个数据类型的属性的多种方法与判断是否是继承
    反射
    初始化,实例化
  • 原文地址:https://www.cnblogs.com/smallbrokenchildwen/p/7136918.html
Copyright © 2020-2023  润新知