String类介绍

news2025/1/20 3:46:13

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一.String类的简单解释
  • 二.String类的方法介绍
    • 2.1 字符串的声明
    • 2.2 字符串的比较
      • 第一种比较方法
      • 第二种的比较方式
      • 第三种比较方式
      • 第四种比较的方式
    • 2.3字符串的查找。
    • 2.4 字符串的转换
      • 数值和字符串转化
      • 大小写转换
      • 字符串转数组
    • 2.5字符串替换
    • 2.6 字符串拆分
    • 2.7 字符串截取
  • 三.字符串的重头戏
    • 3.1 字符串的不可变性
    • 3.2 StringBuilder和StringBuffer


前言

熬到这儿,我们总算熬出头了,这篇文章就打算带大家认识一下java中的String的字符串。以及它有的一些操作。因为我们字符串的应用十分广泛,因此java专门提供了,这个String类。我们接下来就会针对这个类进行说明。


一.String类的简单解释

如大家所想,一个类嘛,归根究底就是会有构造方法和具体方法的,让我们看看String这个类会有些什么不一样的东西呢?
我们先来看看String类的构造方法,是不是大概能看懂,大概能懂就行,不需要全懂。
在这里插入图片描述

再来看看String类下的具体方法,你看看这么方法,全部都供你使用,别急,这些方法全都是你的,都不会跑,哈哈,也别烦恼,你用的多了,就自然而然就对这个些方法熟练了。
在这里插入图片描述
说完了一个类的方法,我们就要看看,我们一个类的属性了。
在这里插入图片描述
根据上面的这个String类的属性来说,我们大概就知道,我们一个字符串大概由俩部分组成的,一个是char 类型的数组和hash 的这个值,咱们就是说,我们先不用不知道这个东西是什么,只需要知道String内部的构造就是这样的,你如果不信的话,我们可以用程序去看一下,一个String类的内部究竟存储了什么。

String s1="HelloWorld";
在这里插入图片描述

看完以上这些,你大概对String的类,有了大概的印象,我们下面就对字符串的一些方法做一些详细的解释。


二.String类的方法介绍

这个阶段,我会针对字符串一些常用的操作,去介绍,但并不完全完整,这点需要我们共同去学习和熟练的掌握,要是小伙伴们。发现了一些新的方法,一定要告诉我哦。


2.1 字符串的声明

这主要是去使用一个字符串,这里介绍三种,当然主要的也就这三种。

 public static void main(String[] args){
	//第一种,直接去声明
	String s1="helloworld";
	//第二种,声明一个对象
	String s2=new String("helloworld");
	//第三种,根据字符数组,生成字符串
	char[] array = {'h','e','l','l','o','w','o','r','l','d'};
	String s3=new String(array);
}

2.2 字符串的比较

这可是字符串拿手好戏,毕竟字符串比较的话,我们也经常使用字符串比较的方法,我这里注意介绍

第一种比较方法

我们不采取字符串常量去用 == 等号
我们直接使用 == 比较,代码如下:

    public static void main(String[] args) {
        
        String s3=new String("helloworld");
        String s4 =new String("helloworld");
        System.out.println(s3==s4);
    }

这里的运行结果是FALSE,简单来说来说,比较的类型是引用类型变量,我们直接用等号进行比较,比较的是指向的对象,俩个不同的对象,当然就是不相同的。

在这里插入图片描述

第二种的比较方式

   public static void main(String[] args) {
        String s1="helloworld";
        String s2="helloworld";
        String s3=new String("helloworld");
        String s4 =new String("helloworld");
        System.out.println(s3.equals(s4));

    }

这里我们调用了string类的equals方法,我们比较的其实是字符串内容是否相等,显然s3和s4的字符串内容是相等的。下面再给大家看一下,equals方法的内容,你看了之后,就知道里面的内容是怎么比较的了。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

第三种比较方式

前面两种都是在比较相不相等,我们接下来介绍的这种,单纯比较字符串的大小
conpareTo方法,代码如下:

    public static void main(String[] args) {
        String s1="hello";
        String s2="helloworld";
        System.out.println(s1.compareTo(s2));
        //打印出来是一个负数。

    }
}

下面是compareTo的具体方法,让我们看看是怎么进行比较的,具体的比较规则,就是拿出来一个一个的进行比较,不相等返回一个负数,相等返回一个0

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

第四种比较的方式

这种方式跟第三种一样,就是比较字符串的大小,但是这种方法不会区分大小写,看看那个比较大。

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("abcdef");
System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

2.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
public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3)); // 'b'
System.out.println(s.indexOf('c')); // 6
System.out.println(s.indexOf('c', 10)); // 15
System.out.println(s.indexOf("bbb")); // 3
System.out.println(s.indexOf("bbb", 10)); // 12
System.out.println(s.lastIndexOf('c')); // 17
System.out.println(s.lastIndexOf('c', 10)); // 8
System.out.println(s.lastIndexOf("bbb")); // 12
System.out.println(s.lastIndexOf("bbb", 10)); // 3
}

2.4 字符串的转换

数值和字符串转化

public static void main(String[] args) {
// 数字转字符串
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
String s4 = String.valueOf(new Student("Hanmeimei", 18));
System.out.println(s1);
System.out.println(s2);
//字符串转数字
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);
System.out.println(data2);

大小写转换

public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());
}

字符串转数组

public static void main(String[] args) {
String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
// 数组转字符串
String s2 = new String(ch);
System.out.println(s2);
}

2.5字符串替换

方法内容
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));

2.6 字符串拆分

方法内容
String[] split(String regex)将字符串全部拆分
String[] split(String regex, int limit)将字符串以指定的格式,拆分为limit组

代码示例: 实现字符串的拆分处理

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}

代码示例: 字符串的部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}

2.7 字符串截取

方法内容
String substring(int beginIndex从指定索引截取到结尾
String substring(int beginIndex, int endIndex)截取部分内容
代码示例
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));

三.字符串的重头戏

3.1 字符串的不可变性

这里要说的第一个重点,就是字符串的不可变性,字符串是不可修改的,我们针对String类的所有操作,都会返回一个新的字符串类。为什么这么说呢?你看我下面代码执行所产生的结果。
在这里插入图片描述
这里就直接说明了,在对字符串进行修改的时候,我们最终会返回一个新的对象。


我们在探讨字符串的不可变性之后,我们来思考为什么不可变,当然还是挺简单的,看一下string体的属性你就知道了
在这里插入图片描述
看到私有属性了吗,但仔细去类体里面去寻找,发现并没有提供value的set和get方法,就导致了,外部根本就无法访问,所以说这才是String类的不可变的原因。大家可要记好了。


3.2 StringBuilder和StringBuffer

当然了这里纯属是字符串的小插曲,由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。

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

StringBuffer的话,目前来说,是比StringBuilder更安全,大家先这么记着,毕竟还没学习线程。

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

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

相关文章

架构师必读 —— 逻辑模型(12)

头脑风暴的5项原则 为了得出更好的想法&#xff0c;进行发散思维是很重要的&#xff0c;巧妙地运 用头脑风暴来尽情地发散吧&#xff01;头脑风暴的秘诀就是自由想象。如果因为害怕被骂而怯于表达自己的想法&#xff0c;或者不好意思在人前发言&#xff0c;好不容易想到的点子也…

6.npm

目录 1 下载包 2 下载包非最新的版本 3 package.json 4 一次安装多个包 5 删除 node_modules 6 一次安装项目中的所有包 7 卸载包 8 将包放入devDependencies中 9 换源 9.1 手动换源 9.2 工具换源 10 全局下载 10.1 下载与卸载 10.2 一些常用的全局…

QUIC协议

一 简介 QUIC(Quick UDP Internet Connection)是Google提出的一个基于UDP的传输协议&#xff0c;因其高效的传输效率和多路并发的能力&#xff0c;已经成为下一代互联网协议HTTP/3的底层传输协议。除了应用于Web领域&#xff0c;它的优势同样适用于一些通用的需要低延迟、高吞…

Android入门第53天-在Android手机里使用SQLite内嵌式数据库

介绍 Android内带SQLite内嵌式数据库了。这对于我们存储一些更复杂的结构化数据带来了极大的便利。比如说我们要存储应用内的常用联系人&#xff0c;购物车暂存信息&#xff0c;常量。必竟从xml或者是json里取数据都没有一条Select语句来得简单。 SQLite常用有五种数据类型: …

第04讲:Redis消息的发布和订阅

一、什么是消息的发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Tip&#xff1a;Redis 客户端&#xff08;redis-cli&#xff09;可以订阅任意数量的频道。 二、Redis的发布和订阅的原理 客…

ssh端口转发

ssh端口转发ssh端口转发Centos7关闭IPV6sshd服务端sshd_config配置调整(非必需)优化sshd_config配置(非必需)调整ssh客户端配置~/.ssh/config ---必须ssh终端转发socks5端口ssh终端命令行转发到socks5ssh_config配置端口转发SOCKS5使用ssh将后端的服务端口转发到localssh端口转…

selenium网络爬虫去哪儿机票利用performance获取日志截获加载的xhr,ajax,js等数据

这次练习获取的网站使用了许多反爬技术&#xff1a; 1.html页面使用了css字体偏移 2.xhr加载有webdriver反爬检测 3.请求接口使用了多项加密参数以及cookie验证 4.部分js代码用了ob混淆 一开始只是想学习练手一下css偏移学习后是解决了&#xff0c;但想获取页面源代码时候遇…

Apache Traffic Server 存在拒绝服务漏洞

漏洞描述 Apache Traffic Serve&#xff08;ATS&#xff09; 是一个开源的 HTTP/1.1 和 HTTP/2 缓存代理服务器&#xff0c;uri_signing 是 ATS 的一款 URI 签名插件&#xff0c;用来阻止所有不具有有效 JWT 的请求。 Apache Traffic Server 的受影响版本中存在拒绝服务漏洞&…

人工神经网络 ANN 基础概念

目录 一&#xff1a;简介 二&#xff1a;感知器 三&#xff1a;权重和阈值 四&#xff1a;多层前馈网络 五&#xff1a;BP神经网络 一&#xff1a;简介 机器学习是实现人工智能的方法&#xff0c;深度学习是实现机器学习的技术。在实现人工智能时需要人工辅助(半自动)&…

图像分类:Pytorch图像分类之--LetNet模型

文章目录前言LetNet简介程序的实现model.py的实现LetNet模型操作流程经过Conv卷积后输出尺寸的计算公式如下Conv2d()函数介绍MaxPool2d&#xff08;&#xff09;函数介绍Tensor的展平&#xff1a;view()train.py导入数据集加载数据集参数设置训练数据保存模型train_tool.pypred…

前端基础(十四)_隐藏元素的方法

隐藏元素的方法 1、display 通过display:none来控制元素隐藏 不使用&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

以数据驱动的自动驾驶时代,还有多远?丨曼孚科技

自动驾驶即将来到数据驱动时代。 在经历了硬件(激光雷达)、软件(多传感器融合)等技术革新后&#xff0c;自动驾驶迎来了第三波浪潮。 去年&#xff0c;除造车新势力外&#xff0c;国内一批主机厂吉利、上汽、广汽等&#xff0c;纷纷加大了自动驾驶数据标注业务投入。到今年&a…

参加 Spartacus 开源项目开发时需要注意的一些编程规范

我们使用 NgRx 存储来管理 Spartacus 功能中的全局应用程序状态。 使用 NgRx 在性能、更好的可测试性和易于故障排除、方面具有明显的优势。 除非有令人信服的理由不这样做&#xff0c;否则在某项 feature 的开发里&#xff0c;请总是使用 Rgrx 来管理状态。 使用 Store 并不…

PS CS6视频剪辑基本技巧(二)视频剪接和添加图片

上一讲&#xff0c;介绍了PS CS6可以实现视频剪接、添加图片、添加声音、添加字幕、添加logo、添加动画等6种功能&#xff0c;今天这讲介绍一下视频剪接和添加图片这两个功能。 目录 一、基本操作 1、打开时间轴窗口 2、创建时间轴 二、视频剪接 1、打开已存在的视频文件…

c++visualStudio学习笔记

文章目录5 c如何工作5.1include5.2main5.3 <<5.3 linker链接器7 C链接器linker是如何工作的7.1案例10 头函数10.1案例10.2头文件10.3pragma once34const34.1 常数34.2指针34.3类和方法34.4引用34.5mutable5 c如何工作 源文件就是文本文件转化到可执行的二进制文件或者程…

MySQL自增主键一定是连续的吗

测试环境&#xff1a; MySQL版本&#xff1a;8.0 数据库表&#xff1a;T &#xff08;主键id&#xff0c;唯一索引c&#xff0c;普通字段d&#xff09; 如果你的业务设计依赖于自增主键的连续性&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错…

一个大二计算机学生的学期总结(2022末年)

学期总结前言一、本学期的自我反思&#xff08;1&#xff09;返校之前在家期间练习题黑马头条教学管理平台Ajax练习仿写JD&#xff08;2&#xff09;返校之后在学校期间练习题本学期课程hbase、hive、Hadoop一直奉行的话前言 ☀️东流逝水&#xff0c;叶落纷纷&#xff0c;荏苒…

初级程序员 中级程序员 高级程序员级别划分

网络上众说纷纭&#xff0c;大都站立在对某一技术的知识掌握量上来界定&#xff0c;或者有些人说着说着&#xff0c;发现无法自圆其说&#xff0c;然后就说这三种人就是一种叫法&#xff0c;你觉得你是高级你就高级了&#xff0c;从概念上讲&#xff0c;这三者之间必然有质的区…

20221221查看RK3588开发板的LCD屏幕的分辨率(1536x2048)

20221221查看RK3588开发板的LCD屏幕的分辨率 2022/12/21 18:46 方法一&#xff1a;adb/串口 console:/ $ console:/ $ [ 37.217258][ T57] vbus5v0_typec: disabling [ 37.217707][ T57] vcc3v3_pcie20: disabling console:/ $ console:/ $ console:/ $ dumpsys wi…

我国输配电及控制设备行业现状及竞争分析 营收及企业规模整体增长

根据观研报告网发布的《中国输配电设备行业发展趋势研究与未来投资分析报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;输配电及控制设备主要应用于电力系统和下游用电企业的电能传输和电能控制等&#xff0c;直接影响电网的建设、安全与可靠运行&#xff0c;输配电…