030、Java 中的字符串

Par @Martin dans le
Tags :

String 类

在之前的笔记就已经使用了字符串, Java 中, 字符串被作为 String 类型的对象处理, 该类位于 java.lang 包中, 默认情况下这个包被自动导入所有的程序.

创建 String 对象的方法:

String si = "xxx";
String s2 = new String();
String s3 = new String("xxx");

String 对象具有__不变性__, 即对象创建后则不能被修改(如果需要一个可以改变的字符串, 我们可以使用 StringBuffer 或者 StringBuilder);

而平常见到的 Java 代码中, 对 String 对象的修改其实是__创建了新的对象__.

一些 String 必须了解的细节:

  • String s1 = “字符串” 声明了一个字符串对象, s1 存放的是字符串对象的引用, 其实质是创建了新的字符串对象, 变量 s1 指向了新创建的字符串对象.
  • 通过 String s1 = “字符串” 方式创建的字符串, 对于多次出现的字符常量, 只会创建一个, 如 String s1 = “字符串”, String s2 = “字符串”, 那么 s1、s2 指向的是同一个对象, 即 s1 == s2.
  • 通过 String s1 = new String(“字符串”) 方式创建的字符串, 每次都是产生一个新的对象, 即便两个字符串的内容相同, 使用 “==” 比较时也为 “false”, 如果只需比较内容是否相同, 应使用 “equals()” 方法(String 类重写了 equals() 方法).

String 类提供了许多用来处理字符串的方法, 例如, 获取字符串长度、对字符串进行截取、将字符串转换为大写或小写、字符串分割等.

小细节:

  • 字符串 str 中字符的索引从0开始, 范围为 0 到 str.length()-1
  • 使用 indexOf 进行字符或字符串查找时, 如果匹配返回位置索引, 如果没有匹配结果, 返回 -1
  • 使用 substring(beginIndex , endIndex) 进行字符串截取时, 包括 beginIndex 位置的字符, 不包括 endIndex 位置的字符

StringBuilder / StringBuffer

在 Java 中, 除了可以使用 String 类来存储字符串, 还可以使用 StringBuilder 类或 StringBuffer 类存储字符串.

因为对 String 的修改会生成新的 String 对象, 所以当频繁操作 String 时, 就会额外产生很多消耗, 使用 StringBuilder 或 StringBuffer 就可以避免这个问题, 它们是可变类, 任何对它指向的字符串的操作都不会产生新的对象.

至于 StringBuilder 和StringBuffer, 它们基本相似, 不同之处, StringBuffer 是线程安全的, 而 StringBuilder 则没有实现线程安全功能, 所以性能略高.

简单的说, 如果用到了多线程就用 StringBuffer, 否则就用 StringBuilder.

StringBuilder str1 = new StringBuilder();

StringBuilder str2 = new StringBuilder(“xxx”);

StringBuilder 类也提供了一些方法来操作字符串:

字符串<=>基本类型

Java 提供三种方法实现基本类型向字符串转换:

  • 使用包装类的 toString() 方法
  • 使用 String 类的 valueOf() 方法
  • 用一个空字符串加上基本类型, 得到的就是基本类型数据对应的字符串
int c = 10;
String str1 = Integer.toString(c);
String str2 = String.valueOf(c);
String str3 = c + "";

将字符串转换成基本类型有两种方法:

  • 调用包装类的 parseXxx 静态方法
  • 调用包装类的 valueOf() 方法转换为基本类型的包装类, 然后自动拆箱
String str = "10";
int d = Integer.paseInt(str);
int e = Integer.valueOf(str);