这篇文章中梳理了 Java 中几个常见的预定义类:字符串类型 String 类、Object 类、枚举类型 Enum 类以及数组。
1、字符串 String 类
1.1 字符串相关问题总结
String 的每一个看起来会修改 String 的方法实际都是创建一个全新的 String 对象,以包含修改后的字符串的内容,而最初的 String 对象则丝毫未动;
String 使用 char value[]
存储字符,所以 String 对象在创建之后就不能修改对象存储的字符串内容,正因如此才说 String 类型是不可变的;
String 使用正则表达式的方式,应该注意一下下面的这些方法参数是正则表达式而不是普通的字符串:
1. 匹配验证操作:`"asd".matches("[0-9]")`
2. 分割操作:`"0as0d".split("[0-9]")`
3. 替换操作:`"0a0sd".replaceAll("[0-9]", "09")`
除了调用 String 对象的方法,还可以使用 Pattern
和 Matcher
两个类来使用正则表达式:
private static Pattern imagePattern;
public static Uri getPreviewImage(String noteContent) {
if (imagePattern == null) {
imagePattern = Pattern.compile(Constants.REGEX_NOTE_PREVIEW_IMAGE);
}
Matcher matcher = imagePattern.matcher(noteContent);
if (matcher.find()) {
String str = matcher.group();
if (!TextUtils.isEmpty(str)) {
// do something...
}
}
return null;
}
String 类有一个特殊的创建方法,就是使用 ""
创建。比如 new String("str")
实际上创建了两个对象:一个是通过 ""
创建的,另一个是使用 new
创建。只是创建的时期不同:一个是在编译器,一个是在运行期。
运行期间调用 String 的 intern
方法可以向 String Pool 中动态添加对象。如
String s1 = "strs";
String s2 = s1.intern();
这个时候,如果我们使用`s1 == s2`进行判断的话会得到什么结果呢?
答案是 true. 参考intern方法的注释:如果 Pool 中存在一个与当前 String 相等(所谓的相等是指使用 equals 方法判断时相等)的对象的时候,就返回 Pool 中的那个对象。否则,就将当前的 String 添加到 Pool 中。
注意字符串拼接操作和 ==
操作的优先级:
String s = "str";
System.out.println("s == s " + s == s);
System.out.println("s == s " + (s == s));
输出的结果是:
false
s == s true
这是因为不管 + 号是用作加法还是用作连接字符串,它的优先级都要比 == 号要高。
使用字符串拼接操作符 +
来拼接字符串,不适合运用在大规模的场景中,这是因为当两个字符串拼接到一起时,它们的内容都要被拷贝。
char 类型是采用 UTF-16
编码的 Unicode 代码点,大多数 Unicode 字符用一个代码单元,辅助字符需要两个代码单元,使用 charAt 的时候获取的是指定位置的代码单元,所以当字符串中存在需要两个代码单元的字符时,就容易出现错误。一般可以使用下面的形式获取每个代码点
int cp = sentence.codePointAt(n);
If(Character.isSupplementaryCodePoint(cp)) i += 2;
else i++;
1.2 其他
- String 类型为 0 或多个双字节 Unicode 字符组成的序列,默认为 null,这与
””
不同。所以,要判断一个字符串是否为空,可以使用下面的形式if (str != null && str.length != 0)
,即说明字符串不是null
也不是””
; - 字符串不是字符数组,不能按照数组的方式访问;
- 比较字符串是否相等要用
equals
方法(C++可以用 ==,C语言使用 strcmp); - 要由许多小段的字符串构建字符串,使用
StringBuilder
效率更高; - 如果要修改字符串指定位置的字符,使用
subString()
截取然后再使用+
或者StringBuilder
进行拼接即可; - 文件路径中的反斜号前要增加一个额外的反斜号,如
”c:\\myDir\\myFile.txt”
; - Java 中字符串的长度是不可变的,这样设计是为了使字符串共享;
- 使用
String.format()
静态方法可以创建一个格式化的字符串,而不输出,比如:String msg = Sting.format(“Age is %d”,age);
。
2、Object 类
所有类型都隐式的派生于 java.lang.Object
类,其主要用于两个目的:
- 使用
Object
引用绑定任何数据类型的对象; Object
类型执行许多基本的一般用途的方法,包括equals()
,finalize()
,hashCode()
,getClass()
,toString()
,notify()
,notifyAll()
和wait()
等.
2.1 finilize() 方法
- 它是不可预测的,也是很危险的&#x