Java_Stringbuilder和StringBuffer
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的更多相关文章
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- StringBuffer 的 各种方法
StringBuffer 其实提供了很多有用的方法, 以前用的多是 append, 其实还有: append(double) delete(int, int) deleteCharAt(int) re ...
- js实现StringBuffer
实现 function StringBuffer() { this.__strings__ = []; }; StringBuffer.prototype.Append = function (str ...
- Java--String 和StringBuilder、StringBuffer 的区别?
1.String是只读字符串,引用的字符串内容是无法改变的. 2.StringBuffer和StringBuilder的字符串对象可以直接进行修改. 3.StringBuilder没有被synchro ...
- 初识java之String与StringBuffer(上)
好久没写博客了,一直在纠结后面的路怎么发展?好了不说废话了!!正题开始!! String与StringBuffer类是我们在开发中最常用的,我们现在一起来分析一下这两个类,首先我们先来谈谈String ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- String、StringBuffer与StringBuilder之间区别
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder > String ...
- String StringBuffer StringBuilder
package com.test; import java.util.Date; /*** * * // 输出的结果是:// 来一个测试// 来一个测试如果只输出这句就证明了String是不可变的// ...
- StringBuffer与StringBuilder的简单理解
联系:两者都适用于字符串的操作,都可以随便对字符串的内容进行变更操作,都继承至AbstractStringBuilder. 区别:StringBuffer是线程安全的,方法都加了synchronize ...
随机推荐
- 记录一下第一次写 50行 SQL代码
这 是一个电商项目,做的是报表的展示,我还以为要请求几次,结果,用一个SQL全部查完了 下面是目标效果图 这是我的SQL代码 SELECT product.NAME, product.price, p ...
- Matlab中image、imagesc和imshow函数用法解析
来源:https://blog.csdn.net/zhuiyuanzhongjia/article/details/79621813 1.显示RGB图像 相同点:这三个函数都是把m*n*3的矩阵中的数 ...
- Linux就该这么学28期——Day02 2.1-2.3
本文记录必须掌握的Linux命令,部分内容引用自https://www.linuxprobe.com/basic-learning-02.html 工作中可使用https://www.linuxcoo ...
- 计数,dic的创建方式,求九九乘法表
s1='char,python,nihao,ni,ni,python's=s1.split(',')print(s1)s2=list()for i in s: if i not in s2: s2.a ...
- docker 搭建LNMP网站平台
准备好镜像 1.创建网络 docker network create lnmp 测试环境需删除全部之前起的容器 docker rm -f $(docker ps -a |awk '{print $1} ...
- Dockerfile常用指令及使用
Dockerfile常用指令及使用 1. dockerfile介绍 2. Dockerfile常用指令 指令 描述 FROM 构建新镜像是基于哪个镜像 MAINTAINER 进行维护者姓名或邮箱地址 ...
- Cypress系列(65)- 测试运行失败自动重试
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 重试的介绍 学习前的三问 什么是重试测试 ...
- C语言实现和 *.ini文件。
本文之前由于技术不到位,写的比较挫,最近花了大半天时间写了一个高级点的版本. 这里是我写的代码,已经上传到github了.跳转到github 主要是使用了链表保存ini文件的内容,在程序运行最初会初始 ...
- Mysql架构与内部模块-第三章
前言 接上文,本篇文章专门简述Mysql存储引擎,内容繁多,如果你只需知道每种存储引擎的适用场景,可以直接查看本文最后列出的适用场景部分. 正文: Mysql存储引擎作为本系列文章中相对重要的一环,也 ...
- centos8上redis5在生产环境的配置
一,创建redis的数据和日志目录: [root@yjweb data]# mkdir /data/redis6379 [root@yjweb data]# mkdir /data/redis6379 ...