String类详解--超详细!配代码示例和运行图!!

构造方法

1.直接等号赋值

2.new一个对象

3.数组转化

代码如下:在main函数里面:

        String str1="Hello";
        String str2=new String("World");

        char[] ch={'a','b','c'};
        String str3=new String(ch);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);

运行结果:

比较两个字符串

1.判断是否相等:两种方式:对象1==对象2

                                              对象1.equals(对象2)

其区别是:== 比较的是对象存储的地址值是否相同

                  equals 比较的是对象存储的内容是否相同

1.1 先理解==判等:看一段代码:

        String str1="Hello";
        String str2="world";
        String str3=str1;

        System.out.println(str1==str3);
        System.out.println(str1==str2);
        System.out.println(str3==str2);

其运行结果是:

要理解这个结果,我们就要了解Java中字符串的存储情况:

1.2  equals 判等

        String str1="Hello";
        String str2="World";
        String str3=str1;

        System.out.println(str1.equals(str3));
        System.out.println(str1.equals(str2));
        System.out.println(str3.equals(str2));

运行结果 :

---------------------------------------------------------------------------------------------------------------------------------

2. 大小比较:基本原则是 根据字符的ASCII值比较,若ASCII值相同,再比较长度。

    比较方式:int ret=对象1.compareTo(对象2)

    注意:比较时的前后顺序:返回的是对象1-对象2.若前者大返回正值,相等返回0,前者小于后者返回负值。

        String s1="abcd";
        String s2="efgh";
        String s3="abcdefg";
        int ret1=s1.compareTo(s2);
        int ret2=s2.compareTo(s1);
        int ret3=s1.compareTo(s3);
        
        System.out.println(ret1);//1与2比
        System.out.println(ret2);//2与1比
        System.out.println(ret3);//ASCII值同 比长度

运行结果: 

字符串查找

下面的str都指的是字符串

1.按下标查找,返回对应字符:char ch=str.charAt(i)

        String str="ababcabcd";
        // 下标        012345678
        char ch=str.charAt(4);//下标为4的字符是c
        System.out.println(ch);

运行结果:

  引申出遍历:

        String str="ababcabcd";
        for(int i=0;i<str.length();i++){
            System.out.print(str.charAt(i)+" ");
        }

运行结果: 

2.按字符查找,返回对应下标:int ret=str.indexOf('字符')

重载的几个用法:从下标为4的位置开始查找:int ret=str.indexOf('字符',4)

                            查找字符串,返回第一次出现的下标:int ret=str.indexOf("字符串")

        String str="ababcabcd";
        //下标         012345678
        int ret1=str.indexOf('b');
        int ret2=str.indexOf('b',2);
        int ret3=str.indexOf("abc");
        System.out.println(ret1);//返回第一次出现b的下标
        System.out.println(ret2);//从下标为2的地方开始找第一次出现b的下标
        System.out.println(ret3);//返回第一次出现abc的下标

运行结果: 

字符串与其他类转换

1.字符串转成整型/双精度浮点:

int x=Integer.parseInt(str)

double y=Double.parseDouble(str)

2.整型/双精度浮点型转成字符串:

String s=String.valueOf(其他类型数据)

        String str="1234";
        int x=Integer.parseInt(str);
        System.out.println(x);
        
        String s=String.valueOf(12.34);
        System.out.println(s);//此时12.34这个doublde型的 数据 已经转化成 String类的数据

运行结果: 

大小写转换

1.小写转成大写:String s1=str.toUpperCase()

2.大写转成小写:String s2=str.toLowerCase()

        String str="ABCDefgh";
        String s1=str.toLowerCase();
        String s2=str.toUpperCase();
        System.out.println(s1);
        System.out.println(s2);

运行结果: 

格式化输出

格式范例:String str=String.format("%d-%d-%d",2005,1,14);

        String str=String.format("%d-%d-%d",2005,1,14);
        String str1=String.format("%d %d %d",2005,1,14);
        String str2=String.format("%d,%d,%d",2005,1,14);
        String str3=String.format("%d%02d%02d",2005,1,14);//从月份开始的数据不到两位的用0补齐
        System.out.println(str);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);

运行结果: 

拆分

格式:String[] ss=str.split("拆分根据")

解释:拆分根据:取决于亲想根据什么符号来拆分,如str="name=Anna&age=19",我想用"&"来拆分这个字符串,得到两个子字符串:name=Anna和age=19,这时母字符串被分成两组,所以需要字符串类的数组来接收。

若拆分根据是两个呢?如:“&”  "="

两种方式:1.两个循环嵌套

                  2.String[] sss=str.split("  根据1 |  根据2  ") 

        String str="name=张三&age=19";
        String[] ss=str.split("&");
        for (String x:ss) {
            System.out.print(x+" ");
        }
        System.out.println();


        String[] sss=str.split("&|=");
        for (String y:sss) {
            System.out.print(y+" ");
        }
        System.out.println();


        String[] s1=str.split("&");
        for(int i=0;i<s1.length;i++){
            String[] s2=s1[i].split("=");
            for(int j=0;j<s2.length;j++){
                System.out.print(s2[j]+" ");
            }
        

运行结果: 

截取

格式:从下标为i的位置开始截取,直到字符串结束:String s=str.substring(i) 

           重载方法--截取区间,左闭右开:String s=str.substring(2,4)

        String str="abcdefg";
        //下标        0123456
        String s1=str.substring(2);
        System.out.println(s1);
        String s2=str.substring(2,4);
        System.out.println(s2);

运行结果: 

字符或数字判断

现有字符ch

格式:是否是数字:boolean ret=Character.isDigit(ch)

           是否是字符字符:boolean ret=Character.isLetter(ch)

           是否是字符或数字:boolean ret=Character.isLetterOrDigit(ch)

        String str="abc123ef4g5";
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            System.out.print(ch+"是否是数字:"+Character.isDigit(ch)+"/ ");
            System.out.print(ch+"是否是字母:"+Character.isLetter(ch)+"/ ");
            System.out.print(ch+"是否是字母或数字:"+Character.isLetterOrDigit(ch)+"/ ");
            System.out.println();
        }

运行结果: 

小结String:String不是在原有对象基础上直接修改,而是先找个替身,再让修改替身。

而接下来介绍的两个SB就是在原有基础上直接修改--优点是:拼接时效率更高

拼接:String类的:String s1="abc";

                               String s2="def";

                               String s3=s1+s2;

       StringBuilder的:String s1="abc";

                                  String s2="def";

                                  s1.append(s2);

       StringBuffer的:String s1="abc";

                                  String s2="def";

                                  s1.append(s2);

**了解:StringBuilder 与 StringBuffer:

现在已有 StringBuilder sb="abcdefg" 和 StringBuffer sb="abcdefg"

因为他俩有相同的方法,为了简便,以下用SB代替二者:

它们俩能实现直接修改的原因是 底层return this---返回本身

他们俩共有的方法:1.逆置:SB.reverse();

                                2.插入 :SB.insert(i,"haha");--在下标为i的位置插入"haha"

                                3.转化成String:String s=sb.toString();

那么两个SB的区别是什么呢?

当我们查看底层时,发现StringBuffer的底层用synchronized修饰--意思是 在多线程中用于保证安全,相当于门锁。而StringBuilder则没有。

那是不是都用StringBuffer更好呢?其实不是,如果是单线程,相当于在自己家上厕所,频繁上锁开锁会造成资源浪费。此时用StringBuilder更好捏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值