java核心技术卷阅读笔记二_字符串

一 : 字符串

1.1 字串

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

String str = "hello";
String subStr = str.substring(0,3); // hel
  • 从第0个字符开始截取,截到3-1个字符的位置,也就是"hel"
  • 我们可以使用这个方法计算字串的长度,字符串 s.substring(a, b) 的长度为 b-a。例如,子串“ Hel” 的长度为 3-0=3。

1.2 拼接

  • java中使用+拼接字符串
  • 当字符串和任何非字符串的值做拼接,后者都会被转换成字符串.
  • 多字符串拼接,用一个定界符分隔,可以使用静态join方法:
String all = String.join("/","a","b","abc","44");
System.out.println(all); //  a/b/abc/44

1.3 不可变字符串

  • String类没有提供用于修改字符串的方法.
  • java中字符串是不可变的.
  • 当我们需要修改字符串时:
String str = "hello";
str = str.substring(0,2)+"r";
System.out.println(str); //her

通常使用拼接或者截取,但是拼接或截取后字符串hello并没有改变,它是不可变的,改变的是字符串变量str,字符串变量str指向了一个新的字符串her.

  • 如果复制一个字符串变量, 原始字符串与复制的字符串共享相同的字符。

1.4 检测字符串是否相等

  • 可以使用 equals方法检测两个字符串是否相等
        String str = "hello";
        boolean flag = "hell".equals(str);
        System.out.println(flag); // false
  • 不区分大小写 : equalsIgnoreCase 方法
  • 一定不要使用== 运算符检测两个字符串是否相等!
  • 但实际上 只有字符串常量是共享的,而+ 或 substring 等操作产生的结果并不是共享的。

1.5 空串与 Null 串

  • 空串 “” 是长度为 0 的字符串。可以调用以下代码检查一个字符串是否为空:
if (str.length == 0)
//或 
if (str.equals(""))
  • 空串是一个 Java 对象, 有自己的串长度(0 ) 和内容(空)
  • String 变量还可以存 放一个特殊的值, 名为 null, 这表示目前没有任何对象与该变量关联,检测字符串是否位null:
if (str == null)

1.6 码点与代码单元(重点)

Java 字符串由 char 值序列组成。从 3.3.3 节“ char类型” 已经看到,

char 数据类型是一 个采用 UTF-16 编码表示 Unicode 码点的代码单元

  • char 数据类型是代码单元
  • 采用 UTF-16 编码表示 Unicode 码点
  • 码点(code point) 是指与一个编码表中的某个字符对应的代码值。在 Unicode 标准中, 码点采用十六进制书写,并加上前缀 U+.

大多数的常用 Unicode 字符使用一个代 码单元就可以表示,而辅助字符需要一对代码单元表示。

  • length 方法将返回采用 UTF-16 编码表示的给定字符串所需要的代码单元数量。例如:
String greeting = "Hello"; 
int n = greeting.length。 ; // is 5. 
  • 要想得到实际的长度,即码点数量,可以调用:
int cpCount = greeting.codePointCount(0, greeting.length());
System.out.println(cpCount); // 5
  • 调用s.charAt(n) 将返回位置 n 的代码单元,n 介于 0 ~ s.length()-1之间。例如:
char first = greeting.charAt(O); // first is 'H' 
char last = greeting.charAt(4); // last is ’o’ 
  • 要想得到第 i 个码点,应该使用下列语句
int index = greeting.offsetByCodePoints(0,i); 
int cp = greeting.codePointAt(index); 
  • Java 对字符串中的代码单元和码点从 0 开始计数.
  • 如果想要遍历一个字符串,并且依次査看每一个码点:
   		String greeting = "Hello";
        int[] codePoints = greeting.codePoints().toArray();
        for(int codePoint:codePoints){
            System.out.println(codePoint);
        }
  • 要把一个码点数组转换为一个字符串, 可以使用构造函数:
        String greeting = "Hello";
        int[] codePoints = greeting.codePoints().toArray(); //码点数组
        String str = new String(codePoints,0, codePoints.length);
        System.out.println(str); // Hello

1.7 StringAPI

这里还列出了所给类的版本号。如果某个方法是在这个版本之后添加的, 就会给出 一个单独的版本号。

  • char charAt (int index)
    返回给定位置的代码单元。除非对底层的代码单元感兴趣, 否则不需要调用这个 方法。
  • int codePointAt(int Index) 5.0
    返回从给定位置开始的码点。
  • int offsetByCodePoints(int startlndex, int cpCount) 5.0
    返回从 startlndex 代码点开始,位移 cpCount 后的码点索引。
  • int compareTo(String other)
    按照字典顺序,如果字符串位于 other 之前,返回一个负数;如果字符串位于 other 之 后,返回一个正数;如果两个字符串相等,返回 0。
  • IntStream codePoints() 8
    将这个字符串的码点作为一个流返回。调用 toArray将它们放在一个数组中。
  • new String(int[] codePoints, int offset, int count) 5.0
    用数组中从 offset 开始的 count 个码点构造一个字符串。
  • boolean equals(0bject other)
    如果字符串与 other 相等, 返回 true。
  • boolean equalsIgnoreCase(String other)
    如果字符串与 other 相等 (忽略大小写), 返回 true。
  • boolean startsWith(String prefix )
  • boolean endsWith(String suffix )
    如果字符串以 suffix 开头或结尾, 则返回 true。
  • int indexOf(String str)
  • int indexOf(String str, int fromlndex)
  • int indexOf(int cp)
  • int indexOf(int cp, int fromlndex)
    返回与字符串 str 或代码点 cp 匹配的第一个子串的开始位置。这个位置从索引 0 或 fromlndex 开始计算。 如果在原始串中不存在 str, 返回 -1。
  • int lastIndexOf(String str)
  • Int lastIndexOf(String str, int fromlndex)
  • int lastindexOf(int cp)
  • int lastindexOf(int cp, int fromlndex)
    返回与字符串 str 或代码点 cp 匹配的最后一个子串的开始位置。这个位置从原始串尾 端或 fromlndex 开始计算。
  • int length( )
    返回字符串的长度。
  • int codePointCount(int startlndex, int endlndex) 5.0
    返回 startlndex 和 endludex-1之间的代码点数量。没有配成对的代用字符将计入代码点。
  • String replace(CharSequence oldString,CharSequence newString) 替换
    返回一个新字符串。这个字符串用 newString 代替原始字符串中所有的 oldString。可 以用 String 或 StringBuilder 对象作为 CharSequence 参数。
  • String substring(int beginlndex)
  • String substring(int beginlndex, int endlndex)
    返回一个新字符串。这个字符串包含原始字符串中从 beginlndex 到串尾或 endlndex-1的所有代码单元。
  • String toLowerCase( )
  • String toUpperCase( )
    返回一个新字符串。这个字符串将原始字符串中的大写字母改为小写,或者将原始字 符串中的所有小写字母改成了大写字母。
  • String trim( )
    返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。
  • String join(CharSequence delimiter, CharSequence… elements) 8
    返回一个新字符串, 用给定的定界符连接所有元素。

1.8 构建字符串(重点)

有些时候, 需要由较短的字符串构建字符串, 例如, 按键或来自文件中的单词。采用字 符串连接的方式达到此目的效率比较低。每次连接字符串, 都会构建一个新的 String 对象, 既耗时,又浪费空间。使用 StringBuildei类就可以避免这个问题的发生。

  • 首先,构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
  • 当每次需要添加一部分内容时, 就调用 append 方法
builder.append(ch); // appends a single character 
bui1der.append(str); // appends a string 
  • 在需要构建字符串时就凋用 toString 方法, 将可以得到一个 String 对象, 其中包含了构建器 中的字符序列。
 String completedString = builder.toString();

在 JDK5.0 中引入 StringBuilder 类。 这个类的前身是 StringBuffer, 其效率稍有些 低, 但允许采用多线程的方式执行添加或删除字符的操作 , 如果所有字符串在一个单线 程中编辑(通常都是这样 ), 则应该用 StringBuilder 替代它。 这两个类的 API是相同的。

  • StringBuffer是线程安全的.
  • StringBuilder不是线程安全的.
  • 在单线程中使用StringBuilder效率更高.

1.9 StringBuffer或StringBuilder API

StringBuffer和StringBuilder API相同

  • StringBuilder()
    构造一个空的字符串构建器。
  • int length()
    返回构建器或缓冲器中的代码单元数量。
  • StringBuilder append(String str)
    追加一个字符串并返回 this。
  • StringBuilder append(char c)
    追加一个代码单元并返回 this。
  • StringBuilder appendCodePoint(int cp)
    追加一个代码点,并将其转换为一个或两个代码单元并返回 this。
  • void setCharAt(int i,char c)
    将第 i 个代码单元设置为 c。
  • StringBui1der insert(int offset,String str)
    在 offset 位置插入一个字符串并返回 this。
  • StringBuilder insert(int offset,Char c)
    在 offset 位置插入一个代码单元并返回 this。
  • StringBuilder delete(lnt startindex,int endlndex)
    删除偏移量从 startindex 到endlndex-1 的代码单元并返回 this。
  • String toString()
    返回一个与构建器或缓冲器内容相同的字符串

猜你喜欢

转载自blog.csdn.net/weixin_42430194/article/details/86552193