JAVA基础类库之String类,StringBuffer类和StringBuilder类

目录
  • 引言
  • String类
    • String类构造方法
    • String常用方法:
      • 简单介绍的方法
      • 详细介绍的方法
  • StringBuffer/StringBuilder常用方法
    • StringBuffer类构造方法
    • StringBuffer常用方法:
  • 总结

引言

字符串就是一连串的字符序列,Java提供了String、StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象。

  • String类是不可变类的;
  • StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append、insert、reverse、setCharAt、setLength等方法可以改变这个字符串对象的字符序列;一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString方法将其转换为一个String对象,使其不可变;
  • JDK1.5又新增了一个StringBuilder类,它也代表了字符串对象,StringBuffer和StringBuilder基本相同,构造器和方法也一样,不同点是:StringBuffer是线程安全的,StringBuilder是线程不安全的,但是性能更高;所以通常情况下,创建一个内容可变的字符串,应优先选择StringBuilder类;

下面分别介绍一下这三种字符串类的一些常用方法(StringBuffer和StringBuilder方法基本相同,一起介绍了)

String类

这里还是简单说一下为什么String类不能修改吧;

简单来说,因为String类的使用频率太大了,为了进一步提高效率,String类所声明的字符串都会保存到常量池中,这样用哪个字符串直接取出来就可以了;

其实就记住不管怎样String类字符串就存放在常量池中;

举个例子:

String s1 = new String("Hello");
String s2 = "World" + s1;

能看出来创建了几个对象吗?

答案是三个;一个Hello,一个World,一个HelloWorld;先是Hello存放到了常量池中,然后World又进去,最后它俩组合形成新的字符串HelloWorld又放了进去;

如果理解不了,那么就记住一点:String类字符串一旦创建不可变。

String类构造方法

  • String s = "abc";
  • String s = new String("abc");
  • String s = new String(byte数组);
  • String s = new String(byte数组, 起始下标, 长度);
  • String s = new String(char数组);
  • String s = new String(char数组, 起始下标, 长度);

记住这几种就可以了;

String常用方法:

简单介绍的方法

length

作用:返回字符串长度

比较简单,就不详细介绍了,出现频率非常高

注意:数组里面的length是属性,这里的length()是方法;

isEmpty

作用:判断字符串是否为空字符串;

空字符串返回true,否则返回false

注意:判断的是空字符串""(即length()为0),而不是null,如果是null会造成空指针异常;

详细介绍的方法

contians

作用:判断前面的字符串是否包含后面的字符串

格式:public boolean contains​(CharSequence s)

参数 :s - 搜索的顺序 (CharSequence是一个接口,String类已实现,所以可以传入一个字符串)

结果 :如果此字符串包含 s , 则为 true,否则为 false

例如:

System.out.println("HelloWorld".contains("World")); // 输出true
System.out.println("HelloWorld".contains("Java")); // 输出false

endsWith

作用:判断当前字符串是否以某个字符串结尾

格式:public boolean endsWith​(String suffix)

参数:suffix - 后缀

结果:如果当前字符串以suffix结尾,为true,否则为false

例如:

System.out.println("Java.txt".endsWith("Java")); // 输出false
System.out.println("Java.txt".endsWith(".txt")); // 输出true

startsWith

作用:判断当前字符串是否以某个字符串开始

格式:public boolean startsWith​(String suffix)

参数:suffix - 前缀

结果:如果当前字符串以suffix开始,为true,否则为false

例如:

System.out.println("Java.txt".startsWith("Java")); // 输出true
System.out.println("Java.txt".startsWith(".txt")); // 输出false

equalsIgnoreCase

作用:判断两个字符串是否相等,判断时忽略大小写

格式:public boolean equalsIgnoreCase​(String anotherString)

参数:anotherString - String

结果:如果两个字符串忽略大小写的情况下相等,返回true,否则为false

例如:

System.out.println("ABc".equalsIgnoreCase("abC")); // true
System.out.println("aABc".equalsIgnoreCase("abC")); // false

其实这个功能很常见,就比如我们输入验证码时有些情况就自动忽略了你输入字母的大小写;

getBytes

作用:将字符串对象转换为字节数组(字符对应的Ascii码数组)

格式:public byte[] getBytes​(String charsetName)

参数:charsetName - String

结果:返回一个byte[]数组,对应每个字符的Ascii码

例如:

byte[] b = "abcde".getBytes();
for (var i : b) System.out.print(i + " "); // 输出:97 98 99 100 101

indexOf

作用:返回某个字符串在当前字符串中第一次出现处的下标

格式:public int indexOf​(String str)

参数:str - 要搜索的子字符串

结果:返回指定子字符串的首次出现的索引,如果没有这种情况返回 -1

例如:

System.out.println("HelloWorld".indexOf("llo")); // 输出:2
System.out.println("HelloWorld".indexOf("ol")); // 输出:-1

lastIndexOf

作用:返回某个字符串在当前字符串中最后一次出现处的下标

格式:public int lastIndexOf(String str)

参数:str - 要搜索的子字符串

结果:返回指定子字符串的最后一次出现的索引,如果没有这种情况返回 -1

例如:

System.out.println("HelloWorld".lastIndexOf("l")); // 输出:8
System.out.println("HelloWorld".lastIndexOf("ol")); // 输出:-1

replace

作用:将某字符串与目标序列匹配的字符串替换为指定的字符串,替换从字符串开始到结束

格式:public String replace​(CharSequence target, CharSequence replacement)

参数:target - 要替换子串 replacement -指定的子符串

结果:生成的替换后的字符串

例如:

String s = "Hello World World".replace("World", "Java");
System.out.println(s);
// 输出:Hello Java Java

split

作用:将字符串拆分

格式:public String[] split​(String regex)

参数:regex - 分隔正则表达式 (同样可以通过字符串进行拆分,这里先用字符串作为案例)

结果:拆分后字符串存入的数组

例如:

String[] s = "year:2021-month:09-day:15-time:23:30".split("-"); // 以字符串"-"进行拆分;
for (var i : s) System.out.println(i);
/* 输出:
year:2021
month:09
day:15
time:23:30
*/

substring(一个参数)

作用:返回一个字符串,该字符串是此字符串的子串; 子字符串以指定索引beginIndex的字符开始,并扩展到此字符串的末尾;

格式:public String substring​(int beginIndex)

参数:beginIndex - 包含起始索引

结果:截取后的子字符串

例如:

String s = "Today is a good day!";
System.out.println(s.substring(9));
// 输出:a good day!

substring(两个参数)

作用:返回一个字符串,该字符串是此字符串的子串;子串从指定的beginIndex开始,并扩展到索引号为endIndex - 1的字符 ;

格式:public String substring​(int beginIndex, int endIndex)

参数:beginIndex - 开始索引(包括) endIndex - 结束索引(不包括) // 左闭右开

结果:截取后的子字符串

例如:

String s = "Today is a good day!";
System.out.println(s.substring(9, 15));
// 输出:a good

toCharArray

作用:将字符串转化为一个字符串数组

格式:public char[] toCharArray​()

参数:无参数

结果:返回对应字符串的数组

例如:

char[] s = "Today is a good day!".toCharArray();
for (var i : s) System.out.print(i + " ");
// 输出:T o d a y   i s   a   g o o d   d a y !

toLowerCase

作用:将此String所有字符转换为小写,使用默认语言环境的规则

格式:public String toLowerCase​()

参数:无参数

结果:返回转为小写的字符串

例如:

System.out.println("HELLOWORLD".toLowerCase());
// 输出:helloworld

toUpperCase

作用:将此String所有字符转换为大写,使用默认语言环境的规则

格式:public String toUpperCase​()

参数:无参数

结果:返回转为大写的字符串

例如:

System.out.println("helloworld".toUpperCase());
// 输出:HELLOWORLD

trim

作用:去除字符串前后空格

格式:public String trim​()

参数:无

结果:返回去除空格后的字符串

例如:

System.out.println("    hello      world    ".trim());
// 输出:hello      world

有时候你要使用搜索引擎搜索时,如果前面多打了几个空格,并不影响结果;或者有的账号登录会忽略开始和结束的空格,都会用到这个方法;

valueOf

作用:将任何非字符串转化为字符串

格式:public static String valueOf​(一些变量)

参数:参数可以是int,double等基本数据类型,也可以是Object等引用数据类型

结果:返回转化后的字符串

例如:

System.out.println(String.valueOf(1234)); // 1234
System.out.println(String.valueOf(3.14159)); // 3.14159
System.out.println(String.valueOf(true)); // true
char[] s = new char[] {'a', 'b', 'c'};
System.out.println(String.valueOf(s)); // abc
System.out.println(String.valueOf(new Object())); // java.lang.Object@776ec8df

这里需要说一下,valueOf使用是非常广泛的;我们可以看到最后一个案例,输出一个对象:new Object(),结果是它的地址以及位置信息等,是不是和 toString() 方法特别像?其实当传入vauleOf一个对象时,vauleOf对应的源码里就调用了toString()方法,所以才会输出一样的结果;所以说,如果我们重写了toString方法,就会调用我们重写的toString,输出对应信息;

还有,当我们用 System.out.println()输出的时候,如果传入的是对象,系统会默认调用toString,这是什么原因?调用println源码可以发现,每一个重载版本的println都会调用valueOf,所以如果println传入一个对象的话,就会调用valueOf方法,因为valueOf方法中有toString方法,所以就默认调用了toString方法,将对象转化为字符串输出;

刚才说了一点:每一个重载版本的println都会调用valueOf,当然也包括了基本数据类型,就以boolean例,看看它的源码;

可以看到boolean的println会调用 valueOf 的,其实其他基本数据类型也差不多,传入println后都会调用 valueOf ,所以可以得出结论:println输出的总是一个字符串;

StringBuffer/StringBuilder常用方法

一些总结:

  • StringBuffer/StringBuilder可以看做可变长度字符串。
  • StringBuffer/StringBuilder初始化容量16.
  • StringBuffer是线程安全的。StringBuilder是非线程安全的。
  • 频繁进行字符串拼接不建议使用“+”,对运行效率有影响;

下面就以StringBuffer为例,StringBuilder也是一样;

StringBuffer类构造方法

  • StringBuffer​()
  • StringBuffer​(int capacity指定初始化容量)
  • StringBuffer​(CharSequence seq)
  • StringBuffer​(String str)

StringBuffer常用方法:

append

作用:将传入的数据追加在字符串后面

格式:public StringBuffer append(可以是int,char,String等)

参数:int,char,String等

结果:组合后形成的新的字符串

capacity

作用:返回当前容量

格式:public int capacity​()

参数:无

结果:当前字符串的容量(和长度length()不同)

delete

作用:删除字符串从 start 起始索引到 end-1 终止索引间的字符串;

格式:public StringBuffer delete​(int start,int end)

参数:start - 开始索引 end - 结束索引(左闭右开)

结果:删除后的字符串

insert

作用:在字符串序列中插入对应数据

格式:public StringBuffer insert​(一些参数)

参数:一般第一个参数是插入位置int ,第二个是插入内容:可以是char[],String,还有基本数据类型等;

结果:插入后的字符串

replace

作用:替换指定位置的指定字符串

格式:public StringBuffer replace​(int start, int end,String str)

参数:start - 开始索引 end - 结束索引 (左闭右开)str - 将替换的字符串。

结果:替换后的新的字符串

总结

这里只是简单介绍了一下String类 、StringBuffer类和StringBuilder类,对它们的常用方法也是有了一个简单的介绍,但是这也是很少的一部分,只是混个眼熟;所以实际开发过程中要会用JDK API帮助文档,因为Java所有的方法和类你不可能全部都记住或者见过,所以一定要会用工具;

对于一些方法很简单,可能会觉得没有必要,但是既然有这个方法,那么肯定是有存在意义的;在实际开发中,这些方法不仅能提高你代码的可读性,还会减少你的代码量,所以都要有了解;

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java中关于String StringBuffer StringBuilder特性深度解析

    1.String String类:字符串是常量,使用一对""引起来表示.他们的值在创建之后不能修改. 1.String声明为final的,不可被继承 2.String实现了Serializable接口,表示字符串时支持序列化的. 实现了Comparable接口:表示String可以比较大小 3.String内部定义了final char[] value用于存储字符串数据 4.String:代表不可变的字符序列.简称:不可变性 体现: 1.当对字符串重新赋值时,需要重写指定内存区域赋值,

  • 解决StringBuffer和StringBuilder的扩容问题

    StringBuffer和StringBuilder的扩容 以前对StringBuffer/StringBuilder只是初浅的了解,只是知道StringBuffer是线程安全的,Stringbuilder是非线程安全的.并且字符串长度是可变的. 具体是怎么变没有去深入了解,今天看了一下源码,恍然大悟 来看一下源码,在没有传参的情况下默认初始容量是16. 有参数的情况下,初始容量是16+字符串的长度,并且是用append()方法追加的字符. 到这里就有疑问那,那这个字符串的长度是多少呢.是它本身

  • Spring Boot接收单个String入参的解决方法

    前言 接受参数是我们在日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于Spring Boot接收单个String入参之解决方案的相关内容,下面话不多说了,来一起看看详细的介绍吧 场景: 在做接口时,有的时候,接口入参只需要一个参数,如果将一个参数封装成一个对象很麻烦,故有了以下方式: 思路: spring自带的参数解析器貌似是不具备这个能力的,所有自定义 方式方法: 1.定义一个注解 @Target(ElementType.PARAMETER) @Retention(Retent

  • String StringBuilder StringBuffer区别以及源码分析

    目录 1. String/StringBuilder/StringBuffer 区别 1.1 String 1.2 StringBuilder 1.3 StringBuffer 2. String/StringBuilder/StringBuffer 源码 2.1 String 源码分析 2.1.1 String 类 2.1.2 String 类的属性 2.1.3 String 类的构造函数 2.1.4 String 类的常用方法 2.2 StringBuilder 源码分析 2.2.1 Str

  • 两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    目录 前言 1. 定义字符串 2.字符串比较相等 equals 使用注意事项 3. 字符串常量池( 多图解析 ) 第一个列子解析: 第二个列子解析: 第三个列子解析: 第四个列子解析: 第五个列子解析: 第六个列子解析: 第七个列子解析: 第八个列子解析: 面试题:请解释String类中两种对象实例化的区别 4. 理解字符串不可变 5.字符, 字节与字符串 字节与字符串 小结 6. 字符串常见操作 6.1 字符串比较 6.2 字符串查找 6.3 字符串替换 6.4 字符串拆分 6.5 字符串截取

  • JAVA基础类库之String类,StringBuffer类和StringBuilder类

    目录 引言 String类 String类构造方法 String常用方法: 简单介绍的方法 详细介绍的方法 StringBuffer/StringBuilder常用方法 StringBuffer类构造方法 StringBuffer常用方法: 总结 引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: StringBuffer对象则代表一个字符序列可变

  • Java基础类库之StringBuffer类用法详解

    StringBuffer类 String类是在所有开发项目开发之中一定会使用的一个功能类,并且这个类拥有如下功能 每个字符串的常量都属于一个String类匿名对象,并且不能修改: String类有两个常量池:静态常量池.运行常量池: String类对象实例化建议直接使用赋值的形式完成,这样可以直接将对象保存在对象池中方便下次重用: 虽然String类很好用,但是我们发现它也有弊端,就是内容不允许频繁修改,所以为了解决问题,我们提供了StringBuffer类 StringBuffer 并不像St

  • 深入理解JAVA基础类库中对象Object类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类. 例如: public class Dog{ ...... } 等价于: public class Dog extends Object { ...... } Object常用方法 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在

  • Java基础入门语法--String类

    今天带大家了解一下java的基础法语---String 字符串是我们以后工作中非常常用到的类型. 使用起来都非常简单方便, 我们一定要使用熟练. 那么C语言中是否有字符串类型? 答案是 " 没有 " !! char *p = " hello"; 那么p 的类型是一个字符串类型么? 不是,p是一个指针!! 而在 Java当中 是有 字符串类型的--String 一.定义方式 创建字符串的方式有很多种,常见的构造 String 的方式如以下: 方式一:直接赋值法 Str

  • Java基础教程之String深度分析

    前言 String可以说是Java中使用最多最频繁.最特殊的类,因为同时也是字面常量,而字面常量包括基本类型.String类型.空类型. 一. String的使用 1. String的不可变性 /** * The {@code String} class represents character strings. All * string literals in Java programs, such as {@code "abc"}, are * implemented as ins

  • 辨析Java中的String与StringBuffer及StringBuilder字符串类

    1 String String:字符串常量,字符串长度不可变. 2 StringBuffer StringBuffer:字符串变量(Synchronized,即线程安全).如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法. Java.lang.StringBuffer线程安全的可变字符序列.在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容.可将

  • 讲解Java中的基础类库和语言包的使用

    Java基础类库 Java 的类库是 Java 语言提供的已经实现的标准类的集合,是 Java 编程的 API(Application Program Interface),它可以帮助开发者方便.快捷地开发 Java 程序.这些类根据实现的功能不同,可以划分为不同的集合,每个集合组成一个包,称为类库.Java 类库中大部分都是由Sun 公司提供的,这些类库称为基础类库. Java 语言中提供了大量的类库共程序开发者来使用,了解类库的结构可以帮助开发者节省大量的编程时间,而且能够使编写的程序更简单

  • Java中StringBuilder类的介绍与常用方法

    目录 一.StringBuilder类介绍 二.StringBuilder类的体系图 三.StringBuilder类的常用方法 四.String类.StringBuffer类和StringBuilder类比较 补充:String和StringBuilder之间的相互转换 总结 一.StringBuilder类介绍 StringBuilder也是lang包中的类,即java.lang.StringBuilder类. 该类也是用来保存字符串的,它也是一个可变的字符序列. StringBuilder

  • Java 基础全面讲解StringBuffer类的使用

    目录 StringBuffer类 常用方法 字符串连接 指定位置添加内容 字符串反转 替换指定范围的内容 字符串截取 删除指定范围的字符串 查找指定的内容是否存在 String与StringBuffer的区别 Java 常用类 StringBuffer类 StringBuffer类的字符串可以被改变 常用方法 方法 类型 作用 public StringBuffer() 构造 StringBuffer的构造方法 public StringBuffer append(char c) 方法 追加 p

  • 详细分析Java中String、StringBuffer、StringBuilder类的性能

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看API会发现,String.StringBuffer.StringBuilder都实现了 CharSequence接口,虽然它们都与字符串相关,但是其处理机制不同. String:是不可改变的量,也就是创建后就不能在修改了. StringBuffer:是一个可变字符串序列,它与String一样,在内存中保存的都是一个有序的字符串

随机推荐