12--常用类和基础API--02

2023-12-13 05:05:51

1、String类

1.1 String类概述

String 类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例。

String类 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写小写的所有字符的字符串的副本。

1.2 String类的特点

字符串不变:字符串的值在创建后不能被更改

String s1 = "abc"; 
s1 += "d"; 
System.out.println(s1); // "abcd" 
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。

因为String对象是不可变的,所以它们可以被共享。

String s1 = "abc";
String s2 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。

String的本质是

JDK8之前是char[] 数组,包括1.8

JDK8之后是byte[] 数组

String str = new String("Hello");创建了几个对象?

两个

String str = new String("Hello" + "Java");创建了几个对象?

四个

字符串拼接测试

package com.suyv.string;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 11:14
*@Description: 字符串拼接测试
*/
public class StringDemo03 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        // 常量 + 常量
        String s3 = "hello" + "world";
        // 变量 + 常量
        String s4 = s1 + "world";
        // 变量 + 变量
        String s5 = s1 + s2;
        // 使用intern方法
        String s6 = (s1 + s2).intern();

        System.out.println(s3 == s4);       // false
        System.out.println(s3 == s5);       // false
        System.out.println(s3 == s6);       // true
        System.out.println(s4 == s5);       // false
        System.out.println(s4 == s6);       // false
        System.out.println(s5 == s6);       // false

    }
}

结论:

(1)常量+常量:结果是常量池。且常量池中不会存在相同内容的常量。

(2)常量与变量 或 变量与变量:结果在堆中

(3)拼接后调用intern方法:返回值在常量池中

1.3 String 类使用步骤

查看类

  • java.lang.String:此类不需要导入。

查看构造方法

方法名

说明

public String()

初始化新创建的String对象,以使其表示空字符序列

public String(char[] value)

通过当前参数中的字符数组来构造新的String。

String(char[] value, int offset, int count)

通过当前参数中的字符数组的一部分来构造新的String。

String(byte[] bytes)

通过使用平台的默认字符集解码当前参数中的字节数组来构造新的

String(byte[] bytes, int offset, int length)

通过使用平台的默认字符集解码当前参数中的字节数组的一部分来构造新的String

基本代码演示

// 无参构造
String str = new String();

// 通过字符数组构造
char chars[] = {'a', 'b', 'c'};     
String str2 = new String(chars);

// 通过字节数组构造
byte bytes[] = { 97, 98, 99 };     
String str3 = new String(bytes);

1.4 String类常用的方法

1.4.1 判断功能的方法

String类的判断功能:

boolean equals(Object obj)

????????比较字符串的内容是否相同,区分大小写

boolean equalsIgnoreCase(String str)

????????比较字符串的内容是否相同,忽略大小写

boolean contains(String str)

????????判断大字符串中是否包含小字符串

boolean startsWith(String str)

????????判断字符串是否以某个指定的字符串开头

boolean endsWith(String str)

????????判断字符串是否以某个指定的字符串结尾

boolean isEmpty()

????????判断字符串是否为空字符串。

注意:

字符串内容为空和字符串对象为空。

????????String s = "";内容为空

????????String s = null; 字符串对象为空

代码演示

package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 11:35
*@Description: String类的判断功能
*/
public class StringDemo01 {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "Hello";
        String str3 = "Hello World";
        String str4 = "";
        String str5 = null;

        // equals()判断字符串内容是否相同,区分大小写
        System.out.println(str1.equals(str2));                  // false

        // equalsIgnoreCase()判断字符串内容是否相同,不区分大小写
        System.out.println(str1.equalsIgnoreCase(str2));        // true

        // 判断大字符串中是否包含小字符串
        System.out.println(str3.contains(str1));                // false
        System.out.println(str3.contains(str2));                // true

        // 判断字符串是否以某个指定的字符串开头
        System.out.println(str3.startsWith("he"));              // false
        System.out.println(str3.startsWith("He"));              // true

        // 判断字符串是否以某个指定的字符串结尾
        System.out.println(str3.endsWith("ld"));                // true
        System.out.println(str3.endsWith("lds"));               // false

        // 判断字符串是否为空。
        System.out.println(str4.isEmpty());                     // true
        System.out.println(str1.isEmpty());                     // false
        System.out.println(str5.isEmpty());                     // 报错,空指针异常

    }
}

1.4.2 获取功能的方法

public int length()

????????返回此字符串的长度

public String concat(String str):

????????将指定的字符串连接到该字符串的末尾。

public char charAt(int index):

????????返回指定索引处的char值。

public int indexOf(String str)

????????返回指定子字符串第一次出现在该字符串内的索引。

public int lastIndexOf(String str)

????????返回从后向前查找字符串最后一次出现在该字符串的索引

????????即查找最后一次出现的索引值

public String substring(int beginIndex)

????????返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。

public String substring(int beginIndex,int endIndex)

????????返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。

代码演示

package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 11:55
*@Description: String获取功能的方法
*/
public class StringDemo02 {
    public static void main(String[] args) {

        String str1 = "Hello World";
        String str2 = "HelloWorld";
        String str3 = "test";

        // 返回此字符串的长度
        System.out.println(str1.length());      // 11
        System.out.println(str2.length());      // 10

        // 将指定的字符串连接到该字符串的末尾。
        System.out.println(str1.concat(str3));  // Hello Worldtest

        // 返回指定索引处的char值。
        System.out.println(str1.charAt(8));     // r

        // 返回指定子字符串第一次出现在该字符串内的索引。
        System.out.println(str1.indexOf('o'));  // 4
        // 从指定索引开始查找
        System.out.println(str1.indexOf('o',5));    // 7
        System.out.println(str1.indexOf("or")); // 7
        // 负数表示没有查到
        System.out.println(str1.indexOf("or",8));   // -1

        // 从后向前查找做后一次出现该字符串的索引
        System.out.println(str1.lastIndexOf('o'));      // 7
        // 从指定索引开始查找
        System.out.println(str1.lastIndexOf('o', 5));       // 4
        System.out.println(str1.lastIndexOf("or"));     // 7
        // 负数表示没有查到
        System.out.println(str1.lastIndexOf("or", 5));  // -1

        // 返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
        System.out.println(str1.substring(8));  // rld

        // 返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
        System.out.println(str2.substring(2, 8));   // lloWor

    }
}

1.4.3 字符串遍历

package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 12:09
*@Description: 遍历String字符串
*/
public class StringDemo03 {
    public static void main(String[] args) {
        String str1 = "helloworld";

        for (int i = 0; i < str1.length(); i++) {
            System.out.println(str1.charAt(i));
        }
    }
}

1.4.4 转换功能的方法

public char[] toCharArray()

????????将此字符串转换为新的字符数组。

public byte[] getBytes()

????????使用平台的默认字符集将该String编码转换为新的字节数组。

public String replace(char oldChar, char newChar)

????????将oldChar匹配的字符串使用newChar字符串替换。

public String replaceFirst(String regex,String replacement)

????????用给定的 replacement 替换此字符串匹配给定的regex的第一个子字符串。

public String toUpperCase()

????????将字符中转换为大写

public String toLowerCase()

????????将字符中转换为小写

代码演示

package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 12:19
*@Description: TODO
*/
public class StringDmeo04 {
    public static void main(String[] args) {

        String str1 = "AaABbBCcCdDd";
        String str2 = "AaA123";

        // 将此字符串转换为新的字符数组。
        char[] chars = str1.toCharArray();
        System.out.println(chars[0]);       // A

        // 使用平台的默认字符集将该String编码转换为新的字节数组。
        byte[] bytes = str2.getBytes();
        System.out.println(bytes[0]);       // 65
        // 中文在utf-8编码中占3字节,在GBK编码中占2字节
        byte[] b1 = str3.getBytes();
        System.out.println(Arrays.toString(b1));	// [-28, -72, -83, -27, -101, -67]
        byte[] b2 = str3.getBytes("GBK");
        System.out.println(Arrays.toString(b2));	// [-42, -48, -71, -6]

        // replace(char oldChar, char newChar)
        // 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
        // 将oldChar匹配的字符串使用newChar字符串替换。
        System.out.println(str1.replace('A', '*')); // *a*BbBCcCdDd

        // replace(CharSequence target, CharSequence replacement)
        // 将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列。
        System.out.println(str1.replace("A", "*")); // *a*BbBCcCdDd
        System.out.println(str1.replace("AaA", "*"));   // *BbBCcCdDd

        // replaceAll(String regex, String replacement)
        // 用给定的替换替换与给定的 regular expression匹配的此字符串的每个子字符串。
        System.out.println(str2.replaceAll("[0-9]","aaa")); // AaAaaaaaaaaa

        // replaceFirst(String regex,String replacement)
        // 用给定的 replacement 替换此字符串匹配给定的regex的第一个子字符串。
        System.out.println(str2.replaceFirst("[0-9]", "aaa"));  // AaAaaa23

        // 将字符串中小写字母转换为大写字母
        System.out.println(str1.toUpperCase());     // AAABBBCCCDDD

        // 将字符中大小字母转换为小写字母
        System.out.println(str1.toLowerCase());     // aaabbbcccddd
        
    }
}

1.4.5 分割-替换-去空格

public String[] split(String regex)

????????将此字符串按照给定的regex(规则)拆分为字符串数组。

public String trim()

????????去除该字符串的两端空格

代码演示

package com.suyv.string01;

/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 13:45
*@Description: TODO
*/
public class StringDemo05 {
    public static void main(String[] args) {

        String str = "aa|bb|cc";

        // 字符串分割(正则),分割成字符串1数组
        String[] strings = str.split("\\|");
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }

        // 把空格替换成"" replaceAll()
        String str2 = "      I am a student      ";
        System.out.println(str2.replaceAll("\\s", "")); // Iamastudent

        // 去除祖父穿两端空格
        System.out.println(str2.trim());        // I am a student
    }
}

1.4.6 其他常用方法

public int compareTo(String other)

????????比较字符串大小,区分大小写,按照Unicode编码值比较大小

public int compareToIgnoreCase(String other)

????????比较字符串大小,不区分大小写

public String intern()

????????结果在常量池中共享

public boolean matches(String regex)

????????判断字符串是否与对应的正则表达式匹配

package com.suyv.string;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 11:26
*@Description: TODO
*/
public class StringDemo06 {
    public static void main(String[] args) {
        
        String str1 = "hello";
        String str2 = "Hello";
        String str3 = "helloHello";

        // 比较字符串大小,区分大小写,按照Unicode编码值比较大小
        // 返回正数表示前一个字符串大,返回0表示一样大,返回负数表示后一个字符串大
        System.out.println(str1.compareTo(str2));		// 32
        System.out.println(str1.compareToIgnoreCase(str2));	// 0

        // 把字符串的结果在常量池中共享
        String str4 = (str1 + str2).intern();
        System.out.println(str4 == str3);		// true

        // 匹配对应的正则表达式
        boolean m = str3.matches("^[a-zA-Z]{1,}$");
        System.out.println(m);		// true

    }
}

1.5 String类的练习

1.5.1 字符串首字母改为大写

  • 需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 13:59
*@Description: 把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
*/
public class Test01 {
    public static void main(String[] args) {
        String str = "hello WORLD";

        // 1、取首字母并转成大写字母
        String s1 = str.substring(0,1).toUpperCase();
        // System.out.println(s1);

        // 2、取首字母之外的其他字母并转成小写字母
        String s2 = str.substring(1).toLowerCase();
        // System.out.println(s2);

        // 3、拼接字符串并输出
        // str = s1 + s2;
        str = s1.concat(s2);
        System.out.println(str);


        // 链式操作
        String s = str.substring(0,1).toLowerCase().concat(str.substring(1).toLowerCase());
        System.out.println(s);
    }
}

1.5.2 统计字符个数

  • 键盘录入一个字符串,统计字符串中大小写字母及数字字符个数 "abcABC123"
package com.suyv.string01;

import java.util.Scanner;

/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 14:09
*@Description: 键盘录入一个字符串,统计字符串中大小写字母及数字字符个数  "abcABC123"
*/
public class Test02 {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String str = scan.nextLine();

        int AZ = 0;     // 统计大写字母个数
        int az = 0;     // 统计小写字母个数
        int num = 0;    // 统计数字个数
        int other = 0;  // 其他字符

        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);

            if (ch >= 'A' && ch <= 'Z'){
                AZ++;
            }else if(ch >= 'a' && ch <= 'z'){
                az++;
            }else if(ch >= '0' && ch <= '9'){
                num++;
            }else {
                other++;
            }
        }

        System.out.println("大写字母有" + AZ + "个");
        System.out.println("小写字母有" + az + "个");
        System.out.println("数字有" + num + "个");
        System.out.println("其他字符有" + other + "个");

    }
}

1.5.3 统计子字符串在父字符串中出现的次数

  • 统计子字符串在父字符串中出现的次数
package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 14:20
*@Description: 统计子字符串在父字符串中出现的次数
*/
public class Test03 {
    public static void main(String[] args) {
        String maxString = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagunjavajava";

        String str = "java";

        int count = 0;
        int index;

        while ((index = maxString.indexOf(str)) != -1){
            count++;

            // 从新计算新的大串开始位置
            // index + str.length()
            maxString = maxString.substring(index + str.length());
        }

        System.out.println(str + "出现了" + count + "次。");
    }
}

代码优化

package com.suyv.string01;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-09 14:30
*@Description: 统计子字符串在父字符串中出现的次数
*/
public class Test04 {
    public int getStr(String maxString,String minString){
        int count = 0;
        int index;

        while ((index = maxString.indexOf(minString)) != -1){
            count++;

            // 从新计算新的大串开始位置
            // index + str.length()
            maxString = maxString.substring(index + minString.length());
        }

        return count;
    }
}

class Test04Demo{
    public static void main(String[] args) {
        Test04 t = new Test04();
        String str = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagunjavajava";
        String s = "java";
        int count = t.getStr(str,s);
        System.out.println(count);
    }

}

1.5.4 字符串反转

将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”

package com.suyv.string;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 11:35
*@Description: 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
*/
public class Test05 {
    public static void main(String[] args) {
        System.out.println(reserve01("abcdefg", 2, 5));
        System.out.println(reserve02("abcdefg", 2, 5));
        System.out.println(reserve03("abcdefg", 2, 5));
    }

    /**
     * @description: 方法一
     * @author: 憨憨浩浩
     * @date: 2023/12/12 13:01
     * @param: [str, startIndex, endIndex]
     * @return: java.lang.String
     **/
    public static String reserve01(String str,int startIndex,int endIndex){
        if (str != null){
            // 将字符串转成字符数组
            char[] chars = str.toCharArray();
            // 从startIndex到endIndex交换数组元素
            for (int i = startIndex, j = endIndex; i < j; i++,j--) {
                char temp = chars[i];
                chars[i] = chars[j];
                chars[j] = temp;
            }
            return new String(chars);
        }
        return null;
    }

    /**
     * @description: 方法二
     * @author: 憨憨浩浩
     * @date: 2023/12/12 13:03
     * @param: [str, startIndex, endIndex]
     * @return: java.lang.String
     **/
    public static String reserve02(String str,int startIndex,int endIndex){
        // 取startIndex前的字符串
        String newStr = str.substring(0, startIndex);
        // 从endIndex处向前拼接到startIndex
        for (int i = endIndex; i >= startIndex; i--) {
            newStr += str.charAt(i);
        }
        // 拼接endIndex后的字符串
        newStr += str.substring(endIndex + 1);
        return newStr;
    }

    /**
     * @description: 方法三
     * @author: 憨憨浩浩 
     * @date: 2023/12/12 13:04
     * @param: [str, startIndex, endIndex]
     * @return: java.lang.String
     **/
    public static String reserve03(String str,int startIndex,int endIndex){
        // 把String转成StringBuffer
        StringBuffer s = new StringBuffer(str.length());
        // 添加startIndex前的字符串
        s.append(str.substring(0, startIndex));// ab
        // 从endIndex处向前拼接到startIndex
        for (int i = endIndex; i >= startIndex; i--) {
            s.append(str.charAt(i));
        }
        // 添加endIndex后的字符串
        s.append(str.substring(endIndex + 1));
        return s.toString();
    }
}

补充:正则表达式

例如:

字符串首位是数字,其余为字母,最多5位,最少8位 ^[0-9][a-zA-Z]{4,}$

文章来源:https://blog.csdn.net/weixin_46612641/article/details/134957071
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。