8. Java字符串

Java —— String字符串

            • 1. Java的API类库
            • 2. String常见API
            • 3. StringBuilder

1. Java的API类库
APl类库:API(Application Programming Interface,应用程序编程接口)就是一些已写好、可供直接调用的功能(在Java语言中,这些功能以类的形式封装)
举例:字符串操作、集合操作、文件操作、输入输出操作、网络操作、多线程等
JDK类库划分:按照包结构划分(不同功能的类划分在不同的包中)
  • 为了便于使用和维护,JDK类库按照包结构划分,不同功能的类划分在不同的包中
功能
java.lang 基础类(字符串、多线程等),使用频率高,不需要import
java.util 工具类(集合、随机数产生器、日历等)
java.io 文件操作、输入/输出
java.net 网络操作
java.math 数学运算相关操作
java.security 安全相关操作
java.sql
java.text 处理文字、日期、数字、信息的格式

文档注释
    形式:/** 开始,以*/结束
位置:加在类和方法的开头
作用:1. 说明作者,时间,版本,要实现功能的详细描述等信息
   2. 通过javadoc工具,可以轻松的将此注释转换为HTML文档说明
   3. 专门用于生成供API使用者进行参考的文档资料
8. Java字符串_第1张图片
8. Java字符串_第2张图片

2. String常见API
java.lang.String:用final修饰,不能被继承
特性:字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值
编码方式:Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码
String常量池:字符串常量池(String Constant Pool)是Java中的一个特殊存储区域,用于存储字符串常量
    作用:提高字符串的重复利用率,节省内存空间,并提高程序的执行效率
    Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串;对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象。
内存编码及长度:String在内存中采用Unicode编码,每个字符占用两个字节;任何一个字符(无论中文还是英文)都算1个字符长度,占用两个字节

length():返回字符串的长度

String str = "Hello, World!";
int length = str.length();  
// 13

trim():去除字符串两端的空格

String str = "   Hello, World!   ";
String trimmedStr = str.trim();  
// "Hello, World!"

indexOf(String str):返回指定字符串在原字符串中第一次出现的索引位置

String str = "Hello, World!";
int index = str.indexOf("World");  
// 7

字符串“+”操作
    ① 字符串拼接产生新的字符串对象:每次进行字符串拼接时,都会创建一个新的字符串对象(Java中字符串是不可变的)
    ② 字符串常量池:Java中的字符串常量池是一块特殊的内存区域,用于存储字符串字面量
作用:(避免创建多个内容相同的字符串对象)当创建一个字符串字面量时,如果字符串常量池中已经存在相同内容的字符串,就会返回已存在的字符串对象的引用,而不会创建新的对象
注意:合理地使用字符串的重用机制(只要字符串存在于常量池中,就无法被垃圾回收)

代码演示 ▶⯈⮞

		String s1 = "2023java";
        // s2重用s1
        String s2 = "2023java";
        // 字符串为引用类型(在创建对象时,先在字符串常量池中先去查找是否存在:存在则直接使用,不存在再创建)
        System.out.println("地址值相同:" + (s1 == s2));
        // 不推荐使用new String()创建,不会重用字符串
        String s3 = new String("2023java");
        System.out.println("地址值不同:" + (s1 == s3));
        // 字符串的拼接(字面量与变量:重新创建字符串对象)不会存入字符串常量池(此时的s1属于重新创建的对象)
        s1 = s1 + "! ";
        System.out.println("s1不再和s2使用同一个地址:" + (s1 == s2));
        // 字符串的拼接(字面量与字面量拼接)
        String s4 = "2023" + "java";
        System.out.println("地址值相同:" + (s4 == s2));

trim():去除字符串两端的空格

String str = "   Hello, World!   ";
String trimmedStr = str.trim();  
// "Hello, World!"

charAt(int index):返回字符串中指定索引位置的字符

String str = "Hello, World!";
char ch = str.charAt(7);  
// 'W'

代码演示 ▶⯈⮞

package string;

public class ChatAt {
    public static void main(String[] args) {
        // 回文检测
        String line = "上海自来水来自海上";
        // 方法1:利用判断标志=============================================================================================
        boolean check = true;
        for (int i = 0; i < line.length() - 1; i++) {
            char c1 = line.charAt(i);
            char c2 = line.charAt(line.length() - 1 - i);
            if (c1 != c2) {
                System.out.println("不是回文!");
                check = false;
                break;
                // return;
            }
        }
        if (check) {
            System.out.println(line + "   是回文");
        }



        // 方法2:来自语言的魅力===========================================================================================
        String lines = "上自来水来自海上";
        for (int i = 0; i < line.length() - 1; i++) {
            char c1 = lines.charAt(i);
            char c2 = lines.charAt(lines.length() - 1 - i);
            if (c1 != c2) {
                // 语言的魅力
                System.out.print("不");
                break;
            }
        }
        System.out.println("是回文");
    }
}

substring(int beginIndex, int endIndex):返回字符串中指定索引范围内的子字符串

String str = "Hello, World!";
String subStr = str.substring(7, 12);  
// "World"

代码演示 ▶⯈⮞

package string;

public class SubString {
    public static void main(String[] args) {
        String baidu = "https://www.baidu.com";
        String csdn = "https://mp.csdn.net";
        System.out.println("百度:" + baidu);
        System.out.println("CSDN:" + csdn);

        // 名称截取
        System.out.println("获取名称:" + getName(baidu));
        System.out.println("获取名称:" + getName(csdn));
    }

    public static String getName(String name) {
        // 从“.”之后开始截取(截取的位置)
        int start = name.indexOf(".") + 1;
        // 从开始位置找到“.”(结束位置)
        int end = name.indexOf(".", start);
        return name.substring(start, end);
    }
}

toLowerCase():将字符串转换为小写形式
toUpperCase():将字符串转换为大写形式

String str = "Hello, World!";
String lowerCaseStr = str.toLowerCase();  
// "hello, world!"

String str = "Hello, World!";
String upperCaseStr = str.toUpperCase();  
// "HELLO, WORLD!"

equals(Object anotherObject):比较字符串与指定对象是否相等(比较字符串内容

String str1 = "Hello";
String str2 = "hello";
boolean isEqual = str1.equals(str2);  
// false

代码演示 ▶⯈⮞

package string;

public class UpperLower {
    public static void main(String[] args) {
        String code = "3Klmd23";
        System.out.println("将字母全部转化为小写:" + code.toLowerCase());
        String input = "3klMD23";
        System.out.println("将字母全部转化为大写:" + code.toUpperCase());
        // 字符串比较
        if (code.equals(input)){
            System.out.println("验证一致!");
        }

        // 字符串忽略大小写比较
        if (code.equalsIgnoreCase(input)) {
            System.out.println("验证码输入正确!");
        } else {
            System.out.println("输入错误");
        }
    }
}

split(String regex):根据指定正则表达式将字符串分割成字符串数组

String str = "Hello,World!";
String[] arr = str.split(",");  
// ["Hello", "World!"]

replace(CharSequence target, CharSequence replacement):使用新字符串替换原字符串中的目标字符串

String str = "Hello, World!";
String replacedStr = str.replace("World", "Java");  
// "Hello, Java!"
3. StringBuilder
String的特性:String是不可变对象(内容不可变),改变时要创建新对象(因此不适合频繁修改内容)
String的缺点:频繁修改内容会导致大量的String对象被创建,导致性能降低,增大内部开销
StringBuilder:用于动态地构建字符串(专门用于修改字符串内容的工具类内部维护一个可变的char数组,修改字符串性能好)
String常量池:字符串常量池(String Constant Pool)是Java中的一个特殊存储区域,用于存储字符串常量

StringBuilder常见API
length():返回StringBuilder对象中字符序列的长度
append(String str):将指定的字符串追加到当前StringBuilder对象的末尾
delete(int start, int end):删除从指定起始位置到结束位置之间的字符
replace(int start, int end, String str):替换从指定起始位置到结束位置之间的字符为给定的字符串
insert(int offset, String str):在指定位置插入字符串
reverse():反转StringBuilder对象中的字符顺序
toString():将StringBuilder对象转换为String类型

链式调用:StringBuilder的方法返回的是自身的引用,可以使用链式调用来简化
StringBuffer是线程安全的(可并发处理,性能差),StringBuilder非线程安全(不可并发,性能好)

package string;

public class StringBuilds {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder();
        int length = builder.length();
        System.out.println("长度:" + length);
        System.out.println("内容:" + builder);


        StringBuilder string = new StringBuilder("你好Java");
        // append追加操作(支持多种数据类型的追加)
        string.append(",Hello World");
        System.out.println("拼接后的内容:" + string);

        // replace替换操作(将指定内容替换为给定内容)
        string.replace(7, 18, "你好世界!");
        System.out.println("替换后的内容:" + string);

        // delete删除
        string.delete(0,2);
        System.out.println("删除后的内容:" + string);

        // insert插入(在指定位置插入给定内容)
        string.insert(4, "的世界");
        System.out.println("插入后的内容:" + string);

        // reverse字符串反转
        string.reverse();
        System.out.println("反转后的内容:" + string);

        // 获取修改后的字符串StringBuilder只是一个字符串拼接方法
        String line = string.toString();
        System.out.println("最终获取的内容:" + line);

        // 支持链式编程
        String builders = new StringBuilder("你好").append("我叫").insert(2, "!").append("XX").toString();
        System.out.println("内容:" + builders);
    }
}

你可能感兴趣的:(java网络编程,java,python,开发语言)