String类
- String位于java.lang包中,Java程序默认导入java.lang包下的所有类。
- "+"把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。

- 当"+"运算符两侧的操作数中只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后再进行连接。

- String对象被称为“不可变对象” ,String 类对象代表不可变的Unicode字符序列,对象内部的成员变量的值无法再改变;字符串的内容全部存储在value[]数组中,而value是用final修饰的,也就是常量只能被赋值一次,一旦赋值则不能被改变

String类中常用的方法
| 方法名 | 作用 |
|---|---|
| length: | 字符串字符数 |
| equals: | 字符串是否相同 |
| valueOf: | 其他类型转字符串 |
| substring: | 截取字符串 |
| toLowerCase: | 字符串转小写 |
| toUpperCase: | 字符串转大写 |
| replace: | 字符串替换 |
| replaceAll: | 带正则字符串替换 |
| replaceFirst: | 替换第一个出现的目标字符串 |
| contains: | 是否包含目标字符串 |
| startsWith: | 是否以目标字符串开头 |
| endsWith: | 是否以目标字符串结束 |
| isEmpty: | 字符串长度是否为0 |
| charAt: | 获取指定下标位置的字符 |
| getBytes: | 获取字符串的字节数组 |
| getChars: | 获取字符串的指定长度字符数组 |
| toCharArray: | 获取字符串的字符数组 |
String对象之间比较
在进行字符串比较时,最好是使用equals方法;使用==是用来判断两个对象是否是相同的
public static void main(String[] args) {
String string1 = "hello" + " world"; //相当于hello world;
String string2 = "hello world";
//编译器做了优化,直接在编译的时候将字符串进行了拼接,所以string1与string2相同
System.out.println(string1 == string2);
String string3 = "hello";
String string4 = "world";
String string5 = string3 + string4;
//编译的时候不知道变量中存储的是什么,没办法在编译时直接进行优化
System.out.println(string1 == string5);
System.out.println(string2 == string5);
System.out.println(string1.equals(string5));
}
StringBulider和StringBuffer
StringBuffer和StringBuilder非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,在AbstractStringBuilde中字符串的内容全部存储在value[]数组中,而value并没有用final修饰的,也就是常量是可以被修改的,所以为可变字符序列。

StringBuilder线程不安全,效率高
StringBuffer线程安全,效率低
//StringBuulder为可变字符序列,可指定改变某个字符,改变后哈希编码地址不变
public static void main(String[] args) {
StringBuilder sBuilder = new StringBuilder("hollo");
System.out.println(Integer.toHexString(sBuilder.hashCode()));
System.out.println(sBuilder);
sBuilder.setCharAt(1, 'e');
System.out.println(Integer.toHexString(sBuilder.hashCode()));
System.out.println(sBuilder);
}
StringBuilder的常用方法
| 方法 | 作用 |
|---|---|
| 重载的public StringBuilder append(…)方法 | 可以为该StringBuilder 对象添加字符序列,仍然返回自身对象。 |
| public StringBuilder delete(int start,int end) | 可以删除从start开始到end-1为止的一段字符序列,仍然返回自身对象。 |
| public StringBuilder deleteCharAt(int index) | 移除此序列指定位置上的 char,仍然返回自身对象。 |
| 重载的public StringBuilder insert(…)方法 | 可以为该StringBuilder 对象在指定位置插入字符序列,仍然返回自身对象。 |
| public StringBuilder reverse() | 用于将字符序列逆序,仍然返回自身对象。 |
| public String toString() | 返回此序列中数据的字符串表示形式。 |
public static void main(String[] args) {
StringBuilder sBuilder = new StringBuilder();
//循环输出26个字母
for (int i = 0; i < 26; i++) {
sBuilder.append((char)('a' + i)); //为sBuilder添加字符系列,然后返回自身对象
}
System.out.println(sBuilder);
sBuilder.delete(0, 5); //删除从a到e为止的一段字符序列,然后返回自身对象
System.out.println(sBuilder);
sBuilder.deleteCharAt(6); //移除此序列中第六个位置的字符,然后返回自身对象
System.out.println(sBuilder);
sBuilder.insert(6, 'l'); //在第六个位置插入l字符,仍然返回自身对象
System.out.println(sBuilder);
sBuilder.insert(3, '2').insert(8, '5');//链式调用insert方法,该方法调用了return this,返回自身对象
System.out.println(sBuilder);
sBuilder.reverse();//将字符序列逆序,仍然返回自身对象
System.out.println(sBuilder);
sBuilder.toString();//返回此序列中数据的字符串表示形式。
System.out.println(sBuilder);
}

可变字符序列和不可变字符序列
String对象称为不可变对象,经过初始化后就不可再改变,对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。
public static void main(String[] args) {
String string = "9";
for (int i = 0; i < 10; i++) {
string = string + i;//使用string进行字符串的拼接时,系统对产生20个新的对象
}
System.out.println(string);
}
StringBuilder和StringBuffer代表可变字符序列,是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。
public static void main(String[] args) {
StringBuilder sBuilder = new StringBuilder("9");
for (int i = 0; i < 10; i++) {
sBuilder.append(i); //使用StringBuilder直接再字符串后面拼接,返回自身对象,不占多余的内存
}
System.out.println(sBuilder);
}

2440

被折叠的 条评论
为什么被折叠?



