玩命加载中 . . .

常用类—String类(31)


常用类—String类

String类是不可变类,也就是说String对象声名后,将不可修改

  1. 字符串一旦创建不可再改变,即:”abc”字符一旦创建不可在变成”abcd”
    注意:上面说的不可变,是指字符串不可变,但是引用可以重新指向其他字符串。

  2. 为了提升字符串的访问效率,在程序中使用了“缓存”技术,所以在Java中所有使用”双引号”
    括起来的字符串命令都会在”字符串常量池”中创建一份,字符串常量池在方法区中被存储。

  3. 使用String的时候我们应该注意的问题:尽量不要做字符串频繁的拼接操作,因为字符串一且创建不可改变,只要频繁拼接,就会在字符串常量池中创建大量的字符串对象,给垃圾回收带来问题。

    示例代码:

            String a1="abc";
            String a2="abc";
            System.out.println(a1==a2);
            // 以上判断==>true,但是字符类型不推荐以上判断因为遇到以下判断就不是true了;
            String a3 = new String("aaa");
            String a4 = new String("aaa");
            System.out.println(a3==a4);
            // 以上方法==>false,因为一旦创建对象后,引用对象地址指向了不同的内存地址所以不存在
            System.out.println("equals()方法判断==>"+a3.equals(a4));
            // 字符串常量池
            String b1="abc";
            String b2="cba";
            // b1首先会去字符串常量池中搜索是否存在abc,然后如果没有会在字符常量符中存储
            // b2首先会去字符串常量池中搜索是否存在abc,因为存在所以直接提取使用
            System.out.println(b1+b2);
            // 一般不推荐以上方法,因为字符串连接会大大降低字符串的"缓存"技术,因为因为字符串           // 一且创建不可改变,只要频繁拼接,就会在字符串常量池中创建大量的字符串对象,给垃
            //圾回收带来问题。
    
  4. 以下代码会创建几个对象:

        String b1 = new String("abcv");
        String b2 = new String("abcv");
    

    答:以上对象总共创建了三个对象,方法区字符串常用池:1个;堆内存: 2个

  5. String构造方法

            // 字符串常用构造方法
            // 1.
            String a1 = "abc";
            // 2.
            String a2 = new String("def");
            // 3.
            byte[] bytes = {97,98,99,100};
            String a3 = new String(bytes); // 将字符类型转换成阿斯克码值
            System.out.println(a3); // ==>abcd
            // 4.
            String a4 = new String(bytes,1,2); // ==>bc
            System.out.println(a4);
            // 5.
            char[] c1 = {'我','是','中','国','人'};
            String a5 = new String(c1);
            System.out.println(a5);
            // 6.
            String a6 = new String(c1,2,3);
            System.out.println(a6);
    
  6. 字符串常用方法

            // String常用方法
            // 1. charAt(int index) 返回指定索引处的 char值。
            String q1 = "我是中国人";
            char q2 = q1.charAt(2);
            System.out.println(q2); // ==> 中
            // 2. endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
            System.out.println("ClassStringTest04.java".endsWith("java")); // ==> true
            System.out.println("ClassStringTest04.java".endsWith(".java")); // ==> true
            System.out.println("ClassStringTest04.java".endsWith(".java ")); // ==> false
            // 3. indexOf(String str) 返回指定子字符串第一次出现的字符串中的索引。
            System.out.println("abcJava".indexOf("J")); // ==> 3
            // 4. equalsIgnoreCase(String anotherString) 将此String与另一个String比较,忽略了大小写。 如果两个字符串具有相同的长度并且两个字符串中的相应字符等于忽略大小写,则认为它们是相等的忽略大小写。
            System.out.println("ABc".equalsIgnoreCase("ABC")); // ==》 true
            // 5.  getBytes(String charsetName) 使用命名的字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
            byte[] q4 = "abcd".getBytes();
            for (int i = 0; i < q4.length; i++) {
                System.out.println(q4[i]);  //返回阿斯克码值:97 98 99 100
            }
            // 6. indexOf(int ch) 返回指定字符第一次出现的字符串中的索引。
            System.out.println("java.ClassTest.java".indexOf("java")); // ==> 0
            // 7. lastIndexOf(int ch, int fromIndex) 返回指定字符最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
            System.out.println("java.ClassTest.java".lastIndexOf("j", 17)); // ==> 15
            // 8.  length() 返回此字符串的长度。
            // 注意:数组的length是属性,而字符类型的length()是方法
            System.out.println("qwr".length()); // ==>3
            // 9. replaceAll(String regex, String replacement) 将给定替换的给定 regular expression匹配的此字符串的每个子字符串替换。
            System.out.println("java.Class.Test.Animal.java".replaceAll("java", "qwe")); // ==> qwe.Class.Test.Animal.qwe
            // 10. split(String regex, int limit)
            String myTime = "2002,03,09";
            String[] myTime2 = myTime.split(",");
            for (int i = 0; i < myTime2.length; i++) {
                System.out.println(myTime2[i]); // 2002 03 09
            }
    // 11. startsWith(String prefix) 测试此字符串是否以指定的前缀开头。
            System.out.println("/abc/efg/hij/".startsWith("/")); // ==》 true
            // 12.  substring(int beginIndex) 返回一个字符串,该字符串是此字符串的子字符串。
            System.out.println("abc//efg/hij/".substring(4)); // ==> /efg/hij/
            System.out.println("abc//efg/hij/".substring(5,8)); // ==> efg
            //13. toCharArray() 将此字符串转换为新的字符数组。
            char[] c2 = "abcd".toCharArray();
            for (int i = 0; i < c2.length; i++) {
                System.out.println(c2[i]);  // ==> abcd
            }
            // 14. toUpperCase() 使用默认语言环境的规则将此 String所有字符转换为大写。
            System.out.println("abc".toUpperCase());    // ==> ABC
            // 15. toLowerCase() 使用默认语言环境的规则将此 String所有字符转换为小写。
            System.out.println("ABC".toLowerCase());    // ==> abc
            // 16.  trim() 返回一个字符串,其值为此字符串,删除了所有前导和尾随空格,其中space被定义为其代码点小于或等于 'U+0020' (空格字符)的任何字符。
            System.out.println("    a   b   c     ".trim());
            // 17. valueOf(Object obj) 返回 Object参数的字符串表示形式。
            Object o1 = new Object();
            System.out.println(String.valueOf(o1)); // java.lang.Object@3b6eb2ec内存地址
            Object o2 = null;
            // 以下输出会不会报空指针异常?
            System.out.println(o2); // 不会,因为并不是直接调用 tostring方法, string. valueof( Object)这个方法对空值进行处理了
            System.out.println(String.valueOf(o2)); // ==》 null
            // System.out.println(o2.toString()); // 会出现空指针异常:NullPointerException
    

文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
  目录