好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java之一文详解String字符串的用法

一. String字符串简介

1. 概述

String是Java里的一个类,属于引用类型,遵循引用类型的基本规律和要求。但它也有自己的一些特点,比如可以直接用双引号"......"来表示一个字符串,所以凡是用双引号括起来的一串字符都是String对象,如[Hello]在编译后就会成为一个String对象。

而且String是final类,一旦创建了一个String对象,理论上就不能再被改变,当然我们可以使用其他变量重新赋值的方式进行更改。

另外从名字上我们也可以猜测出,字符串与字符有一定的关系。实际上,String字符串的内部是通过一个 private final char[]数组 来实现数据存储的,所以我们可以通过如下方式来表示一个字符串:

?

1

String str = new String( new char [] { 'H' , 'e' , 'l' , 'l' , 'o' , 'y' , 'y' , 'g' });

当然,以上这种字符串的表达方式太过麻烦,而且由于String太常用了,所以Java就提供了"......"这种极简的表达方式供我们使用。

我们要知道,Java字符串的一个重要特点就是字符串的不可变性。这种不可变主要是通过final修饰String类, private final char[] 字段对数据的存储,且没有提供任何可以修改char[]字段的方法来实现的。

2. 与字符的区别

壹哥 之前给大家讲过java里的8种基本数据类型,我们知道,其中有一种比较特殊的char字符类型,可以在单引号中存储单个的字符元素,比如'A'、'9'、'国' 等。而我们今天要学习的String类,则是用双引号"..."来表达字符串的。作为初学者,我们一定要注意字符与字符串的区别:

字符只能表示单个字符元素,必须用单引号''把单个的字符元素括起来,如'A'、'9'、'国' 等; 字符串可以表示单个或多个字符元素,必须用双引号把单个或多个字符元素括起来,如"A"、"Hi"、"中国"等; 字符是基本类型,其本质是一种数值;字符串是引用类型,其本质是一个java类。

3. 定义方式

String字符串的定义方式,常用的有如下两种:

通过构造方法创建字符串对象;

直接赋值。

我们在开发时,其实很少使用第一种方式,因为太过啰嗦,一般都是通过直接赋值的方式进行定义。

3.1 构造方法定义

Java为String类提供了11个构造方法创建String对象,这些方法提供了不同的参数来初始化字符串。当字符串变量被创建处理后,必须经过初始化才能使用。下面是通过构造方法定义String对象的几种方式,大家可以参考:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo01 {

     public static void main(String[] args) {

     //通过构造方法创建String对象 

     //构造一个空字符串,相当于String s1="";

     String s1= new String();

     System.out.println( "s1的长度=" +s1.length()+ ",s1=" +s1);

        

     //构造一个由内容的字符串,相当于String s1 = "一一哥";

     String s2 = new String( "跟一一哥学Java" );

     System.out.println( "s2的长度=" +s2.length()+ ",s2=" +s2);

 

     //通过字节数组构建字符串对象

     byte [] b = { 97 , 98 , 99 , 100 };

     String s3= new String(b);

     System.out.println( "s3的长度=" +s3.length()+ ",s3=" +s3);

        

     //通过字节数组构建字符串对象

     //参数1:字节数组;参数2:起始下标;参数3:长度

     String s4 = new String(b, 0 , b.length);

     System.out.println( "s4的长度=" +s4.length()+ ",s4=" +s4);

 

     //通过字符数组创建字符串对象

     char [] c = { '一' , '一' , '哥' };

     String s5 = new String(c, 0 , c.length);

     System.out.println( "s5的长度=" +s5.length()+ ",s5=" +s5);

     }

}

3.2 直接赋值定义

下面是通过直接赋值的方式来定义String对象的方式,大家可以参考:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo02 {

     public static void main(String[] args) {

     //直接赋值的方式创建String对象

     //注意:null表示String对象为空,而""表示一个长度为零、内容为空的空字符串对象,但该对象不为空

     //定义一个值为null的空字符串

     String s1= null ;

     System.out.println( "s1=" +s1);

        

     //定义一个内容为空,长度为零的字符串

     String s2 = "" ;

     System.out.println( "s2的长度=" +s2.length()+ ",s22=" +s2);

        

     //定义一个带有内容的字符串

     String s3 = "一一哥" ;

     System.out.println( "s3的长度=" +s3.length()+ ",s3=" +s3);

     }

}

我们要注意 String s=null 与 String s="" 的区别:

String s=null 表示String对象为空,即 字符串对象的引用指向了null,还没有指向任何的内存空间; String s="" 是声明了一个字符串类型的引用,其值为"", 表示是一个长度为零、内容为空的空字符串对象,但该对象不为空! 这个s对象的引用指向的是空字符串的内存空间。

以上内容,是对字符串定义和使用的常规操作,但实际上String字符串还有其他很多有用的方法,接下来 壹哥 就专门给大家介绍一下这些实用方法。

二. 字符串实用方法

1. 字符串的比较方法

在Java中,如果我们想比较两个字符串, 其实主要是比较两个字符串的内容是否相同,所以应该使用   equals()   方法,而不要使用   ==   进行比较。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo04 {

     public static void main(String[] args) {

     String s1 = "hello" ;

         String s2 = "hello" ;

         //==用于比较两个对象的地址

         System.out.println( "s1==s2的结果:" +(s1 == s2));

         //equals()用于比较两个对象的内容

         System.out.println( "s1.equals(s2)的结果:" +s1.equals(s2)); 

     }

}

大家注意,在上面的案例中,虽然使用==和equals()比较的结果都是true,但实际上这只是]凑巧[罢了。在本案例中,之所以使用]==[进行比较的结果也是true,这是因为Java编译器在编译期,自动把所有相同内容的字符串当作一个对象放入到了字符串常量池。所以s1和s2都指向了同一个引用地址,结果自然就是相同的。但如果我们把上述案例换一种写法,再利用]==[进行比较就不是这样的结果。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo04 {

     public static void main(String[] args) {

         //新的写法

         String s3 = "yiyige" ;

         //将字符串转为小写

         String s4 = "YIYIGE" .toLowerCase();

         //此时s3和s4是指向两个不同引用地址的对象

         System.out.println( "s3==s4的结果:" +(s3 == s4));

         System.out.println( "s3.equals(s4)的结果:" +s3.equals(s4));

     }

}

从上面的案例中,我们可以得出一个结论, 要想比较两个字符串,应该使用 equals() 方法,而不是"=="方法!

2. 判断字符串是否为空

另外在前面的代码案例中, 壹哥 还给大家介绍了两种定义String字符串对象的方式,并在第2种方式中给大家提到了null与""两种为空的情况。而我们在实际开发中,判断一个字符串对象是null与"",其实是一种非常常见的操作,那么我们该怎么判断String对象是否是null或""呢?

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo03 {

     public static void main(String[] args) {

     //判断字符串对象是否为null或""

     //注意null表示String对象为空,而""表示是一个长度为零、内容为空的空字符串对象,但该对象不为空

         //定义一个值为null的空字符串

     String s1= null ;

     //判断方式1:判断对象是否为null

     if (s1== null ) {

             System.out.println( "s1字符串对象为null,s1=" +s1);

     }

        

     //定义一个内容为空,长度为零的字符串

     String s2 = "" ;

     //判断方式2:这种判断写法存在异常隐患,字符串对象s2有可能为null,如果s2.equals()调用时,s2可能为null,此时就会出现空指针异常

     if (s2.equals( "" )) {

             System.out.println( "s2的长度=" +s2.length()+ ",s2=" +s2);

     }

        

     //判断方式3:对上面的判断方式进行改进,用以下方式进行判断,就会消除空指针异常的隐患

     if ( "" .equals(s2)) {

             System.out.println( "s2的长度=" +s2.length()+ ",s2=" +s2);

     }

        

     //判断方式4:判断一个空串的长度是否为0,这种判断字符串是否为空的方式效率更高

     if (s2.length()== 0 ) {

             //我们也可以直接使用字符串的isEmpty()方法,其内部实现与此方式相同。

             System.out.println( "s2的长度=" +s2.length()+ ",s2=" +s2);

     }

        

     //判断方式5:更全面严谨的判断。s==null一定要写在前面,因为如果s为null,先调用后面的s.length()就会出现空指针异常

     if (s2 == null || s2.length() == 0 ) {

             System.out.println( "s2的长度=" +s2.length()+ ",s2=" +s2);

     }

        

     //判断方式6:或者我们直接使用字符串的isBlank()方法

     if (s2.isBlank()) {

             System.out.println( "s2的长度=" +s2.length()+ ",s2=" +s2);

     }  

     }

}

在实际开发时,我们一般是采用第5种判断方式,这种判断方式更为严谨,能够把两种]为空[的情况都考虑到。当然,我们也可以直接使用字符串对象提供的isEmpty()或isBlank()方法,进行判空。另外我们要特别注意,防止出现空指针异常,并且也要考虑采用哪种方式判断为空的情况效率更高。

3. 判断相关的方法

String字符串中提供了几个与字符串判断相关的方法,可以对一个字符串进行各种判断,这几个方法如下:

equals(): 判断两个字符串的内容是否相同; equalsIgnoreCase(): 判断两个字符串是否相等,忽略大小写; i sEmpty(): 判断字符串是否为空串"",主要是判断字符串长度是否为0; i sBlank(): 判断字符串是否为空串"",主要是判断字符串中是否包含空白字符; startsWith(): 判断字符串是否以指定的字符串开头; endsWith(): 判断字符串是否以指定的字符串结尾; contains(): 判断字符串中是否包含指定的字符串,参数是CharSequence类型,而不是String。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo05 {

     public static void main(String[] args) {

     String s1 = "yiyige" ;

     //判断两个字符串的内容是否相同

     System.out.println( "yiYige" .equals(s1));

     //判断两个字符串是否相等,忽略大小写

     System.out.println( "yiyige" .equalsIgnoreCase(s1));

        

     //判断字符串是否为空,或是否有空白字符

     //长度为0,字符串为空

     String s2= "" ;

     //长度不是0,字符串不为空

     String s3= " " ;

     //长度不是0,字符串不为空

     String s4= " \n" ;

        

     //判断字符串是否为空串""

     System.out.println( "s2为空吗?" +s2.isEmpty()); //true

     System.out.println( "s3为空吗?" +s3.isEmpty()); //false

     System.out.println( "s4为空吗?" +s4.isEmpty()); //false

        

     //判断字符串是否是空串或有空白字符

     System.out.println( "s2为空吗?" +s2.isBlank()); //true

     System.out.println( "s3为空吗?" +s3.isBlank()); //true

     System.out.println( "s4为空吗?" +s4.isBlank()); //true

        

     String s5 = "1234567890123" ;

     //判断字符串是否以指定的字符开头

     System.out.println(s5.startsWith( "12" ));

        

     //判断字符串是否以指定的字符串开头,并指定开始位置

     System.out.println(s5.startsWith( "34" , 2 ));

        

     //判断字符串是否以指定的字符串结尾

     System.out.println(s5.endsWith( "23" ));

        

     //判断字符串中是否包含指定的字符串

     System.out.println(s5.contains( "SB" ));

     }

}

4. 获取相关的方法

String字符串中提供了几个与字符串获取相关的方法,这几个方法如下:

charAt(): 获取指定下标位置上对应的字符,并返回char类型; i ndexOf(): 获取指定字符串在原字符串中的下标索引位置,如果不包含该字符串则返回-1; lastIndexOf() :该方法与indexOf()类似,但该方法是从后往前找,找到指定字符最后出现的位置; length(): 该方法用于返回字符串对象中包含的字符数量,即可以获取字符串的长度。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo06 {

     public static void main(String[] args) {

     String s1 = "abcn12c3fcds" ;

     //charAt(index),获取指定下标位置上对应的字符,并返回char类型

     System.out.println( "下标索引位置3上的字符是:" +s1.charAt( 3 ));

        

     //indexOf("字符串"),获取指定字符串在原字符串中的下标位置,如果不包含该字符串则返回-1

     System.out.println( "字符串的索引位置是:" +s1.indexOf( "cn2" ));

        

     //lastIndexOf("字符串"),与indexOf()方法类似,区别是该方法是从后往前找,找到指定字符最后出现的位置

     System.out.println( "指定字符的索引为:" +s1.lastIndexOf( "c" ));

        

     //length(),获取字符串的长度

     System.out.println( "字符串的长度是:" +s1.length());

     }

}

5. 拼接、替换、截取、分割、去空格等方法

String字符串中提供了拼接、替换、截取、分割等方法,这几个方法如下:

concat(): 将某个字符串连接到该字符串的结尾,并返回拼接后的字符串,相当于s1 = s1 + "world"; join(): 用指定的字符串连接字符串数组; replace(): 将字符串中指定的字符串替换成指定的字符串; replaceAll() :利用正则表达式,将字符串中指定的字符串替换成指定的字符串; substring(start,end): 字符串截取,从指定的下标索引开始和结束,范围是左闭右开,注意索引是从0开始; substring(index) : 字符串截取,从指定的索引下标开始一直截取到字符串的最后; split(): 字符串切割,按照指定的字符串对原字符串进行切割; trim() :不改变原有字符串内容,只是去除字符串首尾的空白字符,包括空格、\t、\r、\n。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo07 {

     public static void main(String[] args) {

         //用指定的字符串连接字符串数组

     String[] arr = { "A" , "B" , "C" };

     String str = String.join( "***" , arr); // "A***B***C"

     System.out.println( "新的字符串str=" +str);

         String s1 = "hello,SB" ;

     //将字符串与指定的字符串进行拼接,相当于s1 = s1 + "world";

     s1 = s1.concat( "world" );

     System.out.println( "新的字符串=" +s1);

        

     //字符串替换:将字符串中指定的字符串替换成指定的字符串

     s1 = s1.replace( "SB" , "**" );

     System.out.println( "新的字符串=" +s1);

 

         String s2 = "A,,B;C ,D" ;

         //利用正则表达式,将字符串中指定的字符串替换成指定的字符串;

     //通过正则表达式,把匹配的子串统一替换为","

     s2 = s2.replaceAll( "[\,\;\s]+" , "," ); // "A,B,C,D"

     System.out.println( "新的字符串s2=" +s2);

 

     //字符串截取,从指定的下标开始和结束,范围是左闭右开

     s1 = s1.substring( 0 , 5 );

     System.out.println( "新的字符串=" +s1);

 

     //字符串截取,从指定的下标开始一直截取到字符串的最后。

     //注意:StringIndexOutOfBoundsException

     s1 = s1.substring( 3 );

     System.out.println( "新的字符串=" +s1);

 

     //字符串切割,按照指定的字符串对原字符串进行切割

     String s2 = "zhangsan-lisi-wangwu" ;

     //利用指定的分隔符进行分割

     String[] s = s2.split( "-" );

     System.out.println(Arrays.toString(s));

 

         //去除字符串前后的空格

     String s3 = "      你好,       哈哈      " ;

     s3 = s3.trim();

     System.out.println( "新的字符串s3=" +s3);

     }

}

6. 大小写转换的方法

String字符串中提供了将字符串转为小写、大写等方法,这几个方法如下:

toUpperCase():  将字符串中的字母都变成大写; toLowerCase():  将字符串中的字母都变成小写。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo08 {

     public static void main(String[] args) {

     String s1 = "abcADC你好123" ; 

     //将字符串中的字母变成大写

     System.out.println( "转换后新的字符串=" +s1.toUpperCase());  

     //将字符串中的字母变成小写

     System.out.println( "转换后新的字符串=" +s1.toLowerCase());

     }

}

7. 字符串转数组的方法

String字符串中提供了将字符串转为字节、字符数组的方法,这几个方法如下:

getBytes():  将字符串转变成字节数组; toCharArray():  将字符串变成字符数组。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo08 {

     public static void main(String[] args) {

     String s1 = "abcd你好" ;  

         //将字符串转变成字节数组

     byte [] b = s1.getBytes();

     System.out.println(Arrays.toString(b));

        

     //将字符串变成字符数组

     char [] c = s1.toCharArray();

     System.out.println(Arrays.toString(c));

     }

}

8. 其他类型转字符串的方式

我们可以利用如下几种方式将其他类型转为String字符串:

利用"+"号拼接: 通过拼接得到一个新的字符串对象; valueOf()方法: 将其他的类型的数据转换成String类型; 构造方法 :也可以使用字符串对应的构造方法,将字节、字符数组类型转为字符串对象,效率较低。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo08 {

     public static void main(String[] args) {

     //其他类型转字符串的方式

     int i = 10 ;

        

     //方式1:利用+号进行转换

     String s1 = i+ "" ;

     System.out.println( "整形转字符串s1=" +s1);

        

     //方式2:将其他的类型的数据转换成String类型

     String s2 = String.valueOf(i);

     System.out.println( "整形转字符串s2=" +s2);

        

     //方式3:将字节数组转为字符串

     byte [] nums= { 97 , 98 , 99 , 100 };

     String s3= new String(nums);

     System.out.println( "整形转字符串s3=" +s3);

     }

}

9. 格式化字符串的方法

除了以上这些方法之外,String还提供了几个可以用于格式化字符串的方法,如下:

format():  可以将字符串进行格式化操作。 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

  * @author 一一哥Sun

  * 千锋教育

  */

public class Demo09 {

     public static void main(String[] args) {

     //实例方法:String对象.format()

         //%d、%s、%.2f都是占位符

     String s = "恭喜你,%s, 你的得分是:%d!" ;

         System.out.println(s.formatted( "壹壹哥" , 99 ));

       

         //静态方法:String类.format()

         System.out.println(String.format( "恭喜你,%s, 你的成绩是:%.2f!" , "一一哥2" , 46.5 ));

     }

}

在上面的案例中,涉及到了几个占位符,主要是配合参数进行格式化。当使用占位符时,就需要参数类型要和占位符要求的一致。常用的占位符含义如下:

%s : 表示字符串; %d : 表示整数; %x : 表示十六进制整数; %f : 表示浮点数。

另外占位符还可以带格式,例如%.2f是表示显示两位小数。如果你不确定到底该用哪个占位符,可以选择使用%s,因为%s可以显示任何数据类型。

以上这些方法,就是String字符串中的一些常用方法,当然并不是全部的方法。

三. 结语

至此,String字符串对象的定义方式,以及String类中常用的API方法给大家介绍完了,我们要掌握本文的重点内容,比如:

掌握String对象的定义方式; 掌握字符串对象的比较方式; 掌握字符串判空的方式及方法; 了解java中的常用占位符; 掌握其他重要方法。

以上就是Java之一文详解String字符串的用法的详细内容,更多关于Java String字符串用法的资料请关注其它相关文章!

原文链接:https://juejin.cn/post/7230603857033445437

查看更多关于Java之一文详解String字符串的用法的详细内容...

  阅读:19次