JAVA第十学:认识String类 - 教程

常用方法

所有涉及到可能修改字符串内容的操作都是创建一个对象,改变的是新对象

1.字符串构造

String类提供的构造方式非常多,常用的就以下三种:


2.String对象的比较(字符串内存存储)

字符串的比较是常见操作之一

2.1 == 比较是否引用同一个对象

对于基本类型变量,== 比较两个变量存储的值是否相同;对于引用类型变量,== 比较两个引用变量引用的是否为同一个对象

(内置类型中包含基本类型)

Java 中的引用类型主要包括:
类型(内置类【String 类、包装类、系统类】、自定义类)、接口类型、数组类型、枚举类型、注解类型。

所有引用类型的共同特点是:变量存储的是对象内存地址,而不是对象本身这是理解 Java 面向对象编程和内存管理的关键。





2.2 比较大小



3.字符串查找


String类提供的常用查找的方法:

注意:上述方法都是实例方法。


4.转化

4.1 数值和字符串转化


4.2 大小写转换


4.3 字符串数组(重要)

字符串转字符数组


字符串转字节数组

查看字符编码(UTF-8

http://www.mytju.com/classCode/tools/encode_utf8.asphttp://www.mytju.com/classCode/tools/encode_utf8.asp

4.4 格式化


5.字符串替换

使用一个指定的字符串替换掉已有字符串数据

replace 引号是替换字符引号替换。

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));

注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个的字符串

6.字符串拆分

将一个完整的字符串按照指定的分隔符划分为若干个子字符串



有些特殊字符作为分割符可能无法正确切分,需要加上转义



7.字符串截取

从一个完整的字符串之中截取出部分内容。

String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));

注意事项:

1. 索引从0开始

2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 包含 5 号下标

8.其他操作方法



9.intern方法

手动把字符串常量添加到常量池


10.字符串的不可变

String是一种不可变对象,字符串中的内容不可改变,字符串不可被修改。


原因如下:

(1)所有涉及到可能修改字符串内容的操作都是创建一个对象,改变的是新对象

(2)String类设计时就是不可改变的,String类实现描述中已经说明了

以下来自JDK1.8中String类的部分实现

String类中的字符实际保存在内部维护的value字符数组

Stringfinal修饰,表明该类不能被继承;valuefinal修饰,表明value自身的值不能改变,即不能引用其它字符数组(该引用变量不能指向其他对象但是其引用空间中 的内容可以修改。

【纠正】网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。

这种说法是错误的,不是因为String类自身,或者其内部value被final修饰不能被修改。



注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。

那如果想要修改字符串中内容,该如何操作?

//Java中提供的 "不可变字符串"
public static void main(String[] args) {
    String s = "hello";
    s += " world";
    System.out.println(s);  // 输出:hello world
}

(1)先通过 s 和 world 拼接成一个新的字符串,再将s的引用指向新字符串。这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。

(2)使用 StringBuffer版本) 或者 StringBuilder版本)

String和StringBuilder最大的区别在于,String的内容无法修改,而StringBuilder的内容可以修改频繁修改字符串的情况优先考虑使用StringBuilder。

11.StringBuilder和StringBuffer(字符串修改)

为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类,这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其它需要用到了大家可参阅 StringBuilder在线文档。

https://docs.oracle.com/javase/8/docs/api/https://docs.oracle.com/javase/8/docs/api/



12.oj

(1)第一个只出现一次的字符

https://leetcode.cn/problems/first-unique-character-in-a-string/description/https://leetcode.cn/problems/first-unique-character-in-a-string/description/

统计每个字符(本质是数字)出现的次数,再遍历每个字符,判断出现的次数是否是1次。



class Solution {
    public int firstUniqChar(String s) {
        int[] count = new int[256];
        // 统计每个字符出现的次数
        for(int i = 0; i < s.length(); ++i){
            count[s.charAt(i)]++;
       }
        // 找第一个只出现一次的字符
        for(int i = 0; i < s.length(); ++i){
            if(1 == count[s.charAt(i)]){
                return i;
           }
       }
        return -1;
   }
}

(2)最后一个单词的长度

https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-rankinghttps://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking


也可以用另一种方法


(3)检测字符串是否为回文

https://leetcode.cn/problems/valid-palindrome/https://leetcode.cn/problems/valid-palindrome/

class Solution {
    public static boolean isValidChar(char ch){
        if((ch >= 'a' && ch <= 'z') ||
           (ch >= '0' && ch <= '9')){
               return true;
       }
        return false;
   }
    public boolean isPalindrome(String s) {
        // 将大小写统一起来
        s = s.toLowerCase();
        int left = 0, right = s.length()-1;
        while(left < right){
            // 1. 从左侧找到一个有效的字符
            while(left < right && !isValidChar(s.charAt(left))){
                left++;
           }
            // 2. 从右侧找一个有效的字符
            while(left < right && !isValidChar(s.charAt(right))){
                right--;
           }
            if(s.charAt(left) != s.charAt(right)){
                return false;
           }else{
                left++;
                right--;
           }
       }
        return true;
   }
}

posted @ 2026-01-23 15:10  gccbuaa  阅读(3)  评论(0)    收藏  举报