String类(二)

字符串的常用方法练习

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未采用同步处理,属于线程不安全操

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值