String类方法详解

本文涵盖了String类的多个重要方法并详细讲解了它们的作用:

String Methods
  • 获取字符串的长度:
    length()方法
  • 获取到字符串某个索引处的char:
    charAt()方法
  • 用字符串生成char数组的方法:
    getChars()
  • 比较字符串对象是否相等:
    equals()方法
  • 忽略大小写时比较字符串对象是否相等:
    equalsIgnoreCase()方法
  • 判断两个字符串对象的指定区间是否匹配:
    regionMatches()方法
  • 判断字符串对象是否以指定的字符或字符串开头或结尾
    startsWith() & endsWith()方法:
  • 定位字符或子字符串:
    indexOf() & lastIndexOf() 方法
  • 从字符串中截取子字符串:
    substring()方法
  • 拼接字符串:
    concat()方法
  • 替换字符串中的某个字符或子字符串:
    replace()
  • 将字符串对象大写或小写:
    toUpperCase()、toLowerCase()
  • 去掉字符串对象前后的空格:
    trim()方法:
  • 接收任何种类的参数,并将其转化为字符串对象:
    String.valueOf()方法:

最初和String类打交道的时候,因为它太常见了,一直都想当然地认为String类型也是基本类型的一种。
后来才发现,原来String也是一个类。
既然是类,那就肯定有对象,因此也必须要有构造器

java为String类提供了多个重载的构造器:

public class StringConstructors{
    public static void main(String[] args) {
//生成一个char数组,之后会用到其中的char来生成String对象
        char [] charArray = 
            new char[] {'h','e','l','l','o','w','o','r','l','d'}; 
        String st = new String("hello");

        //构造器
        String s1 = new String();
        String s2 = new String(st);
        String s3 = new String (charArray);
        String s4 = new String (charArray,5,5);

        System.out.printf("s1 = %s%ns2 = %s%ns3 = %s%ns4 = %s%n",
            s1,s2,s3,s4);
    }
}

输出:

s1 = 
s2 = hello
s3 = helloworld
s4 = world

注:s4用到的构造器传入的两个int类型的参数:

  • 第一个表示index。由于数组是从0开始计数的,所以,index = 5 指的也就是从第6个插入开始算。
  • 第二个表示往后数的个数,结合本例子中的index =5,也就是从第六个char开始,往后数5个char。

因此输出的就是 “world”。

获取字符串的长度——length()
获取到字符串某个索引处的char——charAt()
用字符串生成char数组——getChars()
public class StringMiscellaneous{
    public static void main(String[] args) {
        String s1 = "hello world";
        char [] charArray= new char [5];
//输出s1的值
        System.out.printf("s1的值: %s",s1);
//length()方法
        System.out.printf("%ns1的长度:%d ",s1.length());
//charAt()方法 输出s1的每一个char
        System.out.printf("%n输出s1的每一个char:%n");
        for (int count =0; count <s1.length() ; count ++) {
            System.out.printf("%c ",s1.charAt(count));
        }
        
//反转输出s1的每一个char
        System.out.printf("%n反转输出s1的每一个char:%n");
        for (int count = s1.length()-1 ;count >=0;count-- ) {
            System.out.printf("%c ",s1.charAt(count));
        }
        System.out.println();

        s1.getChars(0,5,charArray,0);
        System.out.printf("输出由s1得到的char数组:%n");
        for (char character : charArray ) {
            System.out.print(character);
        }
        System.out.println();
    }
}

输出:

s1的值: hello world
s1的长度:11 
输出s1的每一个char:
h e l l o   w o r l d 
反转输出s1的每一个char:
d l r o w   o l l e h 
输出由s1得到的char数组:
hello

注:s1.getChars(0,5,charArray,0);方法中的参数依次为:

  • 第一个参数代表从String对象复制char的开始索引,这里传入1也就是从第一个char开始复制;
  • 第二个参数代表从String对象复制字符时结尾的index,这里传入6,说明复制的范围应该是[0,6), 也就是说不包括该索引所在位置的char;
  • 第三个参数传入存放char的数组;
  • 第四个参数代表将char复制到指定数组的开始索引。这里传入0也就表示从charArray数组的index = 0的位置开始写入复制的char。

比较字符串对象是否相等:

public class StringComparation{
    public static void main(String[] args) {
        String s1 = new String("hello"); //s1复制了hello字符串的值
        String s2 = "good day";
        String s3 = "Have a nice day";
        String s4 = "have a nice day";
        //输出s1,s2,s3,s4的值:
        System.out.printf("s1 = %s%ns2 = %s%ns3 = %s%ns4 = %s%n%n",
            s1,s2,s3,s4);
        //equals()方法
        if (s1.equals("hello")) 
            System.out.println("s1 equals \"hello\"");
        else
            System.out.println("s1 does not equals \"hello\"");
    }
}

输出:

s1 = hello
s2 = good day
s3 = Have a nice day
s4 = have a nice day

s1 equals "hello"

从输出结果可以看出,equals()方法比较的是内容。也就是只要字符串的内容相等,equals()方法就返回true。

但是,如果用 “==”来做比较,情况则有所不同:

if (s1 == "hello") 
            System.out.println("s1 和\"hello\"是同一个对象");
        else
            System.out.println("s1 和 \"hello\"不是同一个对象");
        String s5 = new String("hello");
        if (s1 == s5) 
            System.out.println("s1和s5 是同一个对象");
        else
            System.out.println("s1和s5不是同一个对象");

输出:

s1和"hello"不是同一个对象
s1和s5不是同一个对象

在java中,当基础类型的值通过“==”来作比较时,如果两个基础类型的值相等,则返回true。但如果用“==”来比较引用类型,只有当两个同时指向内存中的同一个对象时才会返回true。
s1 = new String ("hello");语句的意思是,新建一个String对象,其值复制自"hello", 并让变量s1获得其引用。也就是变量s1指向了这个新生成的String对象。
如果换一种写法,写成s1 = "hello;",结果就会不同了:

String s1 = "hello";
        if (s1 == "hello") 
            System.out.println("s1 和\"hello\"是同一个对象");
        else
            System.out.println("s1 和 \"hello\"不是同一个对象");
        String s5 = new String("hello");
        if (s1 == s5) 
            System.out.println("s1 和 s5 是同一个对象");
        else
            System.out.println("s1 和 s5 不是同一个对象");

输出:

s1 和"hello"是同一个对象
s1 和 s5 不是同一个对象

这一次,变量s1直接指向了字符串“hello”,而s5与上文中的s1类似。实际情况是s5指向了新生成的一个String对象,而该String对象的值是从“hello”复制得到的。
所以,

if (s1.equals(s5)) 
            System.out.println("s1 和 s5 值相等");
        else
            System.out.println("s1 和 s5 值不等");

的输出结果为:

s1 和 s5 值相等

忽略大小写时,判断字符串是否相等——equalsIgnoreCase()方法:

此方法在比较值是否相等时会忽略大小写:

public class StringComparation{
    public static void main(String[] args) {
        String s1 = new String("hello"); //s1复制了hello字符串的值
        String s2 = "good day";
        String s3 = "Have a nice day";
        String s4 = "have a nice day";
//输出s1,s2,s3,s4的值:
        System.out.printf("s1 = %s%ns2 = %s%ns3 = %s%ns4 = %s%n%n",
            s1,s2,s3,s4);
//equalsIgnoreCase()方法:
        if (s3.equalsIgnoreCase(s4)) 
            System.out.printf("忽略大小写时,%s 等于 %s%n",s3,s4);   
        else 
            System.out.printf("忽略大小写时,%s 不等于 %s%n",s3,s4);

输出:

s1 = hello
s2 = good day
s3 = Have a nice day
s4 = have a nice day

忽略大小写时,Have a nice day 等于 have a nice day

判断两个字符串对象的指定区间是否匹配——regionMatches()方法:

此方法用来比较两个String对象的某一区间是否相等:

        if (s3.regionMatches(0,s4,0,5)) //大小写敏感
            System.out.println("s3和s4的前五个字符相等");    
        else
            System.out.println("s3和s4的前五个字符不相等");
s3和s4的前五个字符不相等

regionMatches()方法接收4个参数时:

  • 第一个参数,表示s3字符串要做比较的区间从哪儿开始算起;
  • 第二个参数表示要与s3座比较的字符串,这里传入s4;
  • 第三个参数与第一个类似;
  • 第四个参数表示要作比较的区间的长度。
    这里由于'h'不等于‘H’,所以该方法返回false。

如果想要忽略掉大小写来进行比较的话,则可以用其重载的另一个方法,并将第一个参数设置为true:

if (s3.regionMatches(true,0,s4,0,5)) //大小写不敏感
            System.out.println("s3和s4的前五个字符相等");    
        else
            System.out.println("s3和s4的前五个字符不相等");

输出:

s3和s4的前五个字符相等

判断字符串对象是否以指定的字符或字符串开头或结尾——startsWith()&endsWith()方法:

顾名思义,这两个方法用来判断String对象是否以某字符串或字符开头或结尾:

public class StringStartsAndEnds{
    public static void main(String[] args) {
        String [] strings = 
            {"started","starting","to start", "ends","ended","to be ended" };
            //startsWith()方法
            for (String s  : strings) {
                if (s.startsWith("st")) {
                    System.out.printf("\"%s\" starts with \"st\"%n",s);
                }
            }
            //endsWith()方法
            for (String s  : strings) {
                if (s.endsWith("ed")) {
                    System.out.printf("\"%s\" ends with \"ed\"%n",s);
                }
            }
    }
}

输出:

"started" starts with "st"
"starting" starts with "st"
"started" ends with "ed"
"ended" ends with "ed"
"to be ended" ends with "ed"

定位字符或子字符串——indexOf() & lastIndexOf() 方法

public class MethodsForStringIndex{
    public static void main(String[] args) {
        String letters = "abcdefghigklmnabchilmnopqrstuvwabcde";
        //indexOf()方法
        System.out.printf(
            "'c' 在letters中第一次被找到时所在的index为:%d%n",
            letters.indexOf('c') );
        System.out.printf(
            "'c' 在letters中,从index=2处往后,第一次被找到时所在的index为:%d%n",
            letters.indexOf('c',2));//从letters的第三个字符开始 找
        System.out.printf(
            "'c' 在letters中,从index=3处往后,第一次被找到时所在的index为:%d%n",
            letters.indexOf('c',3));//从letters的第四个字符开始 找
    }
}

输出:

'c' 在letters中第一次被找到时所在的index为:2
'c' 在letters中,从index=2处往后,第一次被找到时所在的index为:2
'c' 在letters中,从index=3处往后,第一次被找到时所在的index为:16

同理,也可以用lastIndexOf()方法来检索得到某字符最后一次出现时的index:

System.out.printf(
            "'c' 在letters中最后一次被找到时所在的index为:%d%n",
            letters.lastIndexOf('c') );
        System.out.printf(
            "'c' 在letters中,从index=33处开始,向前检索,被再次找到时所在的index为:%d%n",
            letters.lastIndexOf('c',33) );
        System.out.printf(
            "'c' 在letters中,从index=32处开始,向前检索,被再次找到时所在的index为:%d%n",
            letters.lastIndexOf('c',32) );

输出:

'c' 在letters中最后一次被找到时所在的index为:33
'c' 在letters中,从index=33处开始,向前检索,被再次找到时所在的index为:33
'c' 在letters中,从index=32处开始,向前检索,被再次找到时所在的index为:16

以上是对单个字符的检索,对子字符串的检索同理:

String subString = "bc";
//indexOf()方法
        System.out.printf("\"bc\"第一次被定位到时的index为:%d%n",
            letters.indexOf(subString));
        System.out.printf(
            "'bc' 在letters中,从index=1处开始,被再次找到时所在的index为:%d%n",
            letters.indexOf(subString,1) );
        System.out.printf(
            "'c' 在letters中,从index=2处开始,被再次找到时所在的index为:%d%n",
            letters.indexOf(subString,2) );

输出:

"bc"第一次被定位到时的index为:1
'bc' 在letters中,从index=1处开始,被再次找到时所在的index为:1
'bc' 在letters中,从index=2处开始,被再次找到时所在的index为:15

lastIndexOf()方法的情况类似,不再举例。
最后需要说明的是,如果indexOf()或者lastIndexOf()方法找不到指定的字符或子字符串,则其返回-1:

System.out.println(letters.indexOf('z'));
System.out.println(letters.lastIndexOf("程序猿"));

输出:

-1
-1

从字符串中截取子字符串:substring()

public class SubStringTest{
    public static void main(String[] args) {
        String letters = "abcdefghigklmnabchilmnopqrstuvwabcde";
        System.out.printf("从index=20处截取到letters的末尾:\"%s\"%n",
            letters.substring(20));
        System.out.printf("从index=5处开始截取,"
            +"一直到index=20处(但不包括index=20):\"%s\"%n",
            letters.substring(5,20));
        System.out.printf("从index=5处开始截取,"
            +"一直到index=21处(此时包括index=20):\"%s\"%n",
            letters.substring(5,21));

    }
}

输出:

从index=20处截取到letters的末尾:"mnopqrstuvwabcde"
从index=5处开始截取,一直到index=20处(但不包括index=20):"fghigklmnabchil"
从index=5处开始截取,一直到index=21处(此时包括index=20):"fghigklmnabchilm"

从输出结果可以看出,当参数为sbustring(5,21)时,实际截取到的值才位于区间[5,20]。
如果是substring(5,20),则实际截取到的值位于区间[5,20)或者说[5,19]。

substring()方法结合之前的lastIndexOf()方法便可以很轻松地从一个下载链接中获取到要下载的文件的文件名:

//传入一个下载链接,这里以简书的app下载url为例:
        String url = "http://www.jianshu.com/apps";
//将url的长度保存在urlLength变量中:
        int urlLength = url.length();
//"/"符号最后一次出现时的index值为:
        int lastSlashIndex = url.lastIndexOf('/');
//用substring()方法截取文件名
        String fileName = url.substring(lastSlashIndex +1,urlLength -1);
        System.out.println("文件名为:"+fileName);

输出:

文件名为:app

拼接字符串——concat()方法

concat()方法可以用来拼接字符串,拼接前后原字符串的值不会被修改:

//拼接字符串
        String s1 = "Hello ";
        String s2 = "World";

        System.out.printf("拼接s1和s2得到:%s%n",s1.concat(s2));
        System.out.printf("拼接过后s1的值为:%s%n",s1);
拼接s1和s2得到:Hello World
拼接过后s1的值为:Hello 

replace()、toUpperCase()、toLowerCase()、trim()方法:

public class StringMiscellaneous2{
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "GOD BLESS YOU";
        String s3 = "      前后都有好多空格      ";

        System.out.printf("s1 = %s%ns2 = %s%ns3 = %s%n",
            s1,s2,s3);

//replace()方法:
        System.out.printf("用replace()方法把\"hello\"中的'l'换成'L':",
            s1.replace('l','L'));//注意不要漏了引号

//toLowerCase() & toUpperCase()方法:
        System.out.printf("s2.toLowerCase()=%s%n",s2.toLowerCase());
        System.out.printf("s1.toUpperCase()=%s%n",s1.toUpperCase());

//trim()方法去掉字符串前后多余的空格:
        System.out.printf("s3.trim()=%s%n",s3.trim());
    }
}

输出:

s1 = hello
s2 = GOD BLESS YOU
s3 =       前后都有好多空格      
用replace()方法把"hello"中的'l'换成'L':s2.toLowerCase()=god bless you
s1.toUpperCase()=HELLO
s3.trim()=前后都有好多空格

接收任何种类的参数,并将其转化为字符串对象——String.valueOf()方法:

众所周知,java中所有的对象都有一个valueOf()方法,用来输出该对象对自身的文字描述。但是基本类型的数据因为不能使用方法,所以无法做到这一点。
java中的String类提供了一个静态方法:valueOf()。此方法可以接收任何种类的参数,并将其转化为字符串对象:

public class StringValueOf{
    public static void main(String[] args) {

        char [] charArray = {'h','e','l','l','o'};
        boolean b = true;
        char ch = 'J';
        int i = 4;
        long l = 100000000L;
        float f= 2.5f;
        double d = 3.333;
        Object oReference = "world"; 

        System.out.printf("char array = %s%n",String.valueOf(charArray));
        System.out.printf("char array 的一部分 = %s%n",
            String.valueOf(charArray,2,3));

        System.out.printf("boolean= %s%n",String.valueOf(b));
        System.out.printf("char= %s%n",String.valueOf(ch));

        System.out.printf("int= %s%n",String.valueOf(i));
        System.out.printf("long= %s%n",String.valueOf(l));

        System.out.printf("float= %s%n",String.valueOf(f));
        System.out.printf("double= %s%n",String.valueOf(d));
        
        System.out.printf("Object= %s%n",String.valueOf(oReference));
    }
}

输出:

char array = hello
char array 的一部分 = llo
boolean= true
char= J
int= 4
long= 100000000
float= 2.5
double= 3.333
Object= world

水平有限,难免纰漏。
欢迎批评指正。
诸君共勉:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容

  • java中String的常用方法 1、length()字符串的长度 例:char chars[]={'a','b'...
    赤赤有名阅读 2,023评论 0 10
  • String类 1、String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,...
    简诗阅读 369评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 1,236评论 0 4
  • 定义 在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定...
    狐尼克朱迪阅读 177评论 0 0