String类与StringBuffer类
String类与StringBuffer类
一、String类和StringBuffer类的区别
String类是不可变类,新建的对象为不可变对象(String类的内容和长度是固定的),一旦被创建就不能修改它的值(对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去); String类是final类型不可被继承。
StringBuffer类是可变类,新建的对象是一个可变的对象,当需要修改其内容的时候,不需要再创建新的字符串对象,而是直接操作原来的串;不能通过赋值符号对他进行赋值(只能通过构造函数来建立, StringBuffer sb = new StringBuffer(),每个StringBuffer对象都有一定的缓冲区容量,当字符串大小超过容量时,会自动增加容量);字符串连接操作中StringBuffer的效率要比String高。
另外由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。从JDK5开始,为该类补充了一个单个线程使用的等价类,即StringBuilder。与该类相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不支持同步,所以速度更快。
String 作为参数传递是类似于基本数据类型作为参数传递(值传递),StringBuffer 作为参数传递就是引用数据类型传递。
总结一下:
相同点:
(1)String类与StringBuffer类都用来处理字符串。
(2)部分方法在二者中的用法是相同的。
(3)在这两个类中,字符的索引都是从0开始的。
(4)这两个类都是CharSequence的子类。CharSequence接口描述的是一系列字符集。
不同点:
(1)String类是不可变类,因为在底端是用字符数组实现的,而数组长度固定,一旦赋值,就不能在原来的字符串上进行修改可能会浪费空间。StringBuffer类是可变类,能够在原来的数组上进行修改。
(2)String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖该方法。比较StringBuffer字符串内容是否相等,可以使用toString() 方法将StringBuffer的内容转换为String 字符串,再使用equals()方法比较。
(3)虽然两个类都覆盖了toString()方法,但各自的实现方式不同。String类的toString()方法返回当前String对象的引用。而StringBuffer类的toString()方法返回一个以当前StringBuffer的缓冲区的所有字符为内容的新的String对象的引用。
(4)String类对象可以用操作符"+"进行连接,而StringBuffer类的对象通过append()方法添加新的字符串。
二、StringBuffer对象和String对象之间的互转
|
String s = "abc"; StringBuffer sb1 = new StringBuffer("123"); StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer String s1 = sb1.toString(); //StringBuffer转换为String |
三、StringBuffer类
1.StringBuffer的构造方法
public StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
public StringBuffer(int capacity):指定容量大小
public StringBuffer(String str):构造一个字符串缓冲区:里面的容量(字符串内容英文)大小:字符串长度+16初始容量
使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就自动进行扩容:构建新的存储空间更大的字符串,将旧的复制过去;
在进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:尝试将新容量扩为大小变成2倍+2 ,判断一下
容量如果不够,直接扩充到需要的容量大小。
2.StringBuffer获取功能
public int capacity():初始容量
public synchronized int length():返回字符串长度
3.StringBuffer的添加功能
StringBuffer append(xxx x):将指定的内容追加(末尾追加)到字符串缓冲区中,返回StringBuffer本身
public StringBuffer insert(int index,xxx x):在指定位置处,插入一个新的内容,返回StringBuffer本身
void setLength(int newLength)
重新设置字符串缓冲区中字符串的长度,如果newLength小于当前的字符串长度,将截去多余的字符。
public void ensureCapacity (int minimumCapacity)
重新设置字符号串缓冲区的总空间。如果minimumCapacity大于当前的总空间,则新的空间被设置:一种结果是minimumCapacity;另一种结果是{"老空间"乘2加2}。
4.StringBuffer的删除功能
StringBuffer deleteCharAt(int index) :删除指定位置出的字符,返回字符串缓冲区本身
StringBuffer delete(int start, int end) :删除从指定位置开始到指定位置结束,返回值字符串缓冲区本身
public void trimToSize()将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
5.StringBuffer的替换功能
public StringBuffer replace(int start,int end,String str):从指定位置开始到指定位置结束,用给定的str字符串替换指定的字符内容
public void setCharAt(int index, char ch):修改对象中索引值为index位置的字符为新的字符ch
6.StringBuffer的反转功能
public StringBuffer reverse () 反转功能
7.StringBuffer的截取功能
String substring(int start) :从指定位置默认截取到末尾,返回一个新的字符串
String substring(int start,int end):从指定位置开始截取到指定位置结束
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
从当前StringBuffer对象的索引号srcBegin开始,到srcEnd结束的子串,赋值到字符数组dst中,并且从dst的索引号dstBegin开始。
8. StringBuffer查找功能
int indexOf(String str) 返回当前StringBuffer对象中,第一个满足str子串的位置。
int indexOf(String str, int fromIndex)
从当前StringBuffer对象的fromIndex开始查找,返回第一个满足str子串的位置。
int lastIndexOf(String str)
返回当前StringBuffer对象中,最后一个满足str子串的位置。
int lastIndexOf(String str, int fromIndex)
从当前StringBuffer对象的fromIndex开始查找,返回最后一个满足str子串的位置。
四、String类方法(分类参考)
|
方法摘要 |
|
|
char |
charAt(int index) |
|
int |
codePointAt(int index) |
|
int |
codePointBefore(int index) |
|
int |
codePointCount(int beginIndex, int endIndex) |
|
int |
compareTo(String anotherString) |
|
int |
compareToIgnoreCase(String str) |
|
String |
concat(String str) |
|
boolean |
contains(CharSequence s) |
|
boolean |
contentEquals(CharSequence cs) |
|
boolean |
contentEquals(StringBuffer sb) |
|
static String |
copyValueOf(char[] data) |
|
static String |
copyValueOf(char[] data, int offset, int count) |
|
boolean |
endsWith(String suffix) |
|
boolean |
equals(Object anObject) |
|
boolean |
equalsIgnoreCase(String anotherString) |
|
static String |
format(Locale l, String format, Object... args) |
|
static String |
format(String format, Object... args) |
|
byte[] |
getBytes() |
|
byte[] |
getBytes(Charset charset) |
|
void |
getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin) |
|
byte[] |
getBytes(String charsetName) |
|
void |
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) |
|
int |
hashCode() |
|
int |
indexOf(int ch) |
|
int |
indexOf(int ch, int fromIndex) |
|
int |
indexOf(String str) |
|
int |
indexOf(String str, int fromIndex) |
|
String |
intern() |
|
boolean |
isEmpty() |
|
int |
lastIndexOf(int ch) |
|
int |
lastIndexOf(int ch, int fromIndex) |
|
int |
lastIndexOf(String str) |
|
int |
lastIndexOf(String str, int fromIndex) |
|
int |
length() |
|
boolean |
matches(String regex) |
|
int |
offsetByCodePoints(int index, int codePointOffset) |
|
boolean |
regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) |
|
boolean |
regionMatches(int toffset, String other, int ooffset, int len) |
|
String |
replace(char oldChar, char newChar) |
|
String |
replace(CharSequence target, CharSequence replacement) |
|
String |
replaceAll(String regex, String replacement) |
|
String |
replaceFirst(String regex, String replacement) |
|
String[] |
split(String regex) |
|
String[] |
split(String regex, int limit) |
|
boolean |
startsWith(String prefix) |
|
boolean |
startsWith(String prefix, int toffset) |
|
CharSequence |
subSequence(int beginIndex, int endIndex) |
|
String |
substring(int beginIndex) |
|
String |
substring(int beginIndex, int endIndex) |
|
char[] |
toCharArray() |
|
String |
toLowerCase() |
|
String |
toLowerCase(Locale locale) |
|
String |
toString() |
|
String |
toUpperCase() |
|
String |
toUpperCase(Locale locale) |
|
String |
trim() |
|
static String |
valueOf(boolean b) |
|
static String |
valueOf(char c) |
|
static String |
valueOf(char[] data) |
|
static String |
valueOf(char[] data, int offset, int count) |
|
static String |
valueOf(double d) |
|
static String |
valueOf(float f) |
|
static String |
valueOf(int i) |
|
static String |
valueOf(long l) |
|
static String |
valueOf(Object obj) |
String类与StringBuffer类的更多相关文章
- String类和StringBuffer类的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- String类,StringBuffer类转字符数组
String不可变类型和StringBuffer可变类型 String类和StringBuffer类都是字符串表示类,区别在于String对象引用变量是不可变的,而StringBuffer类对象引用变 ...
- Java 常用类String类、StringBuffer类
常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...
- 【学习笔记】String进阶:StringBuffer类(线程安全)和StringBuilder类
一.除了使用String类存储字符串之外,还可以使用StringBuffer类存储字符串.而且它是比String类更高效的存储字符串的一种引用数据类型. 优点: 对字符串进行连接操作时,使用Strin ...
- 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
本文主要介绍String类.StringBuffer类.StringBuilder类的差别 : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...
- (1)StringBuilder类和StringBuffer类 (2)日期相关的类 (3)集合框架 (4)List集合
1.StringBuilder类和StringBuffer类(查手册会用即可)1.1 基本概念 由于String类描述的字符串内容无法更改,若程序中出现大量类似的字符串时需要申请独立的内存空间单独保存 ...
- String类和StringBuffer类的方法
一.String类的方法 public char charAt(int index) 返回字符串index个字符 public int length() 返回字符串长 ...
- 【java】String类和StringBuffer类常用操作
String类是字符串常量,是不可更改的常量.而StringBuffer是字符串变量,它的对象是可以扩充和修改的.StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于Stri ...
- java中String类、StringBuilder类和StringBuffer类详解
本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...
随机推荐
- Codeforces Round #618 (Div. 2)C. Anu Has a Function
Anu has created her own function ff : f(x,y)=(x|y)−y where || denotes the bitwise OR operation. For ...
- mybatis源码探索笔记-1(构建SqlSessionFactory)
前言 mybatis是目前进行java开发 dao层较为流行的框架,其较为轻量级的特性,避免了类似hibernate的重量级封装.同时将sql的查询与与实现分离,实现了sql的解耦.学习成本较hibe ...
- iOS APP语言国际化之应用内切换语言环境
最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...
- FastDFS文件上传和下载流程
文件上传流程 客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息.文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名. 组名:文件上传后所在的 ...
- Linux vim中方向键变成字母的问题
使用Ubuntu Desktop 18.04 时 发现 vim 在编辑模式的时候,方向键变成了字母ABCD. 原因: Ubuntu预装的是vim tiny版本,安装vim full版本即可解决. 1. ...
- Solidity基本数据结构
任何一个智能合约都会在最开头表示使用的编译器版本 如:prama solidity ^0.4.0 数组: //静态数组 大小长度确定 uint[2] fixedArray; //动态数组,可以随意添加 ...
- nginx 的四层代理
需要编译四层模块 [root@python vhast]# cd ~/nginx-1.15.9/ [root@python nginx-1.15.9]# ./configure --prefix=/d ...
- git 从创建到推送到远程,到拉取,实操
https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424 初始化 git init 添加所有文件到暂存区 git add . c ...
- Spring Mvc中Jsp也页面怎么会获取不到Controller中的数据
----------Controller ------- package com.test.mvc; import org.springframework.stereotype.Controller; ...
- Using webpack-dev-server
官方讲解地址:https://webpack.js.org/guides/development/#using-webpack-dev-server The webpack-dev-server pr ...