StringBuilder和StringBuffer非常类似, 均代表可变的字符串序列. 这两个类都是抽线类AbstractStringBuilder的子类, 方法几乎一样

/******String修改引用, StringBuilder/StringBuffer修改源字符串*******/
public static void main(String[] args) {
String s1 = new String("abcdef");
System.out.println(Integer.toHexString(s1.hashCode()));
System.out.println(s1); s1 = "hdfa"; // 新建一个字符串, 而不是改变原来字符串的内容
System.out.println(Integer.toHexString(s1.hashCode()));
System.out.println(s1); System.out.println("###############################"); StringBuilder sb = new StringBuilder("hahahaha"); System.out.println(Integer.toHexString(sb.hashCode()));
System.out.println(sb); sb.setCharAt(2, 'Z'); // 改变原来字符串的内容
System.out.println(Integer.toHexString(sb.hashCode()));
System.out.println(sb);
}
/*
ab199863
abcdef
30cab7
hdfa
###############################
3b192d32
hahahaha
3b192d32
haZahaha
*/

StringBuilder

abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
byte[] value
// 以下代码shenglue
}

显然, 内部也是一个字符数组, 但这个数组没有像String类中用final修饰

StringBuilder与StringBuffer区别:

1.StringBuffer是JDK1.0版本提供的类, 线程安全, 做线程同步检查, 效率较低

2.StringBuilder是JDK1.5版本提供的类, 线程不安全, 不做线程同步检查, 因此效率较高, 建议使用此种方法

常用方法

注意链式调用

重载public StringBuilder append(...)方法可以为该StringBuilder对象添加字符串序列, 仍然返回对象自身

public StringBuilder delet(int start, int end)可以删除从start开始到end-1为止的一段字符序列, 仍然返回自身对象

public StringBuilder deleteCharAt(int dex)移除此序列指定位置上的字符, 仍然返回自身对象

重载public StringBuilder insert(...)方法可以为该StringBuilder对象在指定位置插入字符序列, 仍然返回自身对象

public StringBuilder reverse()用于将字符序列逆序, 仍然返回自身对象

public StringBuilder toString()返回此序列中数据的字符串表示形式, StringBuilder对象转换成String对象

和Sting类含义类似的方法:

  public int indexOf(String str)

  public int indexOf(String str, int fromIndex)

  public String substring(int start)

  public String substring(int start, int end)

  public int length()

  char charAt(int index)

public static void main(String[] args) {
StringBuilder sb = new StringBuilder(); for(int i=0; i<26; i++) {
// 数字转换字母方法
char tmp = (char)('a' + i);
sb.append(tmp);
} System.out.println(sb);
System.out.println("##########################"); // StringBuilder对象转换String对象
String str = sb.toString();
System.out.println(str);
System.out.println("##########################"); sb.reverse();
System.out.println(sb);
System.out.println("##########################"); sb.setCharAt(0, '哈');
System.out.println(sb);
System.out.println("##########################");
// 链式调用. 核心就是该方法调用return this, 把自己返回了
sb.insert(1, 'Z').insert(2, 'Y').insert(3, 'B').insert(4, "哈哈");
System.out.println(sb);
System.out.println("##########################"); System.out.println(sb.length());
sb.delete(5, 31).deleteCharAt(0).deleteCharAt(3);
System.out.println(sb); } /*
abcdefghijklmnopqrstuvwxyz
##########################
abcdefghijklmnopqrstuvwxyz
##########################
zyxwvutsrqponmlkjihgfedcba
##########################
哈yxwvutsrqponmlkjihgfedcba
##########################
哈ZYB哈哈yxwvutsrqponmlkjihgfedcba
##########################
31
ZYB
*/

使用陷阱

StringBuilder和StringBuffer类是对原始字符串本身操作, 可以对字符串进行修改而不产生副本拷贝或产生少量的副本, 因此可以在循环中使用

/*************String和StringBuilder频繁修改字符串时效率测试***************/
public static void main(String[] args) {
/****************使用String进行字符串的拼接*******************************/
String str1 = ""; long num1 = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间
long time1 = System.currentTimeMillis(); // 获取系统当前时间 for(int i=0; i<5000; i++) {
str1 = str1 + i;
} long num2 = Runtime.getRuntime().freeMemory();
long time2 = System.currentTimeMillis(); System.out.println("String占用内存: " + (num1 - num2));
System.out.println("String占用时间: " + (time2 - time1)); /**************使用StringBuilder进行字符串的拼接*************************/
StringBuilder sb1 = new StringBuilder(""); long num3 = Runtime.getRuntime().freeMemory();
long time3 = System.currentTimeMillis(); for(int i=0; i<5000; i++) {
sb1.append(i);
} long num4 = Runtime.getRuntime().freeMemory();
long time4 = System.currentTimeMillis(); System.out.println("StringBuilder占用内存: " + (num3 - num4));
System.out.println("StringBuilder占用时间: " + (time4 - time3));
} /*
String占用内存: 77520136
String占用时间: 61
StringBuilder占用内存: 524288
StringBuilder占用时间: 1
*/

Java_Stringbuilder和StringBuffer的更多相关文章

  1. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  2. StringBuffer 的 各种方法

    StringBuffer 其实提供了很多有用的方法, 以前用的多是 append, 其实还有: append(double) delete(int, int) deleteCharAt(int) re ...

  3. js实现StringBuffer

    实现 function StringBuffer() { this.__strings__ = []; }; StringBuffer.prototype.Append = function (str ...

  4. Java--String 和StringBuilder、StringBuffer 的区别?

    1.String是只读字符串,引用的字符串内容是无法改变的. 2.StringBuffer和StringBuilder的字符串对象可以直接进行修改. 3.StringBuilder没有被synchro ...

  5. 初识java之String与StringBuffer(上)

    好久没写博客了,一直在纠结后面的路怎么发展?好了不说废话了!!正题开始!! String与StringBuffer类是我们在开发中最常用的,我们现在一起来分析一下这两个类,首先我们先来谈谈String ...

  6. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  7. String、StringBuffer与StringBuilder之间区别

    关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder >  String ...

  8. String StringBuffer StringBuilder

    package com.test; import java.util.Date; /*** * * // 输出的结果是:// 来一个测试// 来一个测试如果只输出这句就证明了String是不可变的// ...

  9. StringBuffer与StringBuilder的简单理解

    联系:两者都适用于字符串的操作,都可以随便对字符串的内容进行变更操作,都继承至AbstractStringBuilder. 区别:StringBuffer是线程安全的,方法都加了synchronize ...

随机推荐

  1. C/的常用位运算符

    双目运算符 位逻辑运算符 有6种位运算: & 与运算 | 或运算 ^ 异或运算 ! 非运算(求补) >> 右移运算 << 左移运算 与运算(&)双目运算.二个位 ...

  2. 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)

    094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. Visual Studio中Debug与Release以及x86、x64、Any CPU的区别 &&&& VS中Debug与Release、_WIN32与_WIN64的区别

    本以为这些无关紧要的 Debug与Release以及x86.x64.Any CPU 差点搞死人了. 看了以下博文才后怕,难怪我切换了一下模式,程序就pass了.... 转载: 1.https://ww ...

  4. 工信部今日向三大运营商和中国广电发放5G商用牌照

    央视快讯:工信部向中国电信.中国移动.中国联通.中国广电发放5G商用牌照. 2016年5月5日,工信部向中国广播电视网络有限公司颁发了<基础电信业务经营许可证>,批准中国广播电视网络有限公 ...

  5. 唯品会Java开发手册》1.0.2版阅读

    <唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...

  6. 这次一定让你记住 TCP 三次握手、四手挥手!

    TCP协议全称为:Transmission Control Protocol,是一种面向链接.保证数据传输安全.可靠的数据传输协议.为了确保数据的可靠传输,不仅需要对发出的每个字节进行编号确认,还需要 ...

  7. Android 10不能使用uiautomatorviewer定位元素的终极解决方法

    Android app 元素定位除了使用Appium Inspector 外,还可以使用Android SDK 里tools中的uiautomatorviewer 工具.但今天打算使用 uiautom ...

  8. Java-JDK动态代理(AOP)使用及实现原理分析

    Java-JDK动态代理(AOP)使用及实现原理分析 第一章:代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 后面我 ...

  9. day18 Pyhton学习 匿名函数

    匿名函数 别称: lambda表达式 函数,没有名字 def wahaha(n):#wahaha return n**2 print(wahaha.__name__) qqxing = lambda ...

  10. 单源文件目录makefile

    目录结构 由于只是用来编译简单的小型程序,所以目录尽量简洁: . ├── build │   ├── bin │   ├── .dep │   └── obj ├── makefile └── src ...