初始Java篇(JavaSE基础语法)(8)认识String类(上)

news2024/9/22 5:41:56

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏:JavaSE

简单介绍:在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。

常用操作String的方法

字符串构造

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

方式一:直接赋值。

String s1 = "Hello";

方式二:使用创建对象的方法。

 String s2 = new String("Hello");

方式三:在方法二的基础上,传入字符数组作为参数。 

char[] ch = {'H','e','l','l','o'};
String s3 = new String(ch);

示例: 

上面三种构造情况,用专业术语总结就是:使用常量串构造,new Sting对象,使用字符数组进行构造。

注意:

1. 我们在前面简单学习了一下String类,它是一个引用数据类型,内部存储的是一个地址,而不是字符串本身。

2. String类的字符串常量是储存在一个名为value的字符数组中的。

3. Java中" "(双引号)里的内容都被认作是String类型对象。简单理解就是字符串。

String对象的比较

下面我们就来深入理解为什么==比较的不是String对象的内容?

public class Test {
    public static void main(String[] args) {
        String s1 = new String("Hello");
        String s2 = new String("Hello");
    }
}

因为数组也是对象,因此也是在堆区中的。只不过为了更好的观察,我就写了两个堆区,实际上只有一个堆区。 

当然,我们也可以通过调试来观察。

 那么要怎么比较呢?其实我们在多态的学习时,已经初步的学习过了。

equals方法——比较对象的内容

equals方法比较的对象里面的内容是啥?比如,我们刚刚写的s1与s2,这两个引用的对象是不一样的,但是这两个引用的对象的内容却是一样的,都是Hello。

注意:

String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较 :

1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回true。也就是上面的s1与s2所引用的对象。

2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false。

3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false。

4. 按照字典序,从前往后逐个字符进行比较,如果是就返回true,否则就返回false。

注意:

如果上面我们在比较的字符串引用是直接赋值创建的,那么使用==比较的最终结果就是true。

这里就会有小伙伴疑惑这是为啥呢?难道这两个引用所指向的对象是一样的?没错,这两个引用所指向的对象就是一个对象。

在Java中,字符串字面量(例如 "Hello")是存储在字符串常量池中。当你使用 String s1 = "Hello";

和 String s1 = "Hello"; 这种方式声明字符串时,实际上s1和s2都指向了常量池中同一个"Hello"实例。因此,使用 s1 == s2 比较时,结果都是 true,因为它们引用的是同一个对象。

然而,当你使用 String s1 = new String("Hello"); 方式创建字符串时,会创建一个新的字符串对象,即使内容相同,这个新对象也会在堆上分配独立的内存空间,而不是从字符串常量池中获取。所以,String s1 = new String("Hello"); 和 String s1 = new String("Hello"); 分别创建了两个不同的字符串对象,尽管它们的内容都是 "Hello",但它们在内存中的地址不同。因此,使用 s1 == s2 比较时结果为 false,因为它们指向不同的对象实例。但是,如果你使用 s1.equals(s2) 方法进行比较,结果会是 true,因为 equals 方法比较的是对象的内容,而不是它们的引用。

compareTo——比较的是字符串大小

compareTo和C语言中的strcmp函数的功能是相似的。都是比较字符串的大小。既然是比较大小,那么返回的就是一个 int 类型的值。

比较规则:

1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值。

2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值(与strcmp的差异)

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = new String("ac");
        String s3 = new String("abc");
        String s4 = new String("abg");
        
        //长度不同,返回的结果就是长度的差值
        System.out.println(s1.compareTo(s2));
        //长度一样,返回的就是一个一个的结果(都一样,返回0)
        System.out.println(s1.compareTo(s3));
        //长度一样,返回的就是一个一个的结果(c和g不同,返回的就是c-g的值)
        System.out.println(s1.compareTo(s4));
    }
}

compareToIgnoreCase——忽略大小写的比较

和compareTo的比较方法一样,但是是忽略大小写的比较

字符串查找 

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

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

示例:

public class Test {
    public static void main(String[] args) {
        String s = "aaabbbcccaaabbbccc";
        System.out.println(s.charAt(3));//获取下标为3位置的字符
        System.out.println(s.indexOf(97));//返回ASCII码值为97的字符在s中第一次出现的位置
        System.out.println(s.indexOf(97,5));//从下标为5的位置的开始找
        System.out.println(s.indexOf("cc"));//返回的是"cc"在s1中第一次出现的位置
        //而带有last前缀的,则是从字符串的末尾开始寻找
    }
}

注意:

1. 字符串是的下标是从0开始的和数组是一致的。 

2. 上述方法都是实例方法,也就是我们得先创建一个类的实例对象才行。

字符串的转化

数值和字符串转化

valueOf方法  

从上面,我们可以看出来:String有很多重载的 valueOf 方法。

既然数值可以转换为字符串,那么字符串也可以转换位数值。

parse+包装类 

整数变成字符串还有一种方法:整数+字符串——>字符串。

下面我们就来看看一个神奇的代码:

public class Test {
    public static void main(String[] args) {
        //前面是简单的数字运算,但是后面加了字符串,因此结果就变成了一个字符串
        System.out.println(99+1+" Hello");
        //前面是字符串,虽然后面是数字相加,但是按照执行顺序的话是就是字符串加数字,因此最终的结果就是把数字加到了字符串后面
        System.out.println("Hello "+99+1);
        //这里加了括号,改变了执行顺序,是先执行数字运算,再和字符串相加
        System.out.println("Hello "+(99+1));
    }
} 
       

因此,这个方法虽然不够正规,但是我们也是可以了解的。 

其实,从这里我们也就可以看出来,Java当中只要知道使用一个类其中一个方法,那么其他的重载方法也就知道怎么使用了。 

大小写转换

public class Test {
    public static void main(String[] args) {
        String s = "Hello";
        System.out.println(s.toUpperCase());
        System.out.println(s.toLowerCase());
    }
}

toUpper——就是将字符串中所有字母全部变成大写。

toLower——就是把字符串中所有字母全部变成小写。

字符串转数组 

把字符串的内容转换为数组内容,并且一个一个的输出。

格式化

public class Test {
    public static void main(String[] args) {
        //因为这里变量还没有创建完,因此不适合用变量名来调用这个format方法
        //这里就两个参数,应该是按照什么样的格式,一个是传给格式的参数
        String s = String.format("%d-%d-%d",2024,5,10);
        System.out.println(s);
    }
}

字符串替换 

使用一个指定的字符串替换掉已有的字符串数据,可用的方法如下:

方法功能
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换遇到的首个符合要求内容(符合要替换的内容)

注意:由于字符串是不可变对象,替换不会修改当前字符串,而是产生一个新的字符串对象,给到我们原来的引用。 (至于过程,我们后面会学习这个)

示例:

字符串拆分

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

可用方法如下:

方法功能
String[] split(String regex)将字符串按照给的字符串全部拆分
String[] split(String regex, int limit)将字符串以给的字符串的格式,拆分为limit组

示例: 

public class Test {
    public static void main(String[] args) {
        String s = "I say Hello World";
        //根据 字符串空格 来拆分这个字符串,变成若干个子字符串,并且用数组来接收
        String[] tmp = s.split(" ");
        for (String x : tmp) {
            System.out.println(x);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        String s = "I say Hello World";
        //根据 字符串空格 来拆分这个字符串,变成两个子字符串,并且用数组来接收
        String[] tmp = s.split(" ",2);
        for (String x : tmp) {
            System.out.println(x);
        }
    }
}

上面是正常的拆分,但是还有些是不能正常来拆分的。就像下面这样

那么怎样才能正常划分呢?要加上转义字符才可以。

规则:

1. 字符串 "|"   "*"  "+"  "."  都得加上转义字符,前面加上 "\\" 。

2. 而如果是 "\\" ,那么就得写成 "\\\\" 。也就是两个 \\ 表示一个 \ ,而4个 \ 就表示两个 \ 。

3. 如果一个字符串中有多个分隔符,可以用 "|" 作为连字符.。

第二点想要表达的意思是如果原字符串中存在 \\ (有时候不存在一个 \ 的情况,例如在数字中 \ddd,这就变成了一个转义字符了,因此这时候如果我们要表述一个 \ ,就得用用两个 \\ ),而我们想要以这个来作为划分标准的话,怎么办呢?用两个 \\ ,肯定是不行的,因为这是表示一个 \ ,因此,我们就得用 \\ 表示一个 \ ,因此 \\\\ 就表示 \\ 了。

而第三点是啥意思呢?就是我们想要多个标准来划分字符串的话,那那个标准怎么写呢?如下所示:

上面这个就包含了我们上面的多种规则结合在一起。

好啦!本期 初始Java篇(JavaSE基础语法)(8)认识String类(上)的学习之旅就到此结束了!我们下一期再一起学习吧!

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

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

相关文章

Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装: cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、启动Kafaka 1.首先需要启动K…

C++ | Leetcode C++题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:int largestRectangleArea(vector<int>& heights) {int n heights.size();vector<int> left(n), right(n, n);stack<int> mono_stack;for (int i 0; i < n; i) {while (!mono_stack.em…

【漏洞复现】泛微OA E-Cology portalTsLogin文件读取漏洞

漏洞描述&#xff1a; 泛微E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology portalTsLogin存在任意文件读取漏洞&#xff0c;允许未经授权的用户读取服…

物联网到底物联了个啥?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff0c;这个听起来似乎颇具科技感和未来感的词汇&#xff0c;其实早已悄然渗透到我们生活的方方面面。从智能家居到智慧城市&#xff0c;从工业自动化到医疗健康&#xff0c;物联网技术正在以其独特的魅力改变着我们的生活方式…

博通Broadcom (VMware VCP)注册约考下载证书操作手册

博通Broadcom(VMware) CertMetrics 注册约考下载证书等操作指导手册&#xff08;发布日期&#xff1a;2024-5-11&#xff09; 目录 一、原 Mylearn 账号在新平台的激活… 1 二、在新平台查看并下载证书… 5 三、在新平台注册博通账号… 6 四、在新平台下注册考试… 10 一、原…

算法提高之字串变换

算法提高之字串变换 核心思想&#xff1a;双向广搜 双向bfs 建立两个队列 一起bfs到中间态 #include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <unordered_map>using namespace std;const int N 6;int n;…

自存 js course 工厂函数

如图 就是 像工厂一样 生产对象 对象里的函数可以写成简下

圆柱齿轮的旋向如何判断?

上期出了个题&#xff0c;给了两个内齿轮&#xff0c;请大家来判断他们的旋向&#xff0c;看到了有不少小伙伴评论给出了自己的答案&#xff0c;正确和错误差不多各半吧&#xff0c;错的占比要大一些。这期咱们就好好聊一聊这个问题。 外齿轮的旋向大家貌似判断都没什么问题&a…

2024年建筑施工特种作业人员安全生产知识试题

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 单选题&#xff08;1-10&#xff09; 1.因生产安全事故受损害的从业人员&#xff0c;除…

如何使用 WavLM音频合成模型

微软亚洲研究院与 Azure 语音组的研究员们提出了通用语音预训练模型 WavLM。通过 Denoising Masked Speech Modeling 框架&#xff08;核心思想是通过预测被掩蔽&#xff08;即遮蔽或删除&#xff09;的语音部分来训练模型&#xff0c;同时还包括去噪的过程&#xff09;&#x…

离线修复.dll,Microsoft Visual C++

在安装mysql时遇到下面的问题&#xff0c;如果是有网络的情况下微软管网下载安装就行了&#xff0c;用的服务器不允许连接互联网。 后面经过寻找&#xff0c;找到了一个修复工具&#xff0c;可一次修复所有的问题&#xff0c;特别好用分享给宝子们。 下载链接&#xff1a;http…

大屏分辨率适配插件v-scale-screen

前言&#xff1a;大屏分辨率适配繁多&#xff0c;目前我认为最简单且问题最少的的方案就是使用v-scale-screen插件&#xff0c;无需考虑单位转换&#xff0c;position定位也正常使用。 1. 效果 填充满屏幕的效果 保持宽高比的效果 2. 插件原理 原理是通过css transfom 实现…

QT+多线程TCP服务器+进阶版

针对之前的服务器&#xff0c;如果子线程工作类里面需要使用socket发送消息&#xff0c;必须要使用信号与槽的方法&#xff0c; 先发送一个信号给父进程&#xff0c;父进程调用socket发送消息&#xff08;原因是QT防止父子进程抢夺同一资源&#xff0c;因此直接规定父子进程不能…

《破碎之地》删档测试开启,射击游戏领域的超级玩家抢先体验

易采游戏网5月12日消息&#xff0c;近日网易自研的射击类游戏《破碎之地》在广州开启了删档测试&#xff0c;吸引了众多射击游戏领域的超级玩家抢先体验。这款备受期待的新版游戏在操作、攀爬、跳跃、游泳、滑翔、枪械手感等方面均有所提升&#xff0c;为玩家带来了更加流畅、真…

QT学习(2)——qt的菜单和工具栏

目录 引出qt的菜单栏工具栏菜单栏&#xff0c;工具栏状态栏&#xff0c;浮动窗口 属性设计ui编辑控件添加图片 总结 引出 QT学习&#xff08;2&#xff09;——qt的菜单和工具栏 qt的菜单栏工具栏 菜单栏&#xff0c;工具栏 1QMainWindow 1.1菜单栏最多有一个 1.1.1 QMenuBar…

新年首站 | 宝兰德教育行业信创新动力发展研讨会顺利召开

近日&#xff0c;宝兰德携手慧点数码、安超云共同举办了教育行业信创新动力发展研讨会。会议邀请了中国人民公安大学、中国戏曲学院、北京航空航天大学、北京理工大学、华北电力大学、中国矿业大学、北京服装学院、北京城市学院等数十所高校信息中心负责人、专家出席了本次会议…

【class5】建立人工智能系统(2)

【昨日内容复习】 进行监督学习时&#xff0c;第一个步骤是提取数据集的文本特征和对应的标签。 提取文本特征的具体步骤如下&#xff1a; STEP1. 构造词袋模型&#xff0c;提取数据集中的文本特征 STEP2. 使用toarray()函数&#xff0c;将X转换为一个NumPy数组&#xff0c;方…

乡村振兴与乡村环境综合整治:加强农村环境保护,开展农村环境综合整治行动,提升乡村环境质量,打造生态宜居的美丽乡村

目录 一、引言 二、乡村振兴背景下的乡村环境现状 1、乡村环境面临的挑战 2、乡村环境问题的成因 三、加强农村环境保护的重要性 1、促进乡村振兴 2、保障生态安全 3、提升居民生活质量 四、开展农村环境综合整治行动的策略 1、制定科学规划 2、加大投入力度 3、强…

树莓派、ubuntu低版本python3安装库

如果遇到树莓派中自带低版本python3&#xff0c;又不想额外去安装python3时&#xff0c;可能会遇到版本过低&#xff0c;无法安装库的情况&#xff0c;以下用我实际情况举例解决方案。 本次遇到的问题是树莓派低版本中&#xff0c;python3为3.7.3&#xff0c;需要安装numpy&am…

AI算法工程师课程学习-数学基础-高数1-微积分

机器学习数学基础学习路线&#xff1a;1.高中数学-->大学2.微积分-->3.线性代数-->4.概率论-->5.优化理论。 为尽快进入到AI算法课程的学习&#xff0c;现在高数的学习要求&#xff1a; 1.看得懂&#xff0c;知道是什么&#xff0c;能听得懂&#xff0c;能理解讲…