写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?

诸小亮:接下来我们就需要学习——String

张小飞:这不就是字符串么,前面也用过几次,还需要单独讲?

诸小亮:当然了,String 在工作中使用的最频繁了,属于重点内容

1. 介绍

诸小亮:你现在对 String 了解多少?

张小飞:在 java 中只要是以 " " 括起来的都是字符串,比如:"a"、"你好啊"、"abc"、"亚瑟"、"_$%lakj"

诸小亮:不错,String 就是 Java 中描述字符串的类,之前我们定义的 Person 类,只是用了一些基本数据类型, 像:height、weight、age等

“但还有很多属性是无法用基本数据类型来表示的,比如:姓名、地址、座右铭等”

“姓名、地址这些就用 String?”

“是的,比如:”

class Hero{ String name;//一个人的名字应该是String类型 String address;//地址应该是String类型 } public static void main(String[] args){ //定义一个字符串 String heroName = "亚瑟"; }

2. 常用方法

张小飞:String既然是一个类,它里面肯定有很多方法吧

诸小亮:不错,其实学习字符串,主要是会使用它的常用方法

张小飞:都有哪些方法呢?

诸小亮:我整理了一些,你看看吧

1. length

length():获取字符串长度,比如:

public static void main(String[] args) throws Exception { String str = "abcd"; int length = str.length(); System.out.println(length);//输出 4 }

2. chatAt

chatAt():获取指定下标的字符(下标从 0 开始),比如:

java26个技巧(张小飞的Java之路第十七章)(1)

张小飞:这应该输出最后一个字母 ‘d’吧

诸小亮:是的

张小飞:如果指定的下标不存在呢?

诸小亮:那就会报错了,比如:str.charAt(10),字符串中是不存在10这个下标的,结果:

java26个技巧(张小飞的Java之路第十七章)(2)

张小飞:原来如此

3. indexOf

indexOf:获取指定字符,在字符串中第一次出现的位置,比如:

java26个技巧(张小飞的Java之路第十七章)(3)

结果:省略

如果字符串中不存在指定字符,返回 -1,比如:

java26个技巧(张小飞的Java之路第十七章)(4)

结果:

java26个技巧(张小飞的Java之路第十七章)(5)

也可以获取某个子串第一次出现的位置,找不到同样返回 -1,比如:

java26个技巧(张小飞的Java之路第十七章)(6)

结果:

java26个技巧(张小飞的Java之路第十七章)(7)

还可以, 从指定位置查找子串:

java26个技巧(张小飞的Java之路第十七章)(8)

结果:

java26个技巧(张小飞的Java之路第十七章)(9)

4. lastIndexOf

lastIndexOf:获取指定字符,最后一次出现的位置,找不到返回 -1

public static void main(String[] args) throws Exception { String str = "abcdeeeeecd"; System.out.println(str.lastIndexOf("cd")); System.out.println(str.lastIndexOf("ef")); }

结果:

java26个技巧(张小飞的Java之路第十七章)(10)

5. contains

contains:判断是否包含指定子串

java26个技巧(张小飞的Java之路第十七章)(11)

结果:

java26个技巧(张小飞的Java之路第十七章)(12)

6. startsWith

startsWith:判断是否以指定子串开头

java26个技巧(张小飞的Java之路第十七章)(13)

结果:

java26个技巧(张小飞的Java之路第十七章)(14)

7. endsWith

endsWith:判断是否以指定子串结尾

java26个技巧(张小飞的Java之路第十七章)(15)

结果:

java26个技巧(张小飞的Java之路第十七章)(16)

8. isEmpty

isEmpty:判断是否是空字符串,其实就是看字符串的长度是不是0,其源码:

java26个技巧(张小飞的Java之路第十七章)(17)

9. trim

trim:去除字符串两端的空格,比如:

java26个技巧(张小飞的Java之路第十七章)(18)

结果:

java26个技巧(张小飞的Java之路第十七章)(19)

10. strip

strip:同样也是去除字符串两端的空格

张小飞:strip 跟 trim有什么不同呢

诸小亮:输入法有全角、半角,你知道吧

java26个技巧(张小飞的Java之路第十七章)(20)

张小飞:这个了解

诸小亮:trim 只能去除半角的空格,而 strip 都可去除,比如:

java26个技巧(张小飞的Java之路第十七章)(21)

结果:

java26个技巧(张小飞的Java之路第十七章)(22)

注意:一般情况下都是用半角,所以用 trim 方法足够了

11. split

split:对字符串进行切割,返回一个字符串数组,比如:

public static void main(String[] args) throws Exception { String str = "亚瑟,18,3个技能"; //根据‘,’对字符串进行切割,返回一个字符串数组 String[] split = str.split(","); System.out.println(split[0] "----" split[1] "----" split[2]); }

结果:

java26个技巧(张小飞的Java之路第十七章)(23)

12. replace

replace:替换字符串中的某些字符,比如:

java26个技巧(张小飞的Java之路第十七章)(24)

结果

java26个技巧(张小飞的Java之路第十七章)(25)

13. toLowerCase

toLowerCase:把字符串中的大写字母替换成小写字母

java26个技巧(张小飞的Java之路第十七章)(26)

结果:

java26个技巧(张小飞的Java之路第十七章)(27)

14. toUpperCase

toUpperCase:把字符串中的小写字母替换成大写字母

java26个技巧(张小飞的Java之路第十七章)(28)

结果:

java26个技巧(张小飞的Java之路第十七章)(29)

15. substring

substring:获取指定下标范围的子串

java26个技巧(张小飞的Java之路第十七章)(30)

结果:

java26个技巧(张小飞的Java之路第十七章)(31)

注意:包含头下标4,不包含尾下标6也可以只指定一个下标,比如:

java26个技巧(张小飞的Java之路第十七章)(32)

结果:

java26个技巧(张小飞的Java之路第十七章)(33)

16. toCharArray

toCharArray:把字符串转换成字符数组

java26个技巧(张小飞的Java之路第十七章)(34)

结果:

java26个技巧(张小飞的Java之路第十七章)(35)

17. 号

字符串之间可以相加,得出一个新的字符串

java26个技巧(张小飞的Java之路第十七章)(36)

结果:

java26个技巧(张小飞的Java之路第十七章)(37)

需要注意:

不过 JVM 对于 String 的拼接做了一些优化, 号不会很消耗内存了,之后再细说

3. 字符串的特殊性

诸小亮:字符串也是对象,也存在于堆内存中,比如:

java26个技巧(张小飞的Java之路第十七章)(38)

张小飞:原来它也是对象

诸小亮:不错,不过是一种特殊的对象

张小飞:怎么特殊?

1. 字符串不可改变

诸小亮:字符串是常量,一旦定义就不能改变,比如:

public static void main(String[] args) throws Exception { String str = "yase";//yase再java中就是常量 str = "daji"//这里修改的是str的值,不是"yase"这个字符串,因为它不可变 }

张小飞:什么叫 ‘修改的是str的值,不是"yase"这个字符串’

诸小亮:执行 String str = "yase"; 是这样的:

java26个技巧(张小飞的Java之路第十七章)(39)

“接着,执行 str = "daji"; 是这样的:“”

java26个技巧(张小飞的Java之路第十七章)(40)

张小飞:明白了

2. 一个字符串在内存中只有一份

诸小亮:另外,一个字符串在内存中只有一份

张小飞:这又是什么意思?

诸小亮:看下面代码你就明白了

public static void main(String[] args) { //1. str的值,是aaa在内存中的地址 String str = "aaa"; //2. 这句代码并不会创建一个新的字符串,因为 aaa 在内存中已经存在了 String str2 = "aaa"; System.out.println(str == str2);//注意:比较的是它俩指向的内存地址值 }

结果:

java26个技巧(张小飞的Java之路第十七章)(41)

张小飞:str 和 str2 指向了同一块内存?

诸小亮:是的

java26个技巧(张小飞的Java之路第十七章)(42)

张小飞:能够证明一下吗?

诸小亮:当然可以,看下图

java26个技巧(张小飞的Java之路第十七章)(43)

java26个技巧(张小飞的Java之路第十七章)(44)

java26个技巧(张小飞的Java之路第十七章)(45)

,