嘚儿驾...

常用类 String

概述

  • 字符串是常量,创建之后,不可改变

  • 字符串字面值存储在字符串池中(方法区),可以共享。

  • String s = "hello"; // 产生一个对象,字符串池中存储。

    String name = "hello";  // "hello"常量存储在字符串常量池中
    name ="张三";  // 此时并没有改变 hello,而是在字符串池中,重新开辟一个空间,hello 被当做垃圾回收
    String name2 = "张三";  // 此时,并没有重新开辟一个空间,而是在字符串常量池中,找 "张三"  存在不?,存在的话,直接指向存在的字符串,这样就实现了,共享
    
    // 当我们修改字符串的时候,不会直接修改,而是在字符串常量池中,重新开辟一个空间,
    // 当我们创建一个字符串的时候,会在字符串常量池中,找 "张三"  存在不?,存在的话,直接指向存在的字符串,这样就实现了,共享,不存在的话,再在字符串常量池中开辟一个空间
    
  • String s = new String("hello"); // 产生两个对象,堆,池,各存储一个

    // 字符串的另一种创建方式  ,  new String();
    String str = new String("人生无常");
    String str2 = new String("人生无常");
    System.out.println(str == str2);   // false
    // String 重写了 equals 方法  ,所以可以得到 我们想要的答案
    
    System.out.println(str.equals(str2));  // true
    

常用方法

  • public int length(); // 返回字符串的长度
  • public char charAt(int index); // 根据下标获取字符
  • public boolean contains(String str); //判断当前字符串中是否包含 str
  • public char[] toCharArray(); // 将字符串转换成数组
  • public int indexOf(String str); // 查找 str 首次出现的下标,存在,则返回该下标;
  • public int lastIndexOf(String str); // 查找字符串在当前字符串中最后一次出现的下标索引
  • public String trim(); // 去掉字符串前后的空格
  • pubic String toUpperCase(); // 将小写转换成大写 toLowerCase();大 转 小
  • public boolean endWith(String str); // 判断字符串是否以 str 结尾
  • public String replace(char oldChar,char newChar); // 将旧字符串替换成新字符串,返回新的字符串
  • public String[] split(String str); // 根据 str 做拆分
    public static void main(String[] args) {


        String name = "hello";  // "hello"常量存储在字符串常量池中
        name = "张三";  // 此时并没有改变 hello,而是在字符串池中,重新开辟一个空间,hello 被当做垃圾回收
        String name2 = "张三";  // 此时,并没有重新开辟一个空间,而是在字符串常量池中,找 "张三"  存在不?,存在的话,直接指向存在的字符串,这样就实现了,共享

        // 当我们修改字符串的时候,不会直接修改,而是在字符串常量池中,开辟一个空间,创建一个字符串的时候,
        // 在字符串常量池中,找 "张三"  存在不?,存在的话,直接指向存在的字符串,这样就实现了,共享


        // 字符串的另一种创建方式  ,  new String();
        String str = new String("人生无常");
        String str2 = new String("人生无常");
        System.out.println(str == str2);   // false
        // String 重写了 equals 方法  ,所以可以得到 我们想要的答案

        System.out.println(str.equals(str2));  // true


        // 字符串方法的使用
        String content = "li人生li无常li";

        // 1. public int length(); `  // 返回字符串的长度
        System.out.println(content.length());  // 空格也算一个字符
        // 2. public char charAt(int index); ` // 根据下标获取字符
        System.out.println(content.charAt(content.length() - 1));  //  返回:常    从 0 开始的,不能超出字符串下标
        // 3. public boolean contains(String str); ` //判断当前字符串中是否包含 str
        System.out.println(content.contains("人"));  // true


        // 4. public char[] toCharArray ();  ` // 将字符串转换成数组

        System.out.println(Arrays.toString(content.toCharArray()));
        // 5. public int indexOf (String str); ` // 查找 str 首次出现的下标,存在,则返回该下标;
        System.out.println(content.indexOf("li"));
        System.out.println(content.indexOf("li", 4));
        // 6. public int lastIndexOf (String str); ` // 查找字符串在当前字符串中最后一次出现的下标索引
        System.out.println(content.lastIndexOf("li"));

        String content2 = "  hello world  ";
        // 7. public String trim();`  // 去掉字符串前后的空格
        System.out.println(content2.trim());

        // 8. pubic String toUpperCase();`  // 将小写转换成大写  ` toLowerCase();`大 转 小
        System.out.println(content2.toLowerCase());
        System.out.println(content2.toUpperCase());

        // 9. public boolean endWith(String str);`  // 判断字符串是否以 str 结尾
        String filename = "hello.java";
        System.out.println(filename.endsWith(".java"));  // 以什么字符串结尾
        System.out.println(filename.startsWith("hello")); // 以什么字符串开始


        // 10 . replace(char oldChar,char newChar); 用新的字符或字符串替换旧的字符或字符串

        System.out.println(content.replace("人生", "黑白"));

        // 11. split(String str);
        String say = "java is the best  programing,java language";
        String[] s = say.split("[ ,]+");  // 以空格 拆分
       // String[] split = say.split("[ ,]"); // 以空格和 , 进行拆分
        //String[] split1 = say.split("[ ,]+");  // 以一个或者多个空格拆分


        System.out.println(s.length);
        for (String s1 : s) {
            System.out.println(s1);
        }

        // 补充两个方法 equals() ,compareTo() ;  比较大小
        String s1 = "hello";
        String s2 = "HELLO";
        System.out.println(s1.equalsIgnoreCase(s2));  // 忽略大小写比较

        String s3 = "abc";
        String s4 = "abc";
        System.out.println(s3.compareTo(s4));  // 0  不同字符串,返回的是差,s3-s4  相同返回0


    }

}

String 常用方法案例

需求:

  • 已知 String str = "this is a text";
  1. 将 str 中的单词单独获取出来
  2. 将 str 中的text 替换为 practice
  3. 在 text 前面插入一个 easy
  4. 将每个单词的首字母改为大写
/*
* 案例
* */
public class Demo02 {

    public static void main(String[] args) {

        String str = "this is a text";

        // 1. 将 str 中的单词单独获取出来
        String[] s = str.split(" ");
        for (String s1 : s) {
            System.out.println(s1);
        }

        // 2. 将 str 中的text 替换为 practice

        System.out.println(str.replace("text", "practice"));

        // 3. 在 text 前面插入一个 easy

        System.out.println(str.replace("text", "easy text"));

        // 4. 将每个单词的首字母改为大写
        for (int i = 0; i < s.length; i++) {
            char first = s[i].charAt(0);

            // 把第一个字符转成大写
            char c = Character.toUpperCase(first);
			// 将 first 和 剩余的字母拼接起来
            System.out.println(c + s[i].substring(1));

        }

        
    }
}

可变长字符串

功能增强类:

  • StringBuffer:可变长字符串,JDK1.0,运行效率慢,线程安全。(正是因为它是安全的,所以它要比 StringBuilder 慢一点,但是还是要比 String 要快一点。)
  • StringBuilder:可变长字符串,JDK5.0,运行效率快,线程不安全。

二者功能完全一样,单线程的情况下,用 stringBuilder 就可以了。

如何使用呢?

/*
 * StringBuilder 和 StringBuffer
 *
 * 和 String 的区别:
 *   (1)效率比 String 高
 *   (2)比 String 节省内存
 * */
public class Demo03 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();

        // 1.append (); 追加
        sb.append("java 语言");
        System.out.println(sb);

        sb.append("java 语言");
        System.out.println(sb);


        // 2 insert(); 追加
        sb.insert(0,"我在最前面,");
        System.out.println(sb);

        // 3 replace(); 替换
        sb.replace(0,5,"hello");
        System.out.println(sb);

        // 4 delete(); 删除
        sb.delete(0,5);
        System.out.println(sb);

        // 清空
        sb.delete(0,sb.length());
        System.out.println(sb);
    }

}

验证 StringBuilder 效率高于 String

/*
* 验证 StringBuilder 效率高于  String
* */
public class Demo04 {

    public static void main(String[] args) {
        // 开始时间
        long start = System.currentTimeMillis();
//        String string = "";
//        for (int i = 0; i < 40000; i++) {
//            string+=i;
//        }
//        System.out.println(string);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 999999; ++i) {
            sb.append(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end-start));  // String 用时:7118 ms   StringBuilder  用时:21


    }
}
posted @   走马!  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示