String常用方法和可变字符串StringBuffer and StringBuilder

String

  • 字符串是常亮,创建之后不可改变。
  • 字符串字面值储存在字符串池中,可以共享。
  • String s = “Hello”;产生一个对象,字符串池中储存
  • String s = new String(“Hello”);//产生两个对象,堆、池各储存一个。
String name = "zhangsan";
name = "李四";

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnL7Y3ka-1608465936067)(D:\学习\tupian\String\swt.png)]

  1. 以上,我们给一个String类型赋值,在字符串池中就会生成一个值。这时我们再给同一个String类型赋另一个值“李四”。

    刚才的“zhangsan”并不会从字符串池中消失,而是在字符串池中新建一个“李四”。

    栈中的String类型就会断开对“zhangsan”的连接转而连接“李四”。

    如果再次给这个String类型赋值“zhangsan”的话,会现在字符串池中判断有没有这个值,有就连接,没有就新建。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AxtwKvme-1608465936074)(D:\学习\tupian\String\swt2.png)]

  1. 通过上图看代码我们发现两个String类型的值是一样的,在字符串池中也不会创建两个”王五“,相对比的输出结果却是false。

    那是因为new出来的对象是指向堆的,每new一下堆都会创建一个对象,他们的地址不同,“==”对比的是地址而不是值,所以才会输出false。

    所以字符串类型对比我们一般使用“equals”来对比值。

常用方法

  • public int length(); 返回字符串的长度。

  • public char charAt(int index); 根据下标获取字符。

  • public boolean contains(String str); 判断当前字符串中是否包含str。

  • public char[] toCharArray(); 将字符串转换成数组。

  • public int indexOf(String str); 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1.

  • public int lastIndexOf(String str); 查找字符串在当前字符串中最后一次出现的下标索引。

  • public String trim(); 去掉字符串前后的空格。

  • public String toUpperCase(); 将小写转成大写

  • public boolean endWith(String str); 判断字符串是否以str结尾

  • public String replace(char oldChar,char newChar); 将旧字符串替换成新字符串

  • public String[] split(String str); 根据str做拆分,假设:是按 “!”拆分,如果 “!”有多个,那么就在中括号后加“+”号。

  • compareTo(); 比较大小

  • 实例:

    String name = "zhangsan";
            name = "李四";
    
            String n1 = new String("王五");
            String n2 = new String("王五");
            System.out.println(n1==n2);// 输出false
            System.out.println(n1.equals(n2));
    
            System.out.println("------------------------------");
    
    // public int length(); 返回字符串的长度。
    // public char charAt(int index); 根据下标获取字符。
    // public boolean contains(String str); 判断当前字符串中是否包含str。
            String contents = "One Piece;One Piece;One Piece";
            System.out.println(contents.length());// 返回字符串的长度
            System.out.println(contents.charAt(0));// 根据下标位置返回值 第一位
            System.out.println(contents.charAt(contents.length()-1));// 最后一位
            System.out.println(contents.contains("O"));// 查看字符串中有没有这个值
    
    // public char[] toCharArray(); 将字符串转换成数组。
    // public int indexOf(String str); 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1.
    // public int lastIndexOf(String str); 查找字符串在当前字符串中最后一次出现的下标索引。
            System.out.println(Arrays.toString(contents.toCharArray()));// 将字符串转换成数组
            System.out.println(contents.indexOf("One"));// 寻找字符第一次出现的位置
            System.out.println(contents.indexOf("One",3)); // 从下标第几位找字符第一次出现的位置
            System.out.println(contents.lastIndexOf("One"));// 寻找字符最后出现的位置
    
    // public String trim(); 去掉字符串前后的空格。
    // public String toUpperCase(); 将小写转成大写 toLowerCase() 将大写转换为小写
    // public boolean endsWith(String str); 判断字符串是否以str结尾 startsWith(String str)判断字符串是否以str开头
            String cont = " Hello World ";
            System.out.println(cont.trim());// 去掉字符串前后的空格
            System.out.println(cont.toUpperCase());// 将小写转成大写
            System.out.println(cont.toLowerCase());// 将大写转换为小写
    
            String wj = "java.jpg";
            System.out.println(wj.endsWith("jpg"));// 判断字符串是否以str结尾
            System.out.println(wj.startsWith("java"));// 判断字符串是否以str开头
    
            System.out.println("===========replace替换=============");
    
            String con = "罗小黑战记";
            System.out.println(con.replace("黑","白"));
    
            System.out.println("===========split根据……分割=============");
            String str = "你是 谁啊? 哈哈 想起来了。。。嗯!好";
            String[] s = str.split("[ ?。!]+"); // split分割出是数组类型 所以要用数组类型接收
    
            for (String s1:// 遍历 s 数组
                 s) {
         
                System.out.println(s1);
            }
    
            System.out.println("===========compareTo()比较大小=============");
            String ch1 = "abc";
            String ch2 = "xyz";
            System.out.println(ch1.compareTo(ch2));// compareTo比较大小只比较第一位 输出 -23
            String ch3 = "abc";
            String ch4 = "axy";
            System.out.println(ch3.compareTo(ch4));// 如果第一位相同就比较第二位的大小 输出 -23
            String ch6 = "abc";
            String ch7 = "abcxyzzz";
            System.out.println(ch6.compareTo(ch7));// 如果只是这种情况,那么比的就是字符串的长度大小 输出 -5
    
            // equalsIgnoreCase 除去大小写比值
            String r1 = "abc";
            String r2 = "ABC";
            System.out.println(r1.equalsIgnoreCase(r2));
    
    

小题

  • 需求:

    • 已知String str = “this is a text”;
    • 1.将str中的单词单独获取出来
    • 2.将str中的text替换为practice
    • 3.在text前面插入一个easy
    • 4.将每个单词的首字母改为大写
    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 c = s[i].charAt(0);
    
                char c1 = Character.toUpperCase(c);
                String news = c1+s[i].substring(1);
                System.out.println(news);
    
            }
    

可变字符串

  • StringBuffer:可变长的字符串,JDK1.0提供,运行效率慢、线程安全。

  • StringBuilder:可变长字符串,JDK1.5提供,运行效率快、线程不安全。,

  • 实例:

    // StringBuilder和StringBuffer的用法一样,只不过StringBuilder更快,StringBuffer安全
            // 单线程推荐StringBuilder
            StringBuffer sb = new StringBuffer();
    
            // 在字符串的最后追加字符串
            sb.append("来日方长");
            System.out.println(sb.toString());
            sb.append(",何惧车遥马慢");
            System.out.println(sb.toString());
            // 在下标0添加字符串
            sb.insert(0,"呵呵");
            System.out.println(sb.toString());
            // 替换下标0-2的字符串
            sb.replace(0,2,"笑谈:");
            System.out.println(sb.toString());
            // 删除下标0-3的字符串
            sb.delete(0,3);
            System.out.println(sb.toString());
            // 删除所有
            sb.delete(0,sb.length());
            System.out.ntln(sb.length());[]
    
张贴在2