String
常用方法
length()
返回此字符串的长度。
String str = "Java 编程 基础";
System.out.println(str.length()); // 10
charAt()
返回
char
指定索引处的值。
String str = "Java 编程 基础";
System.out.println(str.charAt(1)); // a
indexOf()
返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
String str = new String("JAVA编程基础,我喜欢Java编程");
// 查找A第一次出现位置
System.out.println(str.indexOf("A")); // 1
// “编程”第一次出现位置
System.out.println(str.indexOf("编程")); // 4
// 从index值为8开始,查找第一次“编程”出现的位置
System.out.println(str.indexOf("编程", 8)); // 16
lastIndexOf()
返回指定字符的最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
String str = new String("JAVA编程基础,我喜欢Java编程");
// 查找A最后一次出现位置
System.out.println(str.lastIndexOf("A")); // 3
// “编程”最后一次出现位置
System.out.println(str.lastIndexOf("编程")); // 16
getBytes()
使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
// 字符串转换为byte数组
String str = new String("JAVA编程基础,我喜欢Java编程");
byte arrs [] = str.getBytes();
for(byte b : arrs) {
System.out.println(b + ",");
}
// byte数组转换为字符串
String str1 = new String(arrs);
同时编码格式的设置:
String str = new String("JAVA编程基础,我喜欢Java编程");
// gbk编码
byte arrs [] = str.getBytes("gbk");
for(byte b : arrs) {
System.out.println(b + ",");
}
// gbk编码
String str1 = new String(arrs, "gbk");
System.out.println(str1);
equals()
将此字符串与指定对象进行比较。
String中equals()和 == 的区别
String
类型比较中equals()
用于比较不同对象内容
是否相同- 而
==
用于比较基本数据类型的是否相同
以及判断引用是否指向堆内存的同一块地址
。
String str1 = "jachie";
String str2 = "jachie";
String str3 = new String("jachie");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str3.equals(str4)); // true
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str3 == str4); // false
str1
会指向常量池里的"jachie"
,str2
创建的时候,同时也是指向"jachie"
,因此两个对象不仅值相同,同时他们的地址引用也相同;创建str3
对象的时候,会指向堆里的实例对象,同时str4
创建的时候,也会在堆里创建一个引用对象,并指向它。
因此str3
和str4
的值是相同的,但是引用地址是不相同的。
String的不可变性
String
对象一旦被创建,则不能被修改,是不可变的,所谓的修改其实就是创建了新的对象,所指向的内存空间不变。
String s1 = "hello,";
s1 = s1 + "jachie";
原本
s1
指向“hello,”
,而后,指向“hello,jachie”
,取消指向原来的“hello,”
String s1 = "hello,";
String s2 = "hello,jachie";
String s3 = s1 + "jachie";
System.out.println(s2); // hello,jachie
System.out.println(s3); // hello,jachie
System.out.println(s2 == s3); // false
s2
指向常量池里的“hello,jachie
,而s3
执行s1 + "jachie";
则是在堆里创建了一个对象,因此两者引用地址不同。
StringBuilder
String和StringBuilder的区别
String
具有不可变性,而StringBuilder
不具备。
因此当频繁操作字符串时,使用StringBuilder
,避免产生一些中间变量和在常量池当中废弃的数据。
StringBuffer 和 StringBuilder
- 二者基本相似,继承了一个抽象的字符串父类:
AbstractStringBuilder
StringBuffer
:线程安全,StringBuilder
:线程不安全。因为 StringBuffer的所有公开方法都是synchronized
修饰的,而 StringBuilder 并没有 StringBuilder 修饰。因此StringBuilder性能更高一点,而且大多字符串处理都是单线程情况。
StringBuilder可变示例:
StringBuilder str = new StringBuilder("hello"); // 1.
str.append(","); // 2.
str.append("jachie"); // 3.
System.out.println(str); // 4. hello,jachie
执行1.
:StringBuilder str = new StringBuilder(“hello”);
执行2.
:str.append(",");
执行3.
:str.append(“jachie”);
自始至终,
str
都没有创建新的对象,而是一直在原来的基础上进行变化。
常用方法
append(String str)
将指定的字符串附加到此字符序列。
delete(int start, int end)
删除此序列的子字符串中的字符。从
start
开始删除,到end
之前结束。
insert(int offset, String str)
将字符串插入到此字符序列中。从
offset
之前开始插入。
replace(int start, int end, String str)
用指定的String中的字符替换此序列的子字符串中的String 。从
start
开始,到end
之前结束。