java之StringBuilder和stringbuffer精选

Posted 磊哥的Java历险记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之StringBuilder和stringbuffer精选相关的知识,希望对你有一定的参考价值。

前言:

他强任他强,清风拂山岗.他横任他横,明月照大江

我们上一篇聊到了java之String类,这一片我们聊一下StringBuilder和stringbuffer类,针对于以下的概念,都会有实体例子配合着,给大家演示,希望给历险中的你带来一些帮助!!! 

java之StringBuilder和stringbuffer精选_概念


一.介绍

    StringBuilder类在 Java 5 中被提出,它和StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

    由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer 类。

二.知识点介绍

   1、概述

    2、StringBuilder和String的区别

    3、构造方法

    4、方法

    5、与String的转换

    6、练习

    7、String和StringBuffer

三.知识点详解

1、StringBuilder概述

String StringBuilder 内容固定 内容可变

StringBuilder()方法:

capacity()返回当前容量,16

length()返回长度(字符数量)

append()添加数据

reverse()反转

StringBuilder-->String toString()

String-->StringBuiler

StringBuilder(String s)

int arr[]=1,2,3,数组元素格式拼接:"[1,2,3]"

     我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuilder就可以解决这个问题。

java之StringBuilder和stringbuffer精选_java_02

2、StringBuilder和String的区别

    String的内容是固定的。StringBuilder的内容是可变的。

3、构造方法

    (1)public int capacity():返回当前容量,理论值

    (2)public int length():返回长度(字符数),实际值

代码演示:

package Test2;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";

// java类
public static void main(String args[])
//创建对象
StringBuilder builder = new StringBuilder();
//输出对象
System.out.println("builder:"+builder);
//输出容量
System.out.println("builder.capacity():" +builder.capacity());
//输出长度
System.out.println("builder.length():" +builder.length());

java之StringBuilder和stringbuffer精选_Stringbuffer_03

4、方法

    (1)添加功能:public StringBuilder append(任意类型):添加数据,并返回自身对象

    (2)反转功能:public StringBuilder reverse()

代码演示:

package Test2;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args)
//创建对象
StringBuilder builder = new StringBuilder();
System.out.println("builder:"+builder);
//builder.append("任意类型");
StringBuilder builder2 = builder.append("磊哥的java历险记");

System.out.println("builder2:"+builder2);
System.out.println(builder== builder2); //true
//添加任意类型
builder.append("磊哥");
builder.append("的java历险记");
builder.append(true);
builder.append(100+"----");
//链式编程
builder.append("磊哥").append("的java历险记").append(true).append(100);
System.out.println("builder:"+builder);
//反转
builder.reverse();
System.out.println("builder:"+builder);

java之StringBuilder和stringbuffer精选_java_04

5、与String的相互转换

    StringBuilder--> String

    public String toString():通过toString()就可以实现把StringBuilder转成String

    String -->StringBuilder

    StringBuilder(Stringstr):通过构造方法就可以实现把String转成StringBuilder

代码演示:

package Test2;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args)

//StringBuilder-- String
StringBuilder builder = new StringBuilder();
builder.append("hello").append("world");
String s = builder.toString();
System.out.println(s);

//String-- StringBuilder
String s1 = "helloworld";
StringBuilder builder2 = new StringBuilder(s1);
System.out.println(builder2);

java之StringBuilder和stringbuffer精选_代码_05

6、练习

    (1)数组元素格式拼接

    举例:int[] arr = 1,2,3;结果:[1, 2, 3]、

代码演示:

package Test2;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args)
//定义一个数组
int[] arr = 1, 2, 3;
//调用下面方法
String s = arrayToString(arr);
//输出结果
System.out.println("s:" + s);
System.out.println("============="+name+"=============");

/*
* 写方法实现拼接
* 两个明确:
* 返回值类型:String
* 参数列表:int[] arr
*/
public static String arrayToString(int[] arr)
StringBuilder builder = new StringBuilder();
builder.append("[");

//for循环,把数组中每一个数字都要遍历一下
for( int x = 0;x <= arr.length - 1;x++)
//X的值,不能超过数值最大的值
if(x<arr.length - 1)
//添加数值并附上“ ,”
builder.append(arr[x]).append(",");
else
//添加最后一个数值,并添加]
builder.append(arr[x]).append("]");

//创建result接收拼接好的字符串
String result = builder.toString();
//返回result
return result;

java之StringBuilder和stringbuffer精选_StringBuilder_06

java之StringBuilder和stringbuffer精选_代码_07

(2)字符串反转

代码演示:

package Test2;

import java.util.Scanner;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args)
//1:键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String s = sc.nextLine();
//3:调用方法
String result = myReverse(s);
//4:输出结果
System.out.println("result:"+result);

/*
* 2:写方法实现反转
* 两个明确:
* 返回值类型:String
* 参数列表:String
*/
public static String myReverse(String s)
//String -- StringBuilder -- reverse() --String
StringBuilder builder= new StringBuilder(s);
//反转
builder.reverse();
//转化成字符串,返回参数值
String result =builder.toString();
return result;

java之StringBuilder和stringbuffer精选_概念_08

6.1.题目

(1)例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串

6.1.1   实验步骤

(1)键盘录入一个字符串

(2)写方法实现判断一个字符串是否是对称字符串

两个明确:返回值类型:boolean,参数列表:String s

(3)调用方法、输出结果

代码演示:

package Test2;

import java.util.Scanner;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args)
//1:键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String s = sc.nextLine();
//3:调用方法
boolean b = isSymmetry(s);
//4:输出结果
System.out.println("b:"+b);


public static boolean isSymmetry(String s)
//把字符串反转,和反转前的字符串进行比较,如果内容相同,就说明是对称字符串
StringBuilder builder = new StringBuilder(s);
builder.reverse();
String result = builder.toString();
//比较
return result.equals(s);

java之StringBuilder和stringbuffer精选_代码_09

7、String和StringBuffer

     String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。

      String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。

      当我们对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer 线程同步(安全),速度慢

StringBuilder 不同步(不安全),速度快

所使用的方法完全一样,在一般情况下,我们会选择StringBuilder来使用

append()
capacity()
charAt()
delete()
deleteCharAt()
indexOf()
insert()
lastIndexOf()
length()
replace()
reverse()
substring()
toString()

7.1   概念

     字符串是不可变的,所以每拼写一次字符串均会产生新的对象,而字符串缓冲区是一个可变的字符串临时存储区域。在该区域内存储、拼写需要的字符串,当需要真正的字符串时,再将存储区内的字符串取出,这样全部过程只有一个字符串缓冲区对象,更为高效。

     同步安全问题会在多线程的学习后了解。

     StringBuffer是线程同步的(安全的),StringBuilder是不同步的(不安全的),二者方法完全一致。

     线程同步操作需要消耗更多的系统资源,所以更慢,而在日常开发过程中,同一个字符串的操作通常不会涉及多线程问题,所以在不考虑安全问题的情况下,尽量使用速度更快的StringBuilder。

7.2   常见方法

    (1)public StringBuffer append(Xxx xxx) //向字符串缓冲区中添加字符串

    (2)public String toString()   //将缓冲区内内容返回

代码演示:

package Test2;



import java.util.Scanner;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";

//其他删除、修改、插入等方法可自行查询API

/*
*StringBuffer 字符串缓冲区 线程安全 效率低
* StringBuilder 字符串缓冲区 线程不安全 效率高
*
* publicStringBuffer append(Xxx xxx) //向字符串缓冲区中添加字符串
* publicString toString() //将缓冲区内内容返回
*/

public static void main(String[] args)
String s ="";
for(int i = 0; i < 5; i++)
s+="i love java "+i;

System.out.println(s);

StringBuffer sb = new StringBuffer();
for(int i = 0; i < 5; i++)
sb.append("i lova java "+i);

sb.append(true);
sb.append("$$$");
sb.append("***");
sb.append(new Person());
System.out.println(sb.toString());

java之StringBuilder和stringbuffer精选_java_10

7.3   链式调用:

      在StringBuffer的方法中,有许多方法的返回值都是该类型本身,如append方法。这时,阅读API后发现,其实返回值就是其本身,这时我们可以继续调用append方法,依次类推,这种调用方法叫做链式调用。

    如:

    StringBuffer sb = new StringBuffer();

    sb.append(“aaa”) .append(“bbb”) .append(“ccc”).append(“ddd”) ;

    String data = sb.toString(); //data的结果为aaabbbcccddd

代码演示:

package Test2;
public class Tested
private final static String name = "磊哥的java历险记-@51博客";
/*
* 链式调用
*/

public static void main(String[] args)
StringBuffer sb = new StringBuffer();
// StringBuffers b2 = sb.append("磊哥 ");
// StringBuffer b3 = sb2.append("java历险记 ");
// StringBuffers b4 = sb3.append("_51博客 ");
//
// System.out.println(sb);
// System.out.println(sb2);
// System.out.println(sb3);
// System.out.println(sb4);
sb.append("磊哥").append("java历险记").append("_51博客");
System.out.println(sb);

java之StringBuilder和stringbuffer精选_Stringbuffer_11

7.4  代码精炼 

在使用数组的时候,我们会提取数组中的元素,那么现在我们完成的是,将数组中的元素一一的提取出来,通过我们的StringBuffer来完成数组中元素的拼接。

7.4.1  题目

(1)将数组44,33,55,11,22拼接成一个字符串:[44,33,55,11,22]

7.4.2   实验步骤

(1)声明一个类Test

(2)在Test类中,声明一个数组a,声明一个arrayToString方法,将数组传递进行完成拼接,最后打印拼接完的结果

代码演示:

package Test2;



import java.util.Scanner;

public class Tested
private final static String name = "磊哥的java历险记-@51博客";


public static void main(String[] args)
// 定义一个数组
int[] arr = 44,33, 55, 11, 22 ;

// 定义功能

// 方式:用StringBuffer做拼接的方式
String s2 = arrayToString(arr);
System.out.println("s2:" + s2);


// 用StringBuffer做拼接的方式,这种方式节省内存空间
public static String arrayToString(int[] arr)
StringBuffer sb =new StringBuffer();

sb.append("[");
for (int x = 0; x< arr.length; x++)
if (x ==arr.length - 1) //最后一个元素
sb.append(arr[x]+"]");
else
sb.append(arr[x]).append(", ");//拼接后为StringBuffer类型的。



return sb.toString();//StringBuffer类下的toString()方法,返回字符串String类型



java之StringBuilder和stringbuffer精选_Stringbuffer_12

结语:

与其担心未来,不如现在好好努力。这条路上,只有奋斗才能给你安全感。不要轻易把梦想寄托在某个人身上,也不要太在乎身旁的耳语,因为未来是你自己的,只有你自己能给自己最大的安全感。别忘了答应自己要做的事,别忘记自己想去的地方,不管那有多难,有多远!!!

概念和代码虽多一些,但是我尽量用最简单的话语描述,概念的理解就看兄弟们自己的了,我已经替大家削弱很多了,兄弟们可以动动手敲一敲代码,加深自己的感受~

感谢兄弟们持续关注!

java之StringBuilder和stringbuffer精选_StringBuilder_13


以上是关于java之StringBuilder和stringbuffer精选的主要内容,如果未能解决你的问题,请参考以下文章

Java之String+StringBuffer+StringBuilder

四:Java之字符串操作StringStringBuffer和StringBuilder

Java基础——数组应用之StringBuilder类和StringBuffer类

Java字符串之String与StringBuilder

Java学习笔记之StringStringBuffer和StringBuilder

Java: Java学习笔记之 String的常见用法