1. 字符串: 定义一个描述字符串的类 String
字符串可以看作是一个字符序列:把多个字符按照一定顺序排列起来,多个字符组合在一起 通过查看String的API发现 String实现了一个接口 CharSequence 字符序列接口 这个字符序列如何存储到内存中 --> 其实字符串就是一个字符数组
String str = "ABC"; ---> char[] cs =new char[]{'A,'B','C'} -->字符串支持下标操作 --> charAt
str.chatAt(1) --> 'B
2. 特点:字符串是不能改变的,它们的值在创建后不能被改变
3.内存:字符串存储在方法区的常量池中;定义字符串,使用时先在常量池中查找,若找不到则创建一个字符串;若找到直接使用已有的
public static void main(String[] args){
String str="10000";
String str2="20000"; //字符串常量 在常量池
//两个对象,一个是用new创建的对象,一个字符串对象
String str3=new String("1000");
sop(str==str2); //true
sop(str2==str3): //false
str2.equals(str3); //Object的equals方法比较两个对象是否为同一个
boolean boo=str2.equals(str3);
sop(boo); //true 说明String类重写了equals方法,比较两个对象的值是否一致
}
4. 分类:值可变与不可变
不可变字符串:String对String进行任何赋值操作,都不会修改原有的值,而是重新创建,这种方式就是不可变
不可变原因:String之所以不可变,是因为String每次获取字符串的时候,它都是相当于正在字符串池中创建一个新的字符串,而不是对原有字符串进行修改,字符串每次创建的时候都会出现一个新的地址,所以Java推出了一个机制,即字符串池机制(可以减少字符串的创建)当字符串池中已经存在了相同字符串时,此时就不会再新建字符串,而是获取原有已经存在在字符池中的地址,这样一来可以减少字符串的创建,所以String是一个少有的可以使用 == 来比较内容是否相等的引用类型,但是这里存在一个特殊问题:就是这个字符串必须是完全相同的 == 才可以为true,所以要是比较字符串是否相等还是需要使用equals方法
可变字符串:StringBuffer/StringBuilder创建完对象之后,所有的操作都会对字符串本身起到改变的作用(字符串构建器)
StringBuffer实现字符串的增删改查:
public class SBTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str=new String("world");
StringBuffer sb=new StringBuffer("hello");// 增删改查
//添加字符串
StringBuffer sb1=sb.append(false);
// 加入到StringBuffer中都被转成字符串 加入对象的是字符串表示
sb.append(66).append(true).append(new Object()); //连续添加
//得到StringBuffer中的字符串
sop(sb.toString()); //StringBuffer将Object类的toString()方法重写,返回字符串
sop(sb);// 输出一个对象时默认调用toString()方法
System.out.println(str);
sop(sb==sb1);
sb.insert(5,"world "); //插入字符串world
sop(sb);
sb.delete(5,10); //删除world,不包括结束位置
sop(sb);
}
public static void sop(Object obj){
System.out.println(obj);
}
}