注:本文章学习于JDK API 1.6.0版本,全文为作业或作业笔记,仅仅为学习记录不为商用。
1.1 String
String代表字符串,Java程序中所有字符串都可以作为实列实现。(如:String data="Hello Would";)
1.2 关于String类所实现的接口:
Serializable,CharSequence,Comparable<String>
public final class String extends Object implements Serializable, Comparable<String>,
CharSequence 多接口实现
2.Strng类方法实现与简绍(注:下面不会简绍关于String的构造方法)
2.1查询与索引
2.1.1 public char charAt(int index)
: 返回指定索引处的字符。
输入参数:index:要访问的字符索引
返回值:
返回指定索引处的 char
值。
异常抛出:如果索引超出范围(即小于 0 或大于等于字符串的长度),则抛出 StringIndexOutOfBoundsException
。
实列:
2.1.2 public int indexOf(int ch)
: 返回指定字符在此字符串中第一次出现处的索引。
参数 :ch
:要搜索的字符(Unicode 代码点)。
返回值:返回指定字符在此字符串中第一次出现的索引;如果未找到该字符,则返回 -1。
实列:
在这个例子中,字符串 str
是 "Hello, World!"
。我们通过调用 indexOf('o')
来查找字符 'o'
第一次出现的索引,它返回 4,因为 'o'
是该字符串中第五个字符(索引从 0 开始)。然后,我们尝试查找不存在的字符 'x'
,indexOf('x')
返回 -1,表示未找到该字符。
需要注意的是,indexOf
方法区分大小写,因此 indexOf('O')
(大写 'O')将返回 -1,因为在这个字符串中没有大写 'O'。如果你想要进行不区分大小写的搜索,你可能需要使用 toLowerCase()
或 toUpperCase()
方法先将字符串统一转换为小写或大写,然后再进行搜索。但是,请注意,这种方法可能会受到不同语言和地区设置的影响,因此更推荐的方法是使用正则表达式和 Pattern
类进行更复杂的搜索操作。
2.1.3
public int indexOf(String str): 返回指定子字符串在此字符串中第一次出现处的索引。
参数 :str
要搜索的子字符串。
返回值:返回指定子字符串在此字符串中第一次出现的索引;如果未找到该子字符串,则返回 -1。
实列
在这个例子中,字符串 str1
是 "Hello, World! Welcome to the universe."
。我们通过调用 indexOf("World")
来查找子字符串 "World"
第一次出现的索引,它返回 7,因为 "World"
是从索引 7 的位置开始的。然后,我们尝试查找子字符串 "welcome"
(注意首字母小写),但由于原字符串中的相应部分是 "Welcome"
(首字母大写),所以 indexOf("welcome")
返回 -1,表示未找到。最后,我们成功找到了 "universe"
的索引,即 24。
indexOf(String str)
方法区分大小写,因此 "World"
和 "world"
会被视为不同的子字符串。如果你想要进行不区分大小写的搜索,可以先将两个字符串都转换为小写或大写,然后再调用 indexOf
方法。但是,请注意,这种方法可能会受到不同语言和地区设置的影响,因此在某些情况下可能需要更复杂的解决方案,比如使用正则表达式和 Pattern
类。
2.1.4
public int lastIndexOf(int ch): 返回指定字符在此字符串中最后一次出现处的索引。
参数 ch
:要搜索的字符(Unicode 代码点)。
返回值 返回指定字符在此字符串中最后一次出现的索引;如果未找到该字符,则返回 -1。
实列
2.1.5 public int lastIndexOf(String str)
: 返回指定子字符串在此字符串中最后一次出现处的索引。
参数String str
:要搜索的子字符串。
返回值:返回指定子字符串在此字符串中最后一次出现的索引;如果未找到子字符串,则返回 -1
。
对于子字符串 "World"
,它在字符串 "Hello, World! World is amazing."
中最后一次出现在索引 13
的位置(从 0 开始计数)。尽管 "World"
出现了两次,但 lastIndexOf
方法只关心最后一次出现的位置。
对于子字符串 "xyz"
,它在字符串中不存在,因此 lastIndexOf("xyz")
返回 -1
。
2.1.6
public boolean startsWith(String prefix): 测试此字符串是否以指定的前缀开始。
参数 String prefix
:要测试的前缀。
返回值 如果字符串以指定的前缀开始,则返回 true
;否则返回 false
。
字符串 "Hello, World!"
以 "Hello"
开始,所以 startsWith("Hello")
返回 true
。
同样的字符串不以 "world"
(注意大小写)开始,所以 startsWith("world")
返回 false
。
空字符串以任何字符串(包括空字符串本身)开始,所以 emptyStr.startsWith("")
返回 true
。这是因为在 Java 中,任何字符串都被视为以空字符串开始。
2.1.7
public boolean endsWith(String suffix): 测试此字符串是否以指定的后缀结束。
参数 String suffix
:要测试的后缀。
返回值 如果字符串以指定的后缀结束,则返回 true
;否则返回 false
。
字符串 "Hello, World!"
以 "World!"
结束,所以 endsWith("World!")
返回 true
。
同样的字符串不以 "hello"
(注意大小写)结束,所以 endsWith("hello")
返回 false
。
任何字符串都被视为以空字符串结束,所以 str7.endsWith("")
返回 true
。这是因为在 Java 中,空字符串是任何字符串的有效后缀。
这两个方法(startsWith
和 endsWith
)在处理字符串时非常有用,尤其是在需要验证字符串格式或进行模式匹配时。
2.1.8 contains(CharSequence s)
: 当且仅当此字符串包含指定的 char 值序列时,返回 true。
参数 CharSequence s
:要搜索的字符序列。
返回值 如果此字符串包含指定的字符序列,则返回 true
;否则返回 false
。
字符串 "Hello, World!"
包含 "World"
,所以 contains("World")
返回 true
。
同样的字符串不包含 "hello"
(注意大小写),所以 contains("hello")
返回 false
。
任何字符串都被视为包含空字符串,所以 str8.contains("")
返回 true
。这是因为在字符串的任何位置之后(包括在开头之前和结尾之后)都可以插入一个空字符串,因此从技术上讲,任何字符串都包含空字符串。然而,这个行为通常不是 contains
方法的主要用途或关注点。
2.2 截取与替换
2.2.1 public String substring(int beginIndex): 返回一个新的字符串,它是此字符串的一个子字符串。
参数 int beginIndex
:子字符串的起始索引(包含)。索引从 0 开始。
返回值 返回一个新的字符串,它是此字符串的一个子字符串。
在这个示例中,我们展示了如何使用 substring(int beginIndex)
方法来获取不同部分的子字符串。注意,虽然从字符串末尾的下一个索引开始获取子字符串在技术上是可能的(通过传递 str9.length()
作为参数),但这将抛出 StringIndexOutOfBoundsException
,因为该索引超出了字符串的有效范围。同样,从字符串的末尾开始获取子字符串将返回一个空字符串。substring(int beginIndex, int endIndex)
: 返回一个新字符串,它是此字符串的一个子字符串。
replace(char oldChar, char newChar)
: 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。replace(CharSequence target, CharSequence replacement)
: 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
replaceAll(String regex, String replacement)
: 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
replaceFirst(String regex, String replacement)
: 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
2.3匹配大小与比较
2.3.1 public boolean equals(Object anObject):比较两个字符串是否相等(区分大小写)。
参数 Object anObject
:要与之比较的对象。
返回值:如果参数不为 null
且是一个与调用此方法的字符串相等的 String
对象,则返回 true
;否则返回 false
。
在这个示例中,我们展示了如何使用 equals
方法来比较字符串对象。注意,即使 str110
和 str210
指向不同的对象实例,但由于它们的内容相同,str110.equals(str210)
仍然返回 true
。相比之下,str1.equals(str310)
返回 false
,因为 str310
的内容与 str110
不相同(尽管它们看起来很相似)。此外,尝试将字符串与 null
或非字符串对象进行比较将返回 false
。
2.3.2 public boolean equalsIgnoreCase(String anotherString):比较两个字符串是否相等,忽略大小写。
参数 String anotherString
:要与之比较的字符串。
返回值 :如果两个字符串在忽略大小写的情况下相等,则返回 true
;否则返回 false
参数 String anotherString
:要与之比较的字符串。
返回值: 如果两个字符串在忽略大小写的情况下相等,则返回 true
;否则返回 false
。
在这个示例中,我们展示了如何使用 equalsIgnoreCase
方法来比较字符串,忽略它们的大小写。注意,尽管 str111
、str211
和 str311
的大小写不同,但 str111.equalsIgnoreCase(str211)
和 str111.equalsIgnoreCase(str311)
都返回 true
,因为它们在忽略大小写的情况下是相等的。相比之下,str111.equalsIgnoreCase("Java")
返回 false
,因为即使忽略大小写,"Hello, World!"
和 "Java"
也不相等。此外,与 null
比较将返回 false
。
2.3.3compareTo(String anotherString):按字典顺序比较两个字符串。
参数 String anotherString
:要与之比较的字符串。
返回值 如果字符串等于参数字符串,则返回 0
;
如果此字符串在字典顺序上小于字符串参数,则返回小于 0
的值;
如果此字符串在字典顺序上大于字符串参数,则返回大于 0
的值。
在这个示例中,我们展示了如何使用 compareTo
方法来比较两个字符串。str1.compareTo(str212)
返回一个负数,因为 'a'
在字典顺序上小于 'b'
。相反,str2.compareTo(str112)
返回一个正数。当两个字符串相等时,如 str1.compareTo(str312)
,该方法返回 0
。
请注意,尝试将字符串与 null
进行比较会导致 NullPointerException
。因此,在实际应用中,你应该先检查 null
情况,以避免此类异常。
2.3.4 compareToIgnoreCase(String str):按字典顺序比较两个字符串,忽略大小写。
然而,需要注意的是,如果 str1
或 str2
为 null
,则上述代码中的 toLowerCase()
调用将抛出 NullPointerException
。为了处理这种情况,你可以在调用 toLowerCase()
之前添加对 null
的检查,如下所示:
现在,这个自定义的 compareToIgnoreCase
方法可以安全地处理 null
值了。
2.3.5 public boolean contentEquals(CharSequence cs):将此字符串与指定的CharSequence
进行比较。
参数 CharSequence cs
:要与之比较其内容的 CharSequence
对象。
返回值 如果调用该方法的字符串与指定的 CharSequence
对象的内容相同,则返回 true
;否则返回 false
。
在这个示例中,str15.contentEquals(sb)
和 str15.contentEquals(charSeq)
都返回 true
,因为 StringBuilder
对象 sb
和 CharSequence
对象 charSeq
的内容与字符串 str
相同。然而,如果你需要忽略大小写进行比较,应该使用 equalsIgnoreCase
方法,但请注意它只适用于与另一个 String
对象的比较。
2.3.6 public boolean matches(String regex):检查此字符串是否匹配给定的正则表达式。
参数 String regex
:要匹配此字符串的正则表达式。
返回值 如果字符串与正则表达式完全匹配,则返回 true
;否则返回 false
。
在这个示例中,我们尝试使用不同的正则表达式来验证电子邮件地址的格式。首先,我们尝试使用一个可能不完全正确的正则表达式来检查电子邮件是否有效(实际上,它返回了 false
,因为正则表达式本身可能不是完美的)。然后,我们使用一个更简单的正则表达式来检查字符串中是否包含 @
符号,并成功匹配了电子邮件字符串。最后,我们演示了如何使用正则表达式来匹配一个空字符串。
3.3.7regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len):测试两个字符串区域是否相等。
参数
boolean ignoreCase
:如果为 true
,则比较时忽略大小写;如果为 false
,则考虑大小写。
int toffset
:此字符串中子区域的起始偏移量。
String other
:要与之比较的字符串。
int ooffset
:other
字符串中子区域的起始偏移量。
int len
:要比较的子区域的长度。
返回值
如果两个子区域相等(根据 ignoreCase
参数可能忽略大小写),则返回 true
;否则返回 false
。
在这个示例中,我们展示了如何使用 regionMatches
方法来比较两个字符串的子区域,同时考虑了是否忽略大小写的情况。第一个比较忽略了大小写,因此返回了 true
;而第二个比较没有忽略大小写,因此返回了 false
。请注意,如果你尝试比较超出字符串边界的子区域,将会抛出 IndexOutOfBoundsException
。
第一部分手册笔记,后续待续。