常用方法

方法备注
public int length()用来获取一个String对象的字符序列的长度。
public boolean equals/fontString对象调用equals(String s)方法比较当前String对象的字符序列是否与参数s指定的String对象的字符序列相同。
public boolean equalsIgnoreCase/font作用同上,但比较时忽略大小写。
public boolean startsWith/font判断当前String对象的字符序列前缀是否为参数指定的String对象s的字符序列。
public boolean endsWith/font判断当前String对象的字符序列后缀是否为参数指定的String对象s的字符序列public boolean endsWith(String s)判断。
public int compareTo/font按字典顺序比较两个字符串。 比较基于字符串中每个字符的Unicode值。 此String对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。 如果此String对象按字典顺序排在参数字符串之前,则结果为负整数。 如果此String对象按字典顺序跟随参数字符串,则结果为正整数。 如果字符串相等,结果为零。
public int compareToIgnoreCase/font作用同上,但比较时忽略大小写。
public boolean [font color="#FF0000"]contains/font判断当前String对象的字符序列是否包含参数s的字符序列。
public int [font color="#FF0000"]indexOf/font返回指定字符第一次出现的字符串中的索引。如果没有检索到,该方法返回的值为-1。
public int [font color="#FF0000"]indexOf/font返回指定字符第一次出现的此字符串中的索引,从指定索引处开始搜索。如果没有检索到,该方法返回的值为-1。
public int [font color="#FF0000"]lastindexOf/font返回指定字符最后一次出现的字符串中的索引。如果没有检索到,该方法返回的值为-1。
public int [font color="#FF0000"]lastindexOf/font返回指定字符最后一次出现的字符串中的索引,从指定的索引开始向后搜索。如果没有检索到,该方法返回的值为-1。
public String [font color="#FF0000"]substring/font返回一个字符串,该字符串是此字符串的子字符串。 子字符串以指定索引处的字符开头,并延伸到此字符串的末尾。
public String [font color="#FF0000"]trim()返回一个字符串,其值为此字符串,删除了所有前导和尾随空格。

推荐阅读:菜鸟教程Class String

实例化

一.String变量有2种常用的定义方式

直接赋值实例化
String str = "Hello World"

直接赋值字面量的方式更省内存空间,因为JVM首先会去字符串池中查找是否存在"Hello World"这个对象,如果不存在,则在字符串池中创建"Hello World"这个对象,然后将池中"Hello World"这个对象的引用地址返回给"Hello World"对象的引用str,这样str会指向池中"Hello World"这个字符串对象;如果存在,则不创建任何对象,直接将池中"Hello World"这个对象的地址返回,赋给引用str。所以如果多个直接赋值字面量的引用拥有相同的字面量,那么这些引用其实是指向同一个对象,也就是指向相同的一块内存空间。

String  str0 = "Hello World";
String  str1 = "Hello World";
String  str2 = "Hello World";

构造方法实例化(这里以调用public String(String original)为例 )

String str = new String("Hello World")

这个就很有趣了,

先说说我一开始对构造方法实例化一个字符串的理解,一开始我认为这种方式会比我们的的一种用字面量赋值的方式要快,毕竟这里是直接new一个实例出来,没有第一种方式的那样会先在常量池里面寻找已有字符串的步骤。

但后来通过对String类的深入发掘,我才发现我大错特错了。通过查询资料和反编译,发现用new关键字新建一个字符串对象时,居然会新建1个或者2个String的对象。why 一个new 会有2个对象?真是离谱他妈给离谱开门。

image.png

原文地址JDK1.8字符串常量池里存的是String对象还是引用?

查了好多blog,他们写的基本都是这个现象,却没有解释为什么会有这个现象,为什么new一个String对象还会和直接字面量赋值一样,寻找一遍已有的字符串对象。

这个现象纠结了好久,才从最开始,最直接,最容易被忽略的地方找到答案。构造方法

    public String(String original) {
        this.value = original.value;
        this.coder = original.coder;
        this.hash = original.hash;
    }

看方法头的参数列表,(String original)

这里实际就是定义一个新的局部变量 Sring original = 实参,那这就回到了第一种方式。所以这就是为什么说new一个String字符串会新建1个或者2个String对象了。

所以,日后在定义一个字面量的字符串应该尽量使用字面量赋值的,因为new实际上也是通过这种方式,而且它还多要了一份内存空间。

最后修改:2022 年 04 月 11 日
如果觉得我的文章对你有用,请随意赞赏