Java基础专题(三):字符串

前言

从概念上来讲,Java字符串就是Unicode字符序列。例如,”Java\u2122” 由5个Unicode字符J,a,v,a,和 ™。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做String。每个用双引号括起来的字符串都是String类的一个实例。

子串

String类的substring方法可以从一个较大的字符串提取出一个子串。例如:

String greeting = "Hello"
String s = greeting.substring(0,3)  // s = "Hel"

substring方法的第二个参数是不想复制的第一个位置。这里要复制位置为0,1和2(从0到2,包括0和2)的字符。在substring中从0开始计数,直到3为止,但不包括3。
substring有一个优点:容易计算字串的长度。即substring(a,b)的长度为b-a。例如,子串“Hel”的长度为3-0=3

拼接

与绝大多数的程序设计语言一样,Java语言允许使用 + 号连接(拼接)两个字符串。

String expletive = "Expletive"
String PG13 = "deleted"
String message = expletive + PG13 // message = "Expletivedeleted"

当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。

int age = 13;
String rating = "PG" + age; //rating为 PG13

如果需要将多个字符串连接在一起,并用定界符分离,可以使用静态join方法

String size = String.join(" / ", "S", "M", "L", "XL");
  //size = "S / M / L / XL"
不可变字符串

由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符 H,e,l,l 和 o 的代码单元序列,而不能修改戏中的任何一个字符。当然,可以修改字符串变量,让它引用另一个字符串。

不可变字符串的优点是:编译器可以让字符串共享,即各种字符串存储在公共的存储池中,字符串变量值相存储池中相应的位置,如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。

Java的设计者认为共享所带来的高效率远远胜于提取,拼接字符串所带来的低效率,因为我们很少需要修改字符串,更多的,我们是对字符串进行比较。

检测字符串是否相等

可以使用equals方法判断两个字符串是否相等,对于表达式:

s.equals(t)

如果字符串 s 与字符串 t 相等,则返回true;否则,返回false。需要注意,s和t可以是字符串变量,也可以是字符串字面量。如果要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。

"Hello".equalsIgnoreCase("hello") // true

一定不要使用==运算符检测两个字符串是否相等!!!
这个运算符只能确定两个字符串是否放在同一个位置上,当然,如果字符串放置在同一个位置上,他们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放在不同的位置上。

String greeting = "hello";
if (greeting == "hello")  // true
if (greeting.substring(0,3) == "hel")  // false

因为只有字符串常量是共享的,而 + 或substring产生的结果并不是共享的。所以千万不要用 == 运算符测试字符串的相等性!

空串与null串

空串 “” 是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:

if (str.length() == 0)

if (str.equals(""))

空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联

常用String API
  • char charAt (int index)
    返回给定位置的代码单元。除非对底层的代码单元感兴趣,否则不需要调用这个方法。

  • int compareTo(String other)
    按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0

  • boolean equals(Object other)
    如果字符串与other相等,返回true

  • boolean equalsIgnoreCase(String other)
    如果字符串与other相等(忽略大小写),返回true

  • boolean startWith(String prefix)

  • boolean endWith(String suffix)
    如果字符串以prefix(suffix)开头(结尾),则返回true

  • int indexOf(String str)

  • int indexOf(String str, int fromIndex)

  • int indexOf(int cp)

  • int indexOf(int cp, int fromIndex)
    返回与字符串str或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。如果原始串中不存在str,返回-1

  • int lastIndexOf(String str)

  • int lastIndexOf(String str, int fromIndex)

  • int lastIndexOf(int cp)

  • int lastIndexOf(int cp, int fromIndex)
    返回与字符串str或代码点cp匹配的最后一个子串的位置。这个位置从原始串尾端或fromIndex开始计算

  • int length()
    返回字符串的长度

  • String replace(CharSequence oldString, CharSequence newString)
    返回一个新字符串,这个字符串用newString代替原始字符串中的所有oldString。可以用String或StringBuilder对象作为CharSequence参数

  • String substring(int beginIndex)

  • String substring(int beginIndex, int endIndex)
    返回一个新字符串。这个字符串包含原始字符串中从beginIndex到串尾或endIndex - 1的所有代码单元

  • String toLowerCase()

  • String toUpperCase()
    返回一个新字符串,这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。

  • String trim()
    返回一个新字符串,这个字符串将删除了原始字符串头部和尾部的空格。

  • String join(CharSequence delimiter, CharSequence…elements)
    返回一个新字符串,用给定的定界符连接所有元素。

参考资料

Core Java Volume Ⅰ-Fundamentals

下期预告

控制流程:块作用域,条件语句,循环,等等~

公众号

纯公益技术分享,欢迎关注~
Java基础专题(三):字符串_第1张图片

你可能感兴趣的:(Java基础)