String
- 字符串都是对象(特殊的对象)
- 一旦初始化不可改变
- 字符串是常量,可以共享
字符串的创建:
String s="abc"; // 创建的在常量池中
String s1 =new String("abc"); // 创建的在堆内存中+常量池中
s==s1 // 比较的是内存地址
s.equal(s1) // 比较的字符串内容
String str="abc";
String str2="abc";
str==str2 // true 均在常量池地址相同
charAt(int index) =>char
// 若index不存在,会出现java.lang.StringIndexOutOfBoundsException: String index out of range: 5(查找的角标) 字符串角标越界
获取子串出现的次数
/**
* 获取子串出现的次数
* @param str 原字符串
* @param key 子串
* @return 次数
*/
int getCount(String str,String key){
int index=0;
int count=0;
while((index=str.indexOf(key,index))!=-1){
index+=key.length();
count++;
}
return count;
}
对象具备比较能力
// 1.实现Comparable接口 implements Comparable
// 2.重写compareTo方法即可
@Override
public int compareTo(Object o) {
if(!(o instanceof App)){
throw new ClassCastException("类型转换异常");
}
App app=(App)o;
return this.age-app.age;
}
重写equal方法比较
@Override
public boolean equals(Object obj) {
if(this==obj)
return true;
if(!(obj instanceof App)){
throw new ClassCastException("类型转换异常");
}
App app=(App)o;
return this.name.equal(app.name)&&this.age==app.age;
}
StringBuffer(线程安全同步的)
- 是一个字符串缓冲区,其实就是一个容器
- 长度可变,任意类型都行(任意类型都会变成字符串添加)
- 提供了对容器的更多操作(增删改查等)
- 最后的数据会变成一个字符串
- 底层用数组实现,初始化容量为16个字符,之后成倍增加容量
String s="a"+5+'c';
// 内部原理为
s=new StringBuffer().append("a").append(5).append('c').toString();
StringBuilder与StringBuffer区别: StringBuilder
- 线程不安全不保证同步
- 为单线程设计(无加锁放锁,速度快)
- append() // 不保证同步
StringBuffer
- 线程安全同步
- 为多线程设计(单线程用时有加锁放锁,速度慢)
- synchronized append() // 保证同步安全,如:删除时不能添加