Java---String类

String 类的理解和创建对象

1)String 对象用于保存字符串,也就是一组字符序列

2)字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"luck"等

3)字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节

4)String 类较常用构造方法(其他看手册):

  • String s1 = new String(); //
  • String s2 = new String(String original);
  • String s3 = new String(char[] a);
  • String s4 = new String(char[] a,int startIndex,int count)
java 复制代码
package com.heima.Hello.String_;

public class String01 {
    public static void main(String[] args) {
        /*
        1.String 对象用于保存字符串,也就是一组字符序列
        2.字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"luck"等
        3.字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
        4.String 类较常用构造方法(其他看手册):
        String s1 = new String(); //
        String s2 = new String(String original);
        String s3 = new String(char[] a);
        String s4 = new String(char[] a,int startIndex,int count)
        String s5 = new String(byte[] b)
        5.String 类实现了接口 Serializable [String 可以串行化: 可以在网络传输]
                        接口 Comparable [String 对象可以比较大小]
        6.String 是 final类,不能被其他的类继承
        7.String 有属性 private final char value[]; 用于存放字符串内容
        8.一定要注意: value 是一个final类型,不可以修改(需要功力):
                                         即value不能指向新的地址,但是单个字符内容是可以变化的
         */
        String name = "jack";
        name = "Tom";

        final char[] value ={'a','b','c'};
        char[] v2 = {'t','o','m'};
        value[0] = 'H'; // 单独的修改不会报错
        // value = v2;  不可以修改 value 地址

    }
}

两种创建 String 对象的区别

方式一:直接赋值 String s = "edu";

先从常量池查看是否有"edu"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s 最终指向的是常量池的空间地址

方式二:调用构造器 String s2 = new String("edu");

先在堆中创建空间,里面维护了value属性,指向常量池的edu空间。如果常量池没有"edu",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。

字符串的特性

1)String是一个 final 类,代表不可变的字符序列

2)字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的

以上语句创建了两个对象,首先创建了一个 "hello" 对象,运行第二条语句时,会看常量池是否有 "haha",没有则会创建,指向hello的 s1 指向haha

只创建了一个对象,String a = "hello" + "abc"; // ==> 优化等价 String a = "helloabc";编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向

java 复制代码
package com.heima.Hello.String_;

public class StringExercise01 {
    public static void main(String[] args) {
        String a = "hello";  // 创建 a 对象
        String b = "abc";    // 创建 b 对象
        String c = a + b;
        // 解读
        //1. 先创建一个 StringBuilder sb = StringBilider()
        //2. 执行 sb.append("hello")
        //3. sb.append("abc")
        //4. String c = sb.toString()
        //最后其实是 c 指向堆中的对象(String) value[] -> 池中 "helloabc"
    }
}

答:一共有三个对象

String类的常见方法

说明

String类是保存字符串常量的。每次更新都需要重新开辟空间,效率极低,因此,java设计者还提供了 StringBuilder 和 StringBuffer 来增强String的功能,并提高效率。

常用方法举例

equals // 区分大小写,判断内容是否相等

java 复制代码
package com.heima.Hello.String_;

public class StringMethod01 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "Hello";
        System.out.println(s1.equals(s2)); // 运行结果为 false ,说明区分大小写
    }
}

equalsgnoreCase //忽略大小写的判断内容是否相等

java 复制代码
package com.heima.Hello.String_;

public class StringMethod01 {
    public static void main(String[] args) {
        // 忽略大小写的判断内容是否相等
        String username = "john";
        if ("John".equalsIgnoreCase(username)) {
            System.out.println("Success");
        } else {
            System.out.println("Fail");
        }
    }
}

length //获取字符的个数,字符串的长度

java 复制代码
package com.heima.Hello.String_;

public class StringMethod01 {
    public static void main(String[] args) {
        String str1 = "abcdefg";
        System.out.println(str1.length()); // 返回字符串长度
        
    }
}

indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回 -1

java 复制代码
package com.heima.Hello.String_;

public class StringMethod01 {
    public static void main(String[] args) {
        // 忽略大小写的判断内容是否相等
        String str1 = "abcdefg";
        System.out.println(str1.length()); // 返回字符串长度

    }
}

lastIndexOf //获取字符在字符串中最后一次出现的索引,索引从0开始,如找不到,返回 -1

java 复制代码
package com.heima.Hello.String_;

public class StringMethod01 {
    public static void main(String[] args) {
        String s2 = "wer@ter@gmail@2";
        int index = s2.lastIndexOf('@');
        System.out.println("字符@在字符中最后一次出现的索引位置: " + index);
    }
}

substring //截取指定范围的字串

java 复制代码
package com.heima.Hello.String_;

public class StringMethod01 {
    public static void main(String[] args) {
        String name = "hello,张三";
        System.out.println(name.substring(6));// 截取后面的字符
        System.out.println(name.substring(0,5)); // 从索引0开始,截取到索引为5的位置,不包括5
    }
}

trim // 去前后空格

charAt //获取某索引处的字符,注意不能使用 Str[index] 这种方式

例:String str = "hello" //要取其中的字符 "h"

// String[0] 这种方式不对

// str.charAt(0) => h 这种方式才对

toUpperCase // 转换成大写,如果字符里本身就有大写字符,还是保持大写

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        String s = "hello";
        System.out.println(s.toUpperCase()); // HELLO
    }
}

toLowerCase // 转换成小写,如果字符里本身就有小写字符,还是保持小写

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        String s = "HELLO";
        System.out.println(s.toLowerCase()); // hello
    }
}

concat // 拼接字符串

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        String s1 = "宝玉";
        s1 = s1.concat("林黛玉").concat("薛宝钗").concat("together");
        System.out.println(s1);
    }
}

replace // 替换字符串中的字串(s1.replace() 方法执行后,返回的结果才是替换过的,注意:对s1没有任何影响,下面示例代码有影响是因为又用s1接收了一下)

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        String s1 = "宝玉 and 林黛玉 林黛玉 林黛玉";
        s1 = s1.replace("林黛玉","薛宝钗"); // 把原来字符串里的"林黛玉"替换为"薛宝钗"
        System.out.println(s1); // 结果: 宝玉 and 薛宝钗 薛宝钗 薛宝钗
    }
}

split // 分割字符串,对于某些分割字符,我们需要转义,比如 | \\ 等

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        String poem1 = "锄禾日当午,汗滴禾下土,谁之盘中餐,粒粒皆辛苦";
        String poem2 = "E:\\aaa\\bbb";
        // 1.以,为标准对poem进行分割,返回一个数组
        // 2.在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
        String[] split = poem1.split(",");
        System.out.println("===分割后的诗句===");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }
        System.out.println("========================");
        String[] split2 = poem2.split("\\\\"); // \ 前加一个 转义字符 \ ,才能表示 \
        for (int j = 0; j < split2.length; j++) {
            System.out.println(split2[j]);
        }
    }
}

compareTo // 比较两个字符串的大小

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        // compareTo 比较两个字符串的大小,如果前者大
        // 则返回正数,后者大,则返回负数,如果相等,返回0
        String a = "jcck";
        String b = "jack";
        System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2 的值
    }
}

toCharArray // 转换成字符数组

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        // compareTo 比较两个字符串的大小,如果前者大
        // 则返回正数,后者大,则返回负数,如果相等,返回0
        // (1) 如果长度相同,并且每个字符也相同,就返回 0
        // (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
        //   就返回 if (c1 != c2) {
        //              return c1 - c2;
        //   }
        // (3) 如果前面的部分都相同,就返回 str1 - str2
        String a = "jcck";
        String b = "jack";
        System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2 的值
    }
}

format // 格式字符串,%s 字符串 %c字符串 %d 整型 %.2f 浮点型

java 复制代码
package com.heima.Hello.String_;

public class StringMethod02 {
    public static void main(String[] args) {
        String name = "Henry";
        int age = 22;
        double score = 95.5;
        char gender = '男';
        // 将所有的信息都拼接在一个字符串
        String info =
                "我的姓名是" + name + ",年龄是" + ",成绩是" + score + ",性别是" + gender + "。希望大家喜欢我!";
        System.out.println(info);
        // 1. %s , %d , %.2f , %c 称为占位符
        // 2. 这些占位符由后面变量来替换
        // 3. %s 表示后面由字符串来替换
        // 4. %d 是整数来替换
        // 5. %.2f 表示使用小数来替换,替换后,只会保留小数点后两位,并且进行四舍五入的处理
        // 6. %c 使用char 类型来替换
        String formatStr = "我的姓名是%s 年龄是%d, 成绩是%.2f 性别是%c。希望大家喜欢我!";
        
        String info2 = String.format(formatStr, name, age, score, gender);

        System.out.println("info2 = " + info2);

    }
}
相关推荐
nexttake3 小时前
5.go-zero集成gorm 和 go-redis
开发语言·后端·golang
我叫张土豆3 小时前
Neo4j 版本选型与 Java 技术栈深度解析:Spring Data Neo4j vs Java Driver,如何抉择?
java·人工智能·spring·neo4j
lang201509284 小时前
Spring环境配置与属性管理完全指南
java·python·spring
lang201509284 小时前
Spring Bean作用域全解析
java·后端·spring
忧郁的橙子.4 小时前
IntelliJ IDEA 2023中为 Spring Boot 项目添加注释模板
java·spring boot·intellij-idea
秋千码途4 小时前
Spring的@Cacheable取缓存默认实现
java·spring·缓存
聆风吟º4 小时前
【Spring Boot 报错已解决】别让端口配置卡壳!Spring Boot “Binding to target failed” 报错解决思路
android·java·spring boot
VBA63374 小时前
VBA技术资料MF383:处理Excel中存储为文本的数据
开发语言
CiLerLinux4 小时前
第三章 FreeRTOS 任务相关 API 函数
开发语言·单片机·物联网·c#