美文网首页java学习
3.2 认识 Java 中的字符串(常用工具类)

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

作者: 夏沫xx | 来源:发表于2016-09-25 13:18 被阅读0次

    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 要高

    相关文章

      网友评论

        本文标题:3.2 认识 Java 中的字符串(常用工具类)

        本文链接:https://www.haomeiwen.com/subject/bpjuettx.html