字符串的常用方法练习
package Two;
import java.sql.SQLOutput;
public class TestString {
public static void method1(){
//字符串的替换
String s1="hello world";
System.out.println(s1.replaceAll("e","aaa"));
// 替换字符串并不是在原有的字符串上进行替换,而是作为一个新的字符串进行返回
//因为String类设计的时候就严格限定了String类的不可改变
System.out.println(s1.replaceFirst("l","\\$"));//"$"前加上'\\'转义,替换第一个l
System.out.println(s1.replaceAll("h","H"));
}
public static void method2(){ //分割字符
String s1="apple.peach djkowa";
String[] s2=s1.split(" ");//按空格进行分割
for(int i=0;i<=s2.length-1;i++){
System.out.println(s2[i]);
}
System.out.println("-------------");
String s3=new String("a,b,c,d,e,f,g,h.java");
String[] s4=s3.split(",",4);//按’,‘进行分割,并且分成4份打印出来
for(int i=0;i<s4.length;i++){
System.out.println(s4[i]);
}
System.out.println("----------------");
s4=s3.split("\\.",2);//对于一些特殊字符需要添加转义字符“\\”
for(int i=0;i<s4.length;i++){
System.out.println(s4[i]);
}
System.out.println("-----------");
String t1="name=zhangsan&age=78";
String[] rst = t1.split("\\&");
for(int i=0;i<rst.length;i++){
String[] result=rst[i].split("=");
System.out.println(result[0]+"-->"+result[1]);
}
}
public static void method3(){
//字符串的截取
String s1="Hello World!!!";
String s2=s1.substring(0,6);//截取Hello,区间是左闭右开
System.out.println(s2);
}
public static void method4(){
//String.trim()方法:去掉字符串左右空格,保留中间空格
String s1=" Sc re a m ";
String s2=s1.trim();
System.out.println("["+s2+"]");
}
public static void method5(){
String s1="Hello";
String s2="Hello";
String s3=new String("world");
String s4=new String("world");
System.out.println(s1==s2);//true 引用对象相同,内容相同
System.out.println(s3==s4);//false new出来的对象引用不同,但是内容相同
}
public static void main(String[] args) {
// method1();
//method2();
//method3();
//method4();
method5();
}
}
字符串常量池
在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、
更节省内存,Java为8种基本数据类型和String类都提供了常量池。
为了节省存储空间以及程序的运行效率,Java中引入了:
1. Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息
2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常
量池每个类都有一份
3. 字符串常量池
package Four;
import com.sun.media.jfxmediaimpl.HostUtils;
public class TestString {
public static void method1(){
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);// true
}
public static void method2() {
char[] ch = new char[]{'a', 'b', 'c'};
String s1 = new String(ch); // s1对象并不在常量池中
//s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中
String s2 = "abc"; // "abc" 在常量池中存在了,s2创建时直接用常量池中"abc"的引用
System.out.println(s1 == s2); //打印“true”
}
public static void method3(){
char[] ch = new char[]{'a', 'b', 'c'};
String s1 = new String(ch); // s1对象并不在常量池中
String s2 = "abc";
//s1.intern();// "abc" 在常量池存在,但是返回的字符串的引用未被接受 ,应该用s1进行接受返回的字符串的引用
System.out.println(s1 == s2); //打印“false”
}
/*
s1.tern:将s1字符串放到字符串常量池中(StringTable)---堆,实现原理:
1、检测s1在字符串常量池中是否存在
2、如果存在,就直接返回字符串在字符串常量池中的引用
如果s1不存在字符串常量池中,将s1放置到字符串常量池中,然后返回s1的引用
字符串常量池中的内容,用户可以通过intern方法干预
*/
public static void method4(){
String s1="hello";
s1+="world";
System.out.println(s1);//返回的是一个副本,而并不是在s1上进行修改虽然打印的是“helloworld”,但是s1内部并没有改变
//并不建议这样修改,效率太低,中间创建了好多的对象;如果要对字符串进行修改,建议使用StringBulider或者StringBuffer
}
public static void main(String[] args) {
// method1();
// method2();
// method3();
method4();
}
}
String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1. String类在设计时就是不可改变的,String类实现描述中已经说明了
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的:下面是关于StringBuffer和StringBulider的使用方法
package Four;
public class TestString {
public static void method5(){
StringBuffer str1=new StringBuffer("hello");
StringBuffer str2=str1;
str1.append("");//hello
str1.append("world");//helloworld
str1.append("123");//helloworld123
System.out.println(str1);
System.out.println(str1==str2);//true
System.out.println(str1.charAt(3));//获得3号字符位上的“l”
System.out.println(str1.indexOf("l"));//查询“l”的位置
System.out.println(str1.length());//查询str1的有效长度
System.out.println(str1.capacity());//获取底层数组的大小
str1.setCharAt(0,'H');//设置任意位置的字符 ,Helloworld123
str1.insert(0,"qiaowenbo");//qiawoenbohelloworld123
System.out.println(str1);
System.out.println(str1.indexOf("l"));//查询“l”第一次出现的位置
System.out.println(str1.lastIndexOf("l"));//查询”l“最后出现的位置
str1.delete(0,3);//删除0~3的字符
str1.deleteCharAt(0);//删除0号位字符
String str3=str1.substring(0,4);//截取0~4之间的字符并以String的方式返回
System.out.println(str3);
str1.reverse();//字符串逆转
str3=str1.toString();//对StringBuffer以String返回
System.out.println(str3);
}
public static void method6(){
//会创建多少个对象?
String str1=new String("hello")+new String("world");//会创建6个String对象
/*
通过StringBuilder在进行拼接的时候
StringBulider拼接完成之后,会调用自己的内部的toString()方法将StringBulider转化为一个新的String对象并返回
toString内部会new一个String对象
*/
System.out.println(str1);
}
public static void main(String[] args) {
// method5();
method6();
}
}
从上述例子可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改。频繁修改字符串的情况考虑使用StringBuilder。
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
StringBuilder变为String: 调用toString()方法
String、StringBuffer、StringBuilder的区别:
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操
作