Java ==> String类(字符串)

news2024/12/23 1:17:54

文章目录

  • 一、认识String类
    • 1、创建String对象
    • 2、不可变的String
    • 3、字符串常量池
  • 二、字符串常用操作
    • 1、字符串比较
      • 1.1 用“==”比较
      • 1.2 用equals()方法比较
      • 1.3用compareTo()方法进行比较
    • 2、获取字符串长度
    • 3、字符串查找
    • 4、字符串转换
      • 4.1valueOf()数值转换为字符串
      • 4.2字母大小写转换
    • 5、字符串替换
    • 6、字符串拆分
    • 7、字符串截取
  • 总结



提示:以下是本篇文章正文内容,下面案例可供参考

一、认识String类

在Java中,字符串是一个由字符序列组成的对象,它用于存储和处理文本数据。字符串是Java编程语言中最常用的数据类型之一,用于表示一系列字符,例如名字、地址、句子等。在Java中,字符串是由java.lang.String类来表示的,这意味着你可以利用这个类提供的丰富的方法来创建、访问以及操作字符串。

1、创建String对象

我们常见的创建String对象,一般有以下的三种:

public class Test {
    public static void main(String[] args) {
        //创建String对象的三种常见方法
        //使用字面量创建字符串
        String s1 = "hello";
        System.out.println(s1);//输出hello

        //使用构造器创建字符串
        String s2 = new String("hello" );
        System.out.println(s2);//输出hello

        //使用char数组创建字符串
        char[] chars = {'h', 'e', 'l', 'l', 'o'};
        String s3 = new String(chars);
        System.out.println(s3);//输出hello
    }
}

2、不可变的String

在 Java 中,String 类是一个非常重要的类,它用来表示文本字符串,不仅可以表示数字,英文,还可以表示中文等文本。String 类的对象是不可变的,这意味着一旦创建了一个 String 对象,它的值就不能被改变,我们通过JDK 1.8的文档可以查看到:

在这里插入图片描述
由此我们还可以知道,String类是继承了多接口的,一旦创建了String对象就不可以被改变,但可以共享,我们来举一个例子就会一目了然:

public class Test {
    public static String upcase(String s) {
        return s.toUpperCase();//将字符串的每个字母都变成大写
    }

    public static void main(String[] args) {
        String a = "hello";
        System.out.println(a);//输出hello
        String b = upcase(a);
        System.out.println(b);//输出HELLO
        System.out.println(a);//输出hello
    }
}

String类中每一个看起来会修改String值的方法,其实都是创建了一个全新的String对象,用来包含被修改过的String对象,而最初的String对象则是没有任何变化的。
当我们把a传给upcase()方法时,实际传递的引用的一个拷贝。每当我们把String对象作为方法的参数时,都会进行复制一份引用,则该对象的值始终没有被改变。

3、字符串常量池

在Java中,字符串常量池是一个特殊的内存区域,它用来存储字符串字面量。当你使用字符串字面量来创建字符串时,JVM会检查字符串常量池中是否已经有相同的字符串。如果有,就会复用已有的字符串对象;如果没有,就会创建一个新的字符串对象,并将其放入字符串常量池中。这种方式有助于减少重复字符串的创建,从而节省内存资源。
我们给个例子更加直观的理解:

public class Test {
    public static void main(String[] args) {
        // 字符串字面量,将复用字符串常量池中的对象
        String str1 = "hello";
        String str2 = "hello";

        // 使用new关键字创建的新对象,不使用字符串常量池
        String str3 = new String("hello");

        System.out.println(str1 == str2);  // true,因为str1和str2引用的是同一个对象
        System.out.println(str1 == str3);  // false,因为str3是新创建的对象
        System.out.println(str1.equals(str3)); // true,因为内容相同
    }
}

字符串常量池的影响:
内存效率: 由于字符串常量池的存在,相同的字符串字面量只会在内存中保存一份,这对于频繁创建相同字符串的应用来说是非常有用的。
性能提升: 使用字符串常量池可以避免创建不必要的对象,减少垃圾回收的压力,从而提高程序的性能。
线程安全性: 字符串常量池中的字符串是不可变的,这意味着它们的内容不能被更改,因此可以安全地在多个线程之间共享。
字符串比较: 当比较两个通过字符串字面量创建的字符串时,可以使用 == 操作符来检查它们是否引用同一个对象。这是因为这些字符串都指向字符串常量池中的同一个位置。但是,对于通过new String()创建的字符串,即使它们的内容完全相同,也必须使用equals()方法来比较内容,因为它们可能是不同的对象。

二、字符串常用操作

1、字符串比较

1.1 用“==”比较

我们通常使用“==”来比较是否引用同一对象,同一对象则返回true,否则返回false
例:

public class Test {
    public static void main(String[] args) {
        //字符串比较
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = s1;
        String s5 = s3;
        System.out.println(s1 == s2);//true
        System.out.println(s1 == s3);//false
        System.out.println(s1 == s4);//true
        System.out.println(s3 == s5);//true
    }

}

1.2 用equals()方法比较

我们查看JDK1.8文档可以看到,equals()方法是boolean类型的
在这里插入图片描述
equals()先判断是否引用的同一对象或参数是否为null,如果为同一对象则直接返回true,为null则返回false,否则继续比较其引用对象的内容是否相等。
在这里插入图片描述

equals()用于比较两个字符串的内容,equals()方法是String类中的方法,我们可以直接通过创建的String对象去直接引用;
例:

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = new String("hello");
        System.out.println(s1.equals(s2));//true
    }
}

我们还可以使用equalsIgnoreCase()来比较,这个方法可以忽略大小写进行比较,常用于我们的日常使用的验证码当中,例如:

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO";
        System.out.println(s1.equalsIgnoreCase(s2));//true
    }
}

1.3用compareTo()方法进行比较

compareTo()也是String类中的一个可以直接引用的方法,它的返回值为int(整型),我们点进这个方法进一步了解一下

在这里插入图片描述
我们可以很清楚的明白,compareTo()是如何进行比较的
在这里插入图片描述
compareTo()和compareToIgnorCase()的区别就是,后者不区分大小写进行比较
例如:

public class Test {
    public static void main(String[] args) {
        String s1 = "aaabbb";
        String s2 = "AAABBB";
        System.out.println(s1.compareTo(s2));//输出32
        System.out.println(s1.compareToIgnoreCase(s2));//输出0
    }

}

2、获取字符串长度

我们通过String对象.length就可以获取我们字符串的长度。
例:

public class Test {
    public static void main(String[] args) {
        //字符串长度
        String s1 = "asdfghjklzxcvbnmqwertyuiop";
        System.out.println(s1.length());//输出26
    }
}

3、字符串查找

为大家列举了一写关于字符串查找的常用方法:

方法功能
char charAt(int index)返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常
int indexOf(int ch)返回ch第一次出现的位置,没有返回-1
int indexOf(int ch, intfromIndex)从fromIndex位置开始找ch第一次出现的位置,没有返回-1
int indexOf(String str)返回str第一次出现的位置,没有返回-1
int indexOf(String str, intfromIndex)从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch)从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch, intfromIndex)从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
int lastIndexOf(String str)从后往前找,返回str第一次出现的位置,没有返回-1
int lastIndexOf(String str, intfromIndex)从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1

例:

在这里插入图片描述

4、字符串转换

4.1valueOf()数值转换为字符串

我们可以通过String类中的valueOf()方法,对数值进行转换,将数值转换为字符串,valueOf()的参数许多,如下:
在这里插入图片描述
我们可以看到它是被static所修饰的所以可以直接调用。
例:

public class Test {
    public static void main(String[] args) {
        //String.valueOf()方法可以将其他类型的值转换为字符串
        String s1 =  String.valueOf(1234);
        System.out.println(s1);//输出1234
        String s2 =  String.valueOf(1234.5678);
        System.out.println(s2);//输出1234.5678
        String s3 =  String.valueOf(1234567890123L);
        System.out.println(s3);//输出1234567890123
        String s4 =  String.valueOf(1234.567F);
        System.out.println(s4);//输出1234.567
        String s5 =  String.valueOf('a');
        System.out.println(s5);//输出a
        String s6 =  String.valueOf(true);
        System.out.println(s6);//输出true
        String s7 =  String.valueOf("hello world");
        System.out.println(s7);//输出hello world
    }
}

4.2字母大小写转换

我们要将字符串中的字母进行大小写的转换,我们需要用到toLowerCase() 和toUpperCase() 方法。
我们直接用String对象去 .toLowerCase() 就可以使其字母变为小写,.toUpperCase() 就可以使其字母变为大写。
例:

public class Test {
    public static void main(String[] args) {
        //字符串大小写转换
        String s1 = "Hello World";
        String s2 = "hello world";
        System.out.println(s1.toLowerCase());//输出hello world
        System.out.println(s2.toUpperCase());//输出HELLO WORLD
    }

}

其操作也是非常的快捷。

5、字符串替换

字符串替换在我们生活中也是很常见的,我们在游戏中会经常看到一下“”的字符串,其是把一些敏感字替换成了“”的字符。
主要是有以下两种方法:
在这里插入图片描述
例:

public class Test {
    public static void main(String[] args) {
        //字符串替换
        String s1 = "aaabbb";
        String s2 = s1.replaceFirst("a", "A");
        String s3 = s1.replaceAll("a","A");
        System.out.println(s2);//输出Abbbccc
        System.out.println(s3);//输出aabbDbbD
    }
}

6、字符串拆分

字符串拆分可以将我们一个字符串以指定的分隔符进行拆分,拆成若干个子字符串,也可以按照指定的份数进行拆分,主要分为2种:
在这里插入图片描述
例:

public class Test {
    public static void main(String[] args) {
        String s1 = "hello world";
        String[] arr = s1.split(" ");
        for (String s : arr) {
            System.out.println(s);
        }

        //字符串拆分,指定分隔符和最大分割次数
        String s2 = "hello,world,hello,java,hehe";
        arr = s2.split(",",5);
        for (String s : arr) {
            System.out.println(s);
        }

        String s3 = "101.111.321.112";
        arr = s3.split("\\.",4);
        for (String s : arr) {
            System.out.println(s);
        }

    }
}

输出:
在这里插入图片描述

注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

7、字符串截取

给定字符串我们可以对其截取我们想要的部分,这时候我们就可以使用substring()方法,如下:
在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        //字符串截取
        String s1 = "hello world";
        System.out.println(s1.substring(5));//输出 world
        System.out.println(s1.substring(0, 5));//输出llo
        System.out.println(s1.substring(2, s1.length()));//输出llo world
    }
}

在日常生活中我们的手机号,在应用上一般都显示为188****1234这样的形式,其实也是把中间的给替换掉了,我们可以结合字符串的替换和截取进行操作,如下:

public class Test {
    public static void main(String[] args) {
        String s1 = "18899991234";
        System.out.println(s1.replaceAll(s1.substring(3, 7), "****"));
    }
}

这样我们不难发现这些方法是可以互相调用的,其操作也是相对很好理解的,我们多加进行练习,便可以使用的更加行云流水。



总结

这些是String类的一些较为常用的知识和方法,当然String类方法不止这些,如果还想了解更多的方法我们可以进行查阅JDK1.8的文档进行学习,各位铁子找不到的话可以私信我,我给发一份。
非常感谢大家阅读完这篇博客。希望这篇文章能够为您带来一些有价值的信息和启示。在未来的日子里,我们将继续探索更多关于博客技术的精彩内容,敬请期待。如果您有任何问题或建议,欢迎在评论区留言,我们一起交流学习。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Github下载YOLO v5项目教程

目录 1、首先打开Github 2、在搜索框搜索yolov5 3、找到合适的yolov5版本 4、选择版本 5、下载 1、首先打开Github 2、在搜索框搜索yolov5 3、找到合适的yolov5版本 这里以第一个为例 4、选择版本 版本的选择要根据自己python的版本以及安装的库的版本,在requi…

leetcode 2710 移除字符串中的尾随零

1.题目要求: 2.题目代码: class Solution { public:string removeTrailingZeros(string num) {while(num[num.size() - 1] 0){num.pop_back();}return num;} };

033_Structure_Static_In_Matlab求解结构静力学问题两套方法

结构静力学问题 静力学问现在是已经很简单的问题,在材料各向同性的情况下,对于弹性固体材料,很容易通过有限元求解。特别是线弹性问题,方程的矩阵形式可以很容易的写出(准确得说是很容易通过有限元表达)&a…

01.如何用DDD重构老项目

学习资料来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

v-on:注册事件(可用@代替:@事件名)

目录 1.v-on: 2.页面效果 3.结构 v-on: (1)作用:注册事件添加监听提供处理逻辑 (2)语法: (后:提供处理逻辑) ①v-on:事件名"内联语句" ②v-on:事件名"methods中的函数名 一、…

基于OSS搭建在线教育视频课程分享网站

OSS对象存储服务是海量、安全、低成本、高持久的存储服务。适合于存储大规模非结构化数据,如图片、视频、备份文件和容器/虚拟机镜像等。 安装nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz yum -y install zlib zlib-devel gcc-c pcre-devel open…

C++ | Leetcode C++题解之第520题检测大写字母

题目: 题解: class Solution { public:bool detectCapitalUse(string word) {// 若第 1 个字母为小写,则需额外判断第 2 个字母是否为小写if (word.size() > 2 && islower(word[0]) && isupper(word[1])) {return false;…

SpringBoot中@Validated或@Valid注解校验的使用

文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto,加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…

Rust 力扣 - 1297. 子串的最大出现次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 越短的子串出现的次数越多,我们只需要求某个长度为min_size的子串出现的次数,并且该子串中不重复字符小于等于max_letters的数量 遍历长度长度为min_size的子串,然后将不重复…

【机器学习】25. 聚类-DBSCAN(density base)

聚类-DBSCAN-density base 1. 介绍2. 实现案例计算 3. K-dist4. 变化密度5. 优缺点 1. 介绍 DBSCAN – Density-Based Spatial Clustering of Applications with Noise 与K-Means查找圆形簇相比,DBSCAN可以查找任意形状和复杂形状的簇,如S形、椭圆、半圆…

yocto中bitbake -e的作用

bitbake -e > bb.log是Yocto项目中一个常用的命令操作,以下是对它的详细解释: 1. 命令的组成部分 -e:这是bitbake命令的一个选项。-e选项的作用是让bitbake输出环境变量信息。这些环境变量包含了与当前构建任务相关的大量参数&#xff0…

如何在Apple Vision Pro上打造成功的沉浸式叙述应用

随着科技的进步,沉浸式叙述应用正在成为一种全新的娱乐方式。Apple Vision Pro的发布,标志着空间计算技术迈上了新的台阶。本文将探讨如何在Vision Pro上构建一款类似Encounter Dinosaur的沉浸式叙述应用,具体通过分析《Out There》这款作品,总结出一系列关键点,帮助创作者…

android定时器循环实现轮播图

说明: android定时器加for循环实现轮播图 效果: step1: package com.example.iosdialogdemo;import android.os.Bundle; import android.os.Handler; import android.widget.ImageView; import android.widget.TextView;import androidx.appcompat.ap…

使用onnxruntime-web 运行yolov8-nano推理

ONNX(Open Neural Network Exchange)模型具有以下两个特点促成了我们可以使用onnxruntime-web 直接在web端上运行推理模型,为了让这个推理更直观,我选择了试验下yolov8 识别预览图片: 1. 跨平台兼容性 ONNX 是一种开…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗?上传一张人物图片和衣服的图片,就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址:https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考: 一键AI换衣-可图AI试衣 https://www.jinsh…

【elkb】创建用户和角色

在使用中我们不能把超管的用户信息给到所有者,我们需要为不用的使用场景创建不同的用户。 登录管理员用户 打开管理页面 创建角色 点击角色,创建角色 填写角色信息 设置Kibana 权限 最后点击创建角色 创建用户 点击用户--->创建用户 填写信息 登录…

LeetCode --- 421周赛

题目列表 3334. 数组的最大因子得分 3335. 字符串转换后的长度 I 3336. 最大公约数相等的子序列数量 3337. 字符串转换后的长度 II 一、数组的最大因子得分 数据范围足够小,可以用暴力枚举移除的数字,得到答案,时间复杂度为O(n^2)&#…

《Java核心技术 卷I》第4章 对象与类

第4章 对象与类 面向对象程序设计(Object-Oriented Programming,OOP)。 实现一个简单的Web浏览器可能2000个过程,采用面向对象设计风格大约100个类,每个类平均包含20个方法。 类 类(class)是构造对象的模板或蓝图,我们可以将类…

【JavaScript】axios 二次封装拦截器(接口、实例、全局)

学习 coderwhy 老师结合 ts 二次封装 axios 目录结构 config config\index.ts // export const BASE_URL "http://codercba.com:9002"; export const TIME_OUT 10000;// 1. 根据环境变量区分接口地址 // let BASE_URL: string; // if (process.env.NODE_ENV &qu…

c++:vector模拟实现

一、vector成员变量 库里实现用的就是这三个成员变量&#xff0c;咱们实现跟库里一样&#xff0c; namespace myvector {template<class T>class vector{public://vecttor的迭代器是原生指针typedef T* iterator;typedef const T* const_iterator; private:iterator _sta…