how2j.cn


工具版本兼容问题
StringBuffer是可变长的字符串

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



5分9秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



关键字 简介 示例代码
append delete insert reverse
追加 删除 插入 反转
示例代码
length capacity
长度 容量
示例代码
练习-StringBuffer性能
示例代码
答案-StringBuffer性能
示例代码
练习-MyStringBuffer
示例代码
答案-MyStringBuffer
示例代码
示例 1 : 追加 删除 插入 反转   
示例 2 : 长度 容量   
示例 3 : 练习-StringBuffer性能   
示例 4 : 答案-StringBuffer性能   
示例 5 : 练习-MyStringBuffer   
示例 6 : 答案-MyStringBuffer   

示例 1 :

追加 删除 插入 反转

append追加
delete 删除
insert 插入
reverse 反转
package character; public class TestString { public static void main(String[] args) { String str1 = "let there "; StringBuffer sb = new StringBuffer(str1); //根据str1创建一个StringBuffer对象 sb.append("be light"); //在最后追加 System.out.println(sb); sb.delete(4, 10);//删除4-10之间的字符 System.out.println(sb); sb.insert(4, "there ");//在4这个位置插入 there System.out.println(sb); sb.reverse(); //反转 System.out.println(sb); } }
示例 2 :

长度 容量

为什么StringBuffer可以变长?
和String内部是一个字符数组一样,StringBuffer也维护了一个字符数组。 但是,这个字符数组,留有冗余长度
比如说new StringBuffer("the"),其内部的字符数组的长度,是19,而不是3,这样调用插入和追加,在现成的数组的基础上就可以完成了。
如果追加的长度超过了19,就会分配一个新的数组,长度比原来多一些,把原来的数据复制到新的数组中,看上去 数组长度就变长了 参考MyStringBuffer
length: “the”的长度 3
capacity: 分配的总空间 19

注: 19这个数量,不同的JDK数量是不一样的
package character; public class TestString { public static void main(String[] args) { String str1 = "the"; StringBuffer sb = new StringBuffer(str1); System.out.println(sb.length()); //内容长度 System.out.println(sb.capacity());//总空间 } }
package character;
 
public class TestString {
 
    public static void main(String[] args) {
        String str1 = "the";

        StringBuffer sb = new StringBuffer(str1);
        
        System.out.println(sb.length()); //内容长度
        
        System.out.println(sb.capacity());//总空间
 
    }
 
}

示例 3 :

练习-StringBuffer性能

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
String与StringBuffer的性能区别?

生成10位长度的随机字符串
然后,先使用String的+,连接10000个随机字符串,计算消耗的时间
然后,再使用StringBuffer连接10000个随机字符串,计算消耗的时间

提示: 使用System.currentTimeMillis() 获取当前时间(毫秒)
练习-StringBuffer性能
示例 4 :

答案-StringBuffer性能

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

7分27秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


package character; public class TestString { public static void main(String[] args) { int total = 10000; String s = randomString(10); StringBuffer sb = new StringBuffer(); String str1 = ""; long start = System.currentTimeMillis(); for (int i = 0; i <total; i++) { str1+=s; } long end = System.currentTimeMillis(); System.out.printf("使用字符串连接+的方式,连接%d次,耗时%d毫秒%n",total,end-start); total *=100; start = System.currentTimeMillis(); for (int i = 0; i <total; i++) { sb.append(s); } end = System.currentTimeMillis(); System.out.printf("使用StringBuffer的方式,连接%d次,耗时%d毫秒%n",total,end-start); } private static String randomString(int length) { String pool = ""; for (short i = '0'; i <= '9'; i++) { pool += (char) i; } for (short i = 'a'; i <= 'z'; i++) { pool += (char) i; } for (short i = 'A'; i <= 'Z'; i++) { pool += (char) i; } char cs[] = new char[length]; for (int i = 0; i < cs.length; i++) { int index = (int) (Math.random() * pool.length()); cs[i] = pool.charAt(index); } String result = new String(cs); return result; } }
示例 5 :

练习-MyStringBuffer

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
根据接口IStringBuffer ,自己做一个MyStringBuffer
package character; public interface IStringBuffer { public void append(String str); //追加字符串 public void append(char c); //追加字符 public void insert(int pos,char b); //指定位置插入字符 public void insert(int pos,String b); //指定位置插入字符串 public void delete(int start); //从开始位置删除剩下的 public void delete(int start,int end); //从开始位置删除结束位置-1 public void reverse(); //反转 public int length(); //返回长度 }
package character;
 
public interface IStringBuffer {
    public void append(String str); //追加字符串 
    public void append(char c);  //追加字符
    public void insert(int pos,char b); //指定位置插入字符
    public void insert(int pos,String b); //指定位置插入字符串
    public void delete(int start); //从开始位置删除剩下的
    public void delete(int start,int end); //从开始位置删除结束位置-1
    public void reverse(); //反转
    public int length(); //返回长度
}
package character; public class MyStringBuffer implements IStringBuffer{ }
package character;
public class MyStringBuffer implements IStringBuffer{
}
示例 6 :

答案-MyStringBuffer

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
因为这个答案比较复杂,为了便于理解和消化,专门开了一个章节来讲解这个答案: MyStringBuffer


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-03-22 第一题作业
AKZ



没看答案自己写的
package day_10;

import java.util.Random;

public class Demo02 {
public static void main(String[] args) {
//	String与StringBuffer的性能区别?
//
//			生成10位长度的随机字符串
//			然后,先使用String的+,连接10000个随机字符串,计算消耗的时间
//			然后,再使用StringBuffer连接10000个随机字符串,计算消耗的时间
//
//			提示: 使用System.currentTimeMillis() 获取当前时间(毫秒)
	//随机字符串
	//使用String的+,连接10000个随机字符串
	String moreString="";
	String str="";
	long startString=System.currentTimeMillis();
	for(int i=0;i<10000;i++) {
		for(int j=0;j<10;j++) {
			while(true) {
			int randomInteger=0;
			char integerToChar=0;
			randomInteger=(int)(new Random().nextInt(75)+48);
			if((randomInteger>=48&&randomInteger<=57)||(randomInteger>=65&&randomInteger<=90)||(randomInteger>=97&&randomInteger<=122)) {
				integerToChar=(char)(randomInteger);
				str+=integerToChar;
				break;
				}
			}
		}
		moreString+=str;
		str="";
	}
	System.out.println("使用字符串连接+的方式,连接10000次,耗时"+(System.currentTimeMillis()-startString)+"毫秒");
	//使用StringBuffer连接10000个随机字符串
	int randomInteger=0;
	char integerToChar=0;
	StringBuffer	moreStringBuffer=new StringBuffer();
	StringBuffer 	singleStringBuffer=new StringBuffer();
	long startStringBuffer=System.currentTimeMillis();
	for(int i=0;i<1000000;i++) {
		for(int j=0;j<10;j++) {
			while(true) {
				randomInteger=(int)(new Random().nextInt(75)+48);
				if((randomInteger>=48&&randomInteger<=57)||(randomInteger>=65&&randomInteger<=90)||(randomInteger>=97&&randomInteger<=122)) {
				integerToChar=(char)(randomInteger);
				singleStringBuffer.append(integerToChar);
				break;
				}
			}
		}
		moreStringBuffer.append(singleStringBuffer);
		singleStringBuffer.delete(0, singleStringBuffer.length());
	}
	System.out.println("使用StringBuffer的方式,连接1000000次,耗时"+(System.currentTimeMillis()-startStringBuffer)+"毫秒");
}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-01-24 没有看答案自己做的不知道有没问题。
清水浩



绝的不看答案不稳。
/*2018年1月24日22:46:08
 *练习:String与StringBuffer的性能区别?

生成10位长度的随机字符串
然后,先使用String的+,连接10000个随机字符串,计算消耗的时间
然后,再使用StringBuffer连接10000个随机字符串,计算消耗的时间
提示: 使用System.currentTimeMillis() 获取当前时间(毫秒)
 * */
package digit;
import java.util.Arrays;
public class TestNumber21
{
	public static void main(String[]args)
	{
		String[] strArr=new String[10000];
		char[] chArr=new char[10];//生成10位长度的随机字符串
		char c;
		short from=(short)'0';
		short to=(short)'z';
		for(int j=0;j<strArr.length;++j)
		{
			for(int i=0;i<chArr.length;++i)
			{
				while (true)
				{
					c=(char)(Math.random()*to-from+from);
					if(Character.isLetter(c)|Character.isDigit(c))
					{
						chArr[i]=c;
						break;
					}
				}	
			}
			strArr[j]=String.valueOf(chArr);
		}
		
		String str="";
		for(int i=0;i<strArr.length;++i)
		{
			str+=strArr[i];	
		}
		
		//String str=strArr[0]+strArr[1]+strArr[2]+strArr[3];
		long start=System.currentTimeMillis();
		System.out.println(str);//str接收10000个随机字符串数组相加
		long over=System.currentTimeMillis();
		System.out.println(over-start);
	}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2017-11-22 好像immutable的读音,第二个音节是缪,不是妈
2017-10-22 很多代码包括提问里面的,我都看得懂,但是自己拿到题目的时候却很难写的出来,有的时候思路有,但是实现不了
2017-10-20 字符串拼接每次新生成的对象存在内存哪里
2017-08-04 MyStringBuffer.java作业
2017-07-16 第一题 作业
2017-07-07 MyStringBuffer
2017-05-21 用stringbuffer怎么追加不了啊?
2017-04-07 为什么不讲StringBuilder?
2017-01-25 为什么有时候会出现这样的异常 sb.append(s);




提问之前请登陆
关于 JAVA 基础-数字与字符串-StringBuffer 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 389538688
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图