3.2 认识 Java 中的字符串(常用工具类)

1、什么是 Java 中的字符串

在程序开发中字符串无处不在,如用户登陆时输入的用户名、密码等使用的就是字符串。其实,在前面的章节中我们就已经使用了字符串,例如我们在控制台中输出的 "Hello World" 、 "imooc" 、"爱慕课"等。

在 Java 中,字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中。默认情况下,该包被自动导入所有的程序。

创建 String 对象的方法:

String s1="imooc";  //创建一个字符串对象imooc,名为s1
String s2=new String();//创建一个空字符串对象,名为2
String s3=new String("imooc");//创建一个字符串对象imooc,名为s3

2、Java 中字符串的不变性

String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。如下所示:

String s1="爱慕课";  
String s2="爱慕课"; 
String s3=new String("爱慕课");
String s4=new String("爱慕课");
//多次出现的字符常量,Java编译程序只创建一个,所以返回true
System.out.println(s1==s2);
//s1和s3是不同的对象,所以返回false
System.out.println(s1==s3);
//s3和s4是不同的对象,所以返回false
System.out.println(s3==s4);
s1="欢迎来到:"+s1;
//字符串s1被修改,指向新的内存空间
System.out.println(s1);

结果
true
false
false
欢迎来到:爱慕课

结合上面的代码,关于字符串小伙伴们必须需要了解滴:
1、 通过 String s1="爱慕课"; 声明了一个字符串对象, s1 存放了到字符串对象的引用,在内存中的存放引用关系如下图所示:
s1------->(爱慕课)堆内存
然后通过 s1="欢迎来到:"+s1; 改变了字符串 s1 ,其实质是创建了新的字符串对象,变量 s1 指向了新创建的字符串对象,如下图所示:
s1-------->(欢迎来到:爱慕课)堆内存(爱慕课)
2、 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder(后面章节中会讲到)。

3、 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法(前面条件运算符章节讲过哦~~)

public class HelloWorld {
    public static void main(String[] args) {
        String s1 = "imooc";
        String s2 = "imooc";
        
        //定义字符串s3,保存“I love”和s1拼接后的内容
         String s3 = "I love " + s1;
        
        // 比较字符串s1和s2
        // imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
        System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
        
        //比较字符串s1和s3
        System.out.println("s1和s3内存地址相同吗?" + (s1 == s3)                 );

        String s4 = "I love " + s1;
         //比较字符串s4和s3
        // s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
        System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
    }
}

3、Java 中 String 类的常用方法 Ⅰ

String 类提供了许多用来处理字符串的方法,例如,获取字符串长度、对字符串进行截取、将字符串转换为大写或小写、字符串分割等,下面我们就来领略它的强大之处吧。

String 类的常用方法:

方法 说明
int length() 返回当前字符串长度
int indexOf(int ch) 查找ch字符在该字符串中第一次出现的位置
int indexOf(String str) 查找str字符在该字符串中第一次出现的位置
int lastIndexOf(int ch) 查找ch字符在该字符串中最后一次出现的位置
int lastIndexOf(String str) 查找str字符在该字符串中最后一次出现的位置
String substring(int beginIndex) 获取从beginIndex位置开始到结束的子字符串
String substring(int beginIndex,int endIndex) 获取从beginIndex位置开始到endIndex位置的子字符串
String trim() 返回去除了前后空格的字符串
boolean equals(Object obj 将该字符串与指定对象比较,返回true或false
String toLowerCase() 将字符串转换为小写
String toUpperCase() 将字符串转换为大写
char charAt(int index) 获取字符串中指定位置的字符
String[] aplit(String regex,int limit) 将字符串分割为子字符串,返回字符串数组
byte[] getBytes() 将该字符串转换为byte数组

结合代码来熟悉一下方法的使用:

import java.util.Arrays;

public class en {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //定义一个字符串"学习 Java 编程"
        String str="学习 Java 编程";
        //打印出字符串长度
        System.out.println("字符串长度:"+str.length());
        //查找字符“编”的位置
        char c='编';
        System.out.println("字符'编'的位置:"+str.indexOf(c));
        //查找子字符串'Java'的位置
        System.out.println("字符'编'的位置:"+str.indexOf("Java"));
        //查找子字符串"imooc"的位置,如果找不到返回-1
        System.out.println("字符'编'的位置:"+str.indexOf("imooc"));
        //按空格吧字符拆分成一个数组,并输出数组元素
        String[] arr=str.split("");
        System.out.println("按空格拆分成数组:"+Arrays.toString(arr));
        System.out.println();
        //获取索引位置[3,7)之间的子串
        System.out.println("获取位置[3,7)之间的子串:"+str.substring(3,7));
    }
}


字符串长度:10
字符'编'的位置:8
字符'编'的位置:3
字符'编'的位置:-1
按空格拆分成数组:[学, 习,  , J, a, v, a,  , 编, 程]

获取位置[3,7)之间的子串:Java

友情提示:

  1. 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1
  2. 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引;如果没有匹配结果,返回 -1
  3. 使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符
    针对如此繁杂的方法,推荐大家一个学习技巧:好记性不如烂笔头!多看的同时一定要多敲哦~~
public class en {
     public static void main(String[] args) {
            // Java文件名
            String fileName = "HelloWorld.java"; 
            // 邮箱
            String email = "laurenyang@imooc.com";
            
            // 判断.java文件名是否正确:合法的文件名应该以.java结尾
            /*
            参考步骤:
            1、获取文件名中最后一次出现"."号的位置
            2、根据"."号的位置,获取文件的后缀
            3、判断"."号位置及文件后缀名
            */
            //获取文件名中最后一次出现"."号的位置
            int index =fileName.indexOf("."); 
            
            // 获取文件的后缀
            String prefix =fileName.substring(index+1,fileName.length());
            
            // 判断必须包含"."号,且不能出现在首位,同时后缀名为"java"
            if (  index>0&&  prefix.equals(".java") ) {
                System.out.println("Java文件名正确");
            } else {
                System.out.println("Java文件名无效");
            }

            // 判断邮箱格式是否正确:合法的邮箱名中至少要包含"@", 并且"@"是在"."之前
             /*
            参考步骤:
            1、获取文件名中"@"符号的位置
            2、获取邮箱中"."号的位置
            3、判断必须包含"@"符号,且"@"必须在"."之前
            */
            // 获取邮箱中"@"符号的位置
            int index2 =email.indexOf('@'); 
            
            // 获取邮箱中"."号的位置
            int index3 = email.indexOf('.');
            
            // 判断必须包含"@"符号,且"@"必须在"."之前
            if (index2 != -1 && index3 > index2) {
                System.out.println("邮箱格式正确");
            } else {
                System.out.println("邮箱格式无效");
            }
        }
    }

4、Java 中的 String 类常用方法 Ⅱ

我们继续来看 String 类常用的方法,如下代码所示:

public class en {
     public static void main(String[] args) {
         //定义一个字符串“学习 Java 编程”
         String str ="学习 Java 编程";
         //将字符串转换为小写
         System.out.println("转换为小写:"+str.toLowerCase());
         //获取索引位置为1的字符
         System.out.println("获取索引为1位置的字符:"+str.charAt(1));
         //将字符串转换为byte[],并打印输出
         byte[] b=str.getBytes();
         System.out.println("转换为字节数组:");
         for(int i=0;i<b.length ;i++){
             System.out.print(b[i]+"");
         }
         System.out.println();
         //和另外一个字符串“学习 Java 编程”进行性比较
         String str2=new String("学习 Java 编程");
         System.out.println("str和str2的内存地址相同?"+(str==str2));
         System.out.println("str和str2的内容相同?"+str.equals(str2));
       }
        }

 转换为小写:学习 java 编程
获取索引为1位置的字符:习
转换为字节数组:
-47-89-49-803274971189732-79-32-77-52
str和str2的内存地址相同?false
str和str2的内容相同?true

那么,“==” 和 equals() 有什么区别呢?
==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象
equals(): 比较存储在两个字符串对象中的内容是否一致
PS:字节是计算机存储信息的基本单位,1 个字节等于 8 位gbk 编码中 1 个汉字字符存储需要 2 个字节1 个英文字符存储需要 1 个字节。所以我们看到上面的程序运行结果中,每个汉字对应两个字节值,如“学”对应 “-47 -89” ,而英文字母 “J” 对应 “74” 。同时,我们还发现汉字对应的字节值为负数,原因在于每个字节是 8 位,最大值不能超过 127,而汉字转换为字节后超过 127,如果超过就会溢出,以负数的形式显示。(关于编码,我们在后面课程中会详细介绍,小小期待哦~~)

第一种
public class en {
    public static void main(String[] args) {
        // 定义一个字符串
        String s = "aljlkdsflkjsadjfklhasdkjlflkajdflwoiudsafhaasdasd";
        
        // 出现次数
        int num = 0;
        
         // 循环遍历每个字符,判断是否是字符 a ,如果是,累加次数
        for (int i=0;i<s.length();i++)
        {
            // 获取每个字符,判断是否是字符a
            if ( s.charAt(i)=='a' ) {
                // 累加统计次数
                num++; 
            }
        }
        System.out.println("字符a出现的次数:" + num);
    }
}
第二种
public class en {
    public static void main(String[] args) {
        // 定义一个字符串
        String s = "aljlkdsflkjsadjfklhasdkjlflkajdflwoiudsafhaasdasd";
        
        // 出现次数
        int num = 0;
        
         // 循环遍历每个字符,判断是否是字符 a ,如果是,累加次数
        for (byte bt:(s.getBytes()))
        {
            // 获取每个字符,判断是否是字符a
            if (bt == 'a') {
                // 累加统计次数
                num++; 
            }
        }
        System.out.println("字符a出现的次数:" + num);
    }
}

结果:字符a出现的次数:8

5、认识 Java 中的 StringBuilder 类

在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢?

String 类具有是不可变性。如

 String str="hello";
 System.out.println(str+"world");
 System.out.println(str);

从运行结果中我们可以看到,程序运行时会额外创建一个对象,保存 "helloworld"。当频繁操作字符串时,就会额外产生很多临时变量。使用 StringBuilder 或 StringBuffer 就可以避免这个问题。至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。

那么如何定义 StringBuilder 类的对象呢? 我们来看下面的代码:

 StringBuilder str1=new StringBuilder();
 StringBuilder str2=new StringBuilder("imooc");
 System.out.println(str2);

6、Java 中的 StringBuilder 类的常用方法

StringBuilder 类提供了很多方法来操作字符串:

方法 说明
StringBuilder append(参数) 追加内容到当前StringBuilder对象的末尾
StringBuilder insert(位置,参数) 将内容插入到StringBuilder对象的指定位置
String toString() 将StringBuilder对象转换为String对象
int length() 获取字符串的长度

例如:在下面的示例代码中,创建了 StringBuilder 对象,用来存储字符串,并对其做了追加和插入操作。这些操作修改了 str 对象的值,而没有创建新的对象,这就是 StringBuilder 和 String 最大的区别。

public class en {
    public static void main(String[] args) {
        //创建StringBuilder对象,存储字符串
        StringBuilder str=new StringBuilder("hello");
        str.append(" imooc");//在字符串后面追加字符串
        str.append(520);//在字符串后面追加整数
        System.out.println("字符串长度:"+str.length());//字符串长度
        System.out.println("插入前:"+str);
        str.insert(11, "!");//在指定位置插入内容
        String str2=str.toString();//转换为String对象
        System.out.println("插入后:"+str2);
    }
}
public class HelloWorld {
    public static void main(String[] args) {
        // 创建一个空的StringBuilder对象
        StringBuilder str=new StringBuilder();
        
        // 追加字符串
        str.append("jaewkjldfxmopzdm");
        
        // 从后往前每隔三位插入逗号
        for(int i = str.length()-3; i >=0 ; i=i-3){
         str.insert(i,",");   
        }
        
        // 将StringBuilder对象转换为String对象并输出
        System.out.print(str.toString());
    }
}

结果:j,aew,kjl,dfx,mop,zdm

在需要频繁对字符串进行修改操作时使用 StringBuilder 的效率比 String 要高

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 1,245评论 0 4
  • java中String的常用方法 1、length()字符串的长度 例:char chars[]={'a','b'...
    赤赤有名阅读 2,027评论 0 10
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,071评论 0 62
  • 昨晚全程关注<凤凰卫视>“世界因你而美丽2016-2017影响世界华人盛典”的直播,感叹于这家卫视传媒11年的坚持...
    天涯明月v阅读 292评论 0 0