String、StringBuffer类
String类
String类的特点
1、字符串一旦创建就不可能再改变
2、为提升字符串的访问效率,在程序中使用了“缓存”技术,即字符串常量池
3、如果使用到某个字符串,会先去字符串常量池中寻找对应字符串,如果没有找到就在常量池中创建一个新的字符串
4、String类重写了toString(),equals(),hashcode()方法。
并保证equals()方法相同时,hashcode()方法一定相同。
String创建对象的两种方式
1、String s= new String(“String”);
1)在堆区创建一个字符串对象
2)在方法区字符串常量池创建一个字符串对象 (如果常量池中本身就有,不用创建直接获取)
2、String s=“String”;
直接在方法区的字符串常量池中创建一个字符串对象,可以被共享
String类的构造方法
String类的常用方法
创建新的字符串:
concat:字符串的附加
replace、replaceAll:字符串的替换
substring:求子串
toLowerCase:转换成小写
toUpperCase:转换成大写
trim:把字符串首尾空格删除
split:把原来的字符串分割为几个字串
StringBuffer类
StringBuffer类的特点
StringBuffer类创建对象
StringBuffer类中的常用方法
概念理解:
代码实操:
StringBuffer s1=new StringBuffer("abcd1234!?,;");
StringBuffer s2=new StringBuffer("987654321987654");
StringBuffer s3=new StringBuffer("987654321");
System.out.println("↓↓↓StringBuffer类的一些常用方法如下↓↓↓");
System.out.println("-----------------------------------------------------");
System.out.println("字符串s1的长度为:" + s1.length());//返回字符串的实际长度
System.out.println("-----------------------------------------------------");
System.out.println("字符串s1所占容器的大小为:" + s1.capacity());//返回字符串所占容器的总大小
System.out.println("-----------------------------------------------------");
System.out.println("获取字符串s1中下标是2的位置的字符:" + s1.charAt(2));
System.out.println("-----------------------------------------------------");
System.out.println("子字符串'654'第一次出现在字符串s2中的索引为:" + s2.indexOf("654"));
System.out.println("从指定的索引6开始搜索,返回子字符串'654'第一次出现在字符串s2中的索引:" + s2.indexOf("654",6));
System.out.println("-----------------------------------------------------");
System.out.println("子字符串'987'最后一次出现在字符串s2中的索引为:" + s2.lastIndexOf("987"));
System.out.println("从指定的索引5开始反向搜索,返回字符串'87'在字符串s2中最后一次出现的索引:" + s2.lastIndexOf("87",5));
System.out.println("-----------------------------------------------------");
s1.append('x');//在字符串s1的末尾添加字符'c'
s1.append("Java");//在字符串s1的末尾添加字符串"Java"
System.out.println("修改后的字符串s1为:" + s1);
System.out.println("-----------------------------------------------------");
s1.insert(4,"abcd");//在第4个位置插入字符串"abcd"
System.out.println("修改后的字符串s1为:" + s1);
System.out.println("-----------------------------------------------------");
s1.deleteCharAt(1);//删除字符串s1中第一个位置的字符
s1.delete(2,5);//删除字符串s1中第2到第4个位置的字符
System.out.println("修改后的字符串s1为:" + s1);
System.out.println("-----------------------------------------------------");
s1.replace(4,8,"5678");//将字符串s1中第4到第7个位置的字符串修改为"5678"
System.out.println("修改后的字符串s1为:" + s1);
System.out.println("-----------------------------------------------------");
s1.setCharAt(1,'b');//将字符串s1中第一个位置的字符修改为'b'
System.out.println("修改后的字符串s1为:" + s1);
System.out.println("-----------------------------------------------------");
s2.reverse();//将字符串s2反转
System.out.println("修改后的字符串s2为:" + s2);
System.out.println("-----------------------------------------------------");
System.out.println("截取字符串s1从第4个位置开始到结尾:" + s1.substring(4));
System.out.println("-----------------------------------------------------");
System.out.println("截取字符串s1从第4个位置开始到第7个位置结尾:" + s1.substring(4,8));
System.out.println("-----------------------------------------------------");
System.out.println("获取s1的变量类型:" + s1.getClass().getName());
System.out.println("将对象信息转化为字符串:" + s2.toString());
↓↓↓StringBuffer类的一些常用方法如下↓↓↓
-----------------------------------------------------
字符串s1的长度为:12
-----------------------------------------------------
字符串s1所占容器的大小为:28
-----------------------------------------------------
获取字符串s1中下标是2的位置的字符:c
-----------------------------------------------------
子字符串'654'第一次出现在字符串s2中的索引为:3
从指定的索引6开始搜索,返回子字符串'654'第一次出现在字符串s2中的索引:12
-----------------------------------------------------
子字符串'987'最后一次出现在字符串s2中的索引为:9
从指定的索引5开始反向搜索,返回字符串'87'在字符串s2中最后一次出现的索引:1
-----------------------------------------------------
修改后的字符串s1为:abcd1234!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:abcdabcd1234!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:accd1234!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:accd5678!?,;xJava
-----------------------------------------------------
修改后的字符串s1为:abcd5678!?,;xJava
-----------------------------------------------------
修改后的字符串s2为:456789123456789
-----------------------------------------------------
截取字符串s1从第4个位置开始到结尾:5678!?,;xJava
-----------------------------------------------------
截取字符串s1从第4个位置开始到第7个位置结尾:5678
-----------------------------------------------------
获取s1的变量类型:java.lang.StringBuffer
将对象信息转化为字符串:456789123456789
String和StringBuffer类的比较
相同点:
1、都是用来处理字符串
2、都提供了length(),charAt()和subString()方法,且用法相同
不同点:
1、StringBuffer类创建的对象是可以改变的,通过改变其缓冲区的方法不会创建新的对象(如果空间不够可自动扩容)
StringBuffer自动扩容原理:如果新添加字符串(当然,append方法是重载的,添加其他类型的数据也可以,此处以字符串为例),导致原始的容量不够用,就会先进性扩容。
扩容的规则是:先 原始容量*2 + 2
1)、如果扩容了之后,容量够用,新的容量就为扩容之后的容量。
2)、如果扩容了之后,容量不够用,新的容量就是所需要的容量,即原始字符串长度加上新添加的字符串长度。
扩容完成之后,将原始数组复制到新的容量中,然后将新的字符串添加进去
2、 StringBuffer类没有覆盖equals()方法
3、 StringBuffer类不支持“+”连接运算
4、StringBuffer类覆盖toString()方法,但和String类覆盖 toString()方法实现方式不同
**String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息**