详解 字符串—— String、StringBuffer 与 StringBuilder
本来这篇博文的内容,本人打算在之后的代码中一点一点通过实例讲解的,但是,本人发现,其实这里的知识点还是蛮重要的。
并且,字符串类型,在任何的程序语言中都是被认真对待的,所以,今天专门写一篇博文来介绍一下这个知识点!
首先,什么是字符串呢?
相信学习过C语言的同学能够知道:
字符串是由多个字符组成的一串数据(字符序列)
字符串可以看成是字符数组
没错,再Java中,也是这样的,但是,相比于C语言,Java这种高级语言,对于字符串是有封装好的类的,那就是我们这篇博文的主题——String类。
String类:
在本人之前的博文中,提到过String类,但是只讲了这个类的变量,是字符串类型,并且和所有类型的变量相加,都会将其强转为字符串类型。
那么,现在,本人来讲解String类的其他的 性质 和 常用方法:
现在,本人来展示下String类的常用API:
- String类的构造方法:
常见构造方法:
- public String():
空构造- public String(byte[] bytes):
把字节数组转成字符串- public String(byte[] bytes,int index,int length):
把字节数组的一部分转成字符串(index:表示的是从第几个索引开始, length表示的是长度)- public String(char[] value):
把字符数组转成字符串- public String(char[] value,int index,int count):
把字符数组的一部分转成字符串- public String(String original):
把字符串常量值转成字符串
- String类的判断功能:
- public boolean equals(Object obj):
比较字符串的内容是否相同,区分大小写- public boolean equalsIgnoreCase(String str):
比较字符串的内容是否相同,忽略大小写- public boolean contains(String str):
判断字符串中是否包含传递进来的字符串- public boolean startsWith(String str):
判断字符串是否以传递进来的字符串开头- public boolean endsWith(String str):
判断字符串是否以传递进来的字符串结尾- public boolean isEmpty():
- String类的获取功能:
- public int length():
获取字符串的长度。- public char charAt(int index):
获取指定索引位置的字符- public int indexOf(int ch):
返回指定字符在此字符串中第一次出现处的索引。- public int indexOf(String str):
返回指定字符串在此字符串中第一次出现处的索引。- public int indexOf(int ch,int fromIndex):
返回指定字符在此字符串中从指定位置后第一次出现处的索引。- public int indexOf(String str,int fromIndex):
返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
可以顺带提一下lastIndexOf系列- public String substring(int start):
从指定位置开始截取字符串,默认到末尾。- public String substring(int start,int end):
从指定位置开始到指定位置结束截取字符串。
- String类的转换功能:
- public byte[] getBytes():
把字符串转换为字节数组。- public char[] toCharArray():
把字符串转换为字符数组。- public static String valueOf(char[] chs):
把字符数组转成字符串。- public static String valueOf(int i):
把int类型的数据转成字符串。
注意:String类的valueOf方法可以把任意类型的数据转成字符串。- public String toLowerCase():
把字符串转成小写。- public String toUpperCase():
把字符串转成大写。- public String concat(String str):
把字符串拼接
- String类的其他功能:
1.String的替换功能:
- public String replace(char old, char new)
将指定字符进行互换- public String replace(String old, String new)
将指定字符串进行互换2.String的去除字符串两空格:
- public String trim() 去除两端空格
3.String的按字典顺序比较两个字符串
- public int compareTo(String str)
会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果
如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果
如果连个字符串一摸一样 返回的就是0- public int compareToIgnoreCase(String str)
跟上面一样 只是忽略大小写的比较
我们先来展示一段代码:
package com.mec.study;
public class AboutString {
public static void main(String[] args) {
//String的第一种生成方法:
String str1 = new String("第一种生成方法");
//String的第二种生成方法:
String str2 = "第二种生成方法";
//String的第三种生成方法:
String str3 = String.valueOf(123456);
//展示字符串长度:
System.out.println(str1.length());
//取字符串字串:
System.out.println(str2.substring(3, 5));
//其他类型变量的强转,字符串的拼接
System.out.println(str3 + 321);
String code = null;
for (int i = 0; i < 3; i++) {
code = String.valueOf(1000 + i).substring(1);
System.out.println(code);
}
}
}

上面的代码里,蕴含着非常丰富的技巧,
那么现在,本人对上面的最后一个循环中的操作做一下说明:
有的同学可能会想,为什么不将上图中的第22行代码写成如下形式呢:
code = String.valueOf(i)
给i加1000,又将最高位“去掉”,不如不对其进行这两步操作。
这样想的同学,很遗憾,你还是在质疑本人的能力,若是不对其进行那两步操作,那么,就不会有“每个数自动补足三位(自动补零)”现象。
不信,我们来试试:

可以清晰地看到,没有了自动补零的现象!
这样的操作,其实在我们之后的工作中很常用的,希望大家能够对其重视!
下面要讲到String类的字符串的特点了:
特点:
字符串一旦被创建就不能改变
因为字符串的值是在方法区的常量池中划分空间、分配地址值的
我们还是通过一段代码来验证这个结论:
package com.mec.study;
public class AboutString {
public static void main(String[] args) {
String str1 = "123abc123defg123wxyz";
System.out.println("原str1: " + str1);
System.out.println(str1.replace("123", "ABCD"));
System.out.println("现str1: " + str1);
}
}
下面我们来看看运行结果:
可以看到,我们修改的部分在原Sting类的字符串中并没有被体现,即str并没有被改变!
事实上,str.replace()的结果是一个“新字符串”,是String新的对象!
我们不断地去new一个新的对象,相当于不断地去malloc,这样下来,是很浪费时间的!
那么,该如何解决这两点问题呢?
下面本人隆重介绍两个类——StringBuffer类 和 StringBuilder类:
StringBuffer类 和 StringBuilder类:
StringBuffer类 和 StringBuilder类这两个类的API甚至完全一样,但是,为什么要设置两个类呢?
答曰:
StringBuffer类
- 线程安全性高,但是效率低;
StringBuilder类
- 线程安全性低,但是效率高。
那么,本人现在介绍下这两个类:
(由于这两个类的API几乎完全相同,所以,本人在这里通过展示StringBuffer类的API来代表两个类都有的API 的展示)
StringBuffer的构造方法:
- public StringBuffer():
无参构造方法- public StringBuffer(int capacity):
指定容量的字符串缓冲区对象- public StringBuffer(String str):
指定字符串内容的字符串缓冲区对象
StringBuffer的方法:
- public int capacity():
返回当前容量。 理论值- public int length():
返回长度(字符数)。 实际值
StringBuffer的添加功能:
- public StringBuffer append(String str):
可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身- public StringBuffer insert(int offset,String str):
在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
StringBuffer的替换和反转功能:
- public StringBuffer replace(int start,int end,String str):
从start开始到end用str替换- public StringBuffer reverse():
StringBuffer的截取功能:
- public String substring(int start):
从指定位置截取到末尾- public String substring(int start,int end):
截取从指定位置开始到结束位置,包括开始位置,不包括结束位置注意事项:
返回值类型不再是StringBuffer本身
StringBuffer和String的相互转换:
String --> StringBuffer:
- 通过构造方法
- 通过append()方法
B:StringBuffer --> String:
- 使用substring方法
- 通过构造方法
- 通过toString()方法
而至于StringBuilder这个类,所有的API都和StringBuffer类的大致相同,本人在这里就不啰嗦了。
现在,本人来展示下,这两个类的字符串的基本使用方法:
package com.mec.study;
public class AboutStringBuffer {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("abc");
str.append(123);
System.out.println(str);
}
}
最后,本人来介绍一个非常重要的方法——得到计算机当前机器时间的方法( currentTimeMillis() ):
那么,本人现在来验证下StringBuffer 究竟比 String 的速度快了多少 :
package com.mec.study;
public class AboutStringBuffer {
public static void main(String[] args) {
//String 类字符串的拼凑耗时测试
String str = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str += 1;
}
long endTime = System.currentTimeMillis();
System.out.println("String拼凑字符串耗时: " + (endTime - startTime) + "毫秒");
//StringBuffer 类字符串的拼凑耗时测试
StringBuffer strBuffer = new StringBuffer();
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
strBuffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("String拼凑字符串耗时: " + (endTime - startTime) + "毫秒");
}
}

在以上的测试中,我们能够直观地了解到:
若是我们处理的字符串只是简单常量,或者字符串在整个程序运行过程中变化不大,我们就推荐用String类字符串;
而若是我们的程序要求字符串不断变化,那么StringBuffer类字符串 和 StringBuilder类字符串 好些。
详解 字符串—— String、StringBuffer 与 StringBuilder的更多相关文章
- redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
- String,StringBuffer和StringBuilder源码解析[基于JDK6]
最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...
- String,StringBuffer与StringBuilder
1. String,StringBuffer与StringBuilder的区别 String:存储在常量池中:是不可变的字符序列,任何对String值的改变都会引发新的String对象的生成,因此执行 ...
- BAT批处理中的字符串处理详解(字符串截取)
BAT批处理中的字符串处理详解(字符串截取) BAT批处理中的字符串处理详解(字符串截取 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理 ...
- Java String, StringBuffer和StringBuilder实例
1- 分层继承2- 可变和不可变的概念3- String3.1- 字符串是一个非常特殊的类3.2- String 字面值 vs. String对象3.3- String的方法3.3.1- length ...
- 【Redis】redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
- String, StringBuffer and StringBuilder
一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class Stri ...
- String,StringBuffer和StringBuilder
String,StringBuffer和StringBuilder分别应该在什么情况下使用? String 是Java的字符串类,其实质上也是用Char类型存储的,但是除了hash属性,其他的属性都声 ...
- String,StringBuffer和StringBuilder的异同
String,StringBuffer和StringBuilder的异同 ...
随机推荐
- linux下vmware could not open /dev/vmmon/no/such/file/or/directory问题
执行 sudo vmware-modconfig --console --install-all 详解这里
- 避免自己写的 url 被diss!建议看看这篇RestFul API简明教程!
大家好我是 Guide 哥!这是我的第 210 篇优质原创!这篇文章主要分享了后端程序员必备的 RestFul API 相关的知识. RestFul API 是每个程序员都应该了解并掌握的基本知识,我 ...
- ArrayList的传值问题
ArrayList是一个对象类型,记录一下遇到的传值问题 假设两个ArrayList类型的值a和b,a有值,b无值,想把a的值全部复制给b. 如果使用 b = a; 进行赋值,会将a的地址赋值给b,当 ...
- 发布内容需要的Markdown语法
发布内容需要的Markdown语法 目录 发布内容需要的Markdown语法 [toc] 1.概述 1.1设计理念 1.2内联HTML语法 1.3特殊字符自动转义 2.行内语法讲解 2.1注释的表述 ...
- 使用Keras构建深度图像搜索引擎
动机 想象一下,如果有数十万到数百万张图像的数据集,却没有描述每张图像内容的元数据.我们如何建立一个系统,能够找到这些图像的子集来更好地回答用户的搜索查询? 我们基本上需要的是一个搜索引擎,它能够根据 ...
- python—time模块
timetime模块提供各种时间相关的功能,与时间相关的模块有:time,datetime,calendar等. 时间有三种表示方式,一种是时间戳.一种是格式化时间.一种是时间元组.时间戳和格式化时间 ...
- [HDU2072]单词数<字符串>
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什 ...
- [WPF]是时候将WPF控件库从.Net Framework升级到.NET Core 3.1
1. 升级到Core的好处 去年中我曾考虑将我的控件库项目Kino.Toolkit.Wpf升级到.NET Core,不过很快放弃了,因为当时.NET Core是预览版,编译WPF还需要使用最新的Vis ...
- HDU6024:Building Shops(简单DP)
Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- Java数组的声明与创建
今天在刷Java题的时候,写惯了C++发现忘记了Java数组的操作,遂把以前写的文章发出来温习一下. 首先,数组有几种创建方式? Java程序中的数组必须先进行初始化才可以使用,所谓初始化,就是为数组 ...